Une erreur bête après avoir migré de JBoss 4.0.5 à JBoss 4.2.1 GA avec une simple page JSP:
<pre>
org.apache.jasper.JasperException: Unable to compile class for JSP:
An error occurred at line: 22 in the generated java file
The method getJspApplicationContext(ServletContext) is undefined for the type JspFactory
Stacktrace:
org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:92)
org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330)
org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:415)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:308)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:286)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:273)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:566)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:311)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
com.rfs.j2ee.KiWI.util.CompressFilter.doFilter(CompressFilter.java:86)
com.rfs.wfsignon.web.SignOnFilter.doFilter(SignOnFilter.java:186)
com.rfs.j2ee.KiWI.util.EncodingFilter.doFilter(EncodingFilter.java:38)
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
</pre>
Cette erreur est toute bête: l’implémentation de la class JspFactory retournée par le classloader charge une version qui se trouve dans votre EAR ou dans votre WAR. Pour nous en effet nous avions servlet-2.3.jar à la racine de l’EAR (construit avec maven2). Bref il suffit de retirer cette archive de l’EAR et l’application fonctionnera à nouveau. Pensez aussi à retirer un éventuel j2ee.jar qui n’a rien à faire à la racine de votre EAR.
Pour exclure servlet-2.3.jar et jsp-api.jar avec Maven2 lors du packaging, ajouter dans le pom.xml qui genere l’EAR une dependency en forcant le scope à la valeur « provided« :
<pre>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</pre>
J’en profite pour vous donner l’adresse d’un article de présentation et de mise en route de Maven2 très bien écrit: sur le Blog de Jean-François Helie
English version: The JspFactory that is loaded by the Jasper is not the correct one. Check that you don’t have a JspFactory impl in your EAR or WAR/WEB-INF/lib subfolder. In Tomcat 6, the JSP API classes are found in jsp-api.jar and servlet API classes are found in servlet-api.jar, with both located in the lib directory of the Tomcat 6 installation. Any servlet.jar you find
involved with this server would contain out of date classes for this
server. Delete servlet-2.3.jar from your EAR.