Une erreur bête après avoir migré de JBoss 4.0.5 à JBoss 4.2.1 GA avec une simple page JSP:

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)

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« :


    <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>


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.