JSP compilation error on jetty-9.3.3

2019-06-25 13:32发布

问题:

I have a webapp application which was running on embedded Jetty-7.6.8 (jdk-6), but due to Diffe-Hellman error on the browser we decided to move to newer version of Jetty. So, we moved to Jetty-9.3.3. As Jetty-9.x needs jdk-8, I upgraded jdk also. Right now jetty is starting up with no error but when I try to access my login page I get an unable compile jsp error.

These are the dependencies:

-org.eclipse.jetty.apache-jsp-9.3.3.v20150827.jar
-org.mortbay.jasper.apache-el-8.0.23.M1.jar 
-org.mortbay.jasper.apache-jsp-8.0.23.M1.jar
-org.eclipse.jetty.orbit.org.eclipse.jdt.core-3.8.2.v20130121.jar
-jetty-continuation-9.3.3.v20150827.jar 
-jetty-http-9.3.3.v20150827.jar
-jetty-io-9.3.3.v20150827.jar 
-jetty-security-9.3.3.v20150827.jar
-jetty-server-9.3.3.v20150827.jar 
-jetty-servlet-9.3.3.v20150827.jar
-jetty-util-9.3.3.v20150827.jar 
-jetty-webapp-9.3.3.v20150827.jar
-jetty-xml-9.3.3.v20150827.jar
-servlet-api-3.1.jar

The error which comes on the log/browser:

HTTP ERROR 500

Problem accessing /xdadm/test.jsp. Reason:

Server Error

Caused by:

org.apache.jasper.JasperException: Unable to compile class for JSP
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:600)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:363)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:816)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1686)
at com.xcom.filter.RequestHandler.doFilter(RequestHandler.java:91)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1669)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:581)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1156)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1088)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:213)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:119)
at org.eclipse.jetty.server.Server.handle(Server.java:517)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:306)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:242)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:245)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)
at org.eclipse.jetty.io.ssl.SslConnection.onFillable(SslConnection.java:192)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:245)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)
at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:75)
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:213)
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:147)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572)
at java.lang.Thread.run(Thread.java:745)

Caused by: java.lang.NullPointerException
at org.apache.jasper.compiler.Validator$ValidateVisitor.<init>(Validator.java:515)
at org.apache.jasper.compiler.Validator.validateExDirectives(Validator.java:1853)
at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:217)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:356)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:336)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:323)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:585)
... 33 more

Please, any clue or suggestion on what's going wrong. TIA

回答1:

I had the same problem with Embedded Jetty Server 9.4.15 and JSP support. The solution is pretty simple : https://www.eclipse.org/jetty/documentation/current/embedded-examples.html#embedded-webapp-jsp

You have to enable AnnotationConfiguration :

// This webapp will use jsps and jstl. We need to enable the
// AnnotationConfiguration in order to correctly
// set up the jsp container
Configuration.ClassList classlist = Configuration.ClassList
            .setServerDefault( server );
classlist.addBefore(
            "org.eclipse.jetty.webapp.JettyWebXmlConfiguration",
            "org.eclipse.jetty.annotations.AnnotationConfiguration" );


回答2:

The problem was solved after I added all these dependencies:

 jetty-lib/apache-jsp/org.eclipse.jetty.apache-jsp-9.3.8.v20160314.jar
 jetty-lib/apache-jsp/org.mortbay.jasper.apache-jsp-8.0.27.jar
 jetty-lib/apache-jsp/org.eclipse.jdt.core.compiler.ecj-4.4.2.jar
 jetty-lib/apache-jsp/org.mortbay.jasper.apache-el-8.0.27.jar
 jetty-lib/jetty-annotations-9.3.8.v20160314.jar jetty-lib/jetty-continuation-9.3.8.v20160314.jar
 jetty-lib/jetty-http-9.3.8.v20160314.jar jetty-lib/jetty-io-9.3.8.v20160314.jar
 jetty-lib/jetty-plus-9.3.8.v20160314.jar jetty-lib/jetty-security-9.3.8.v20160314.jar
 jetty-lib/jetty-server-9.3.8.v20160314.jar jetty-lib/jetty-servlet-9.3.8.v20160314.jar
 jetty-lib/jetty-util-9.3.8.v20160314.jar jetty-lib/jetty-webapp-9.3.8.v20160314.jar
 jetty-lib/jetty-xml-9.3.8.v20160314.jar  jetty-lib/servlet-api-3.1.jar
 jetty-lib/setuid/jetty-setuid-java-1.0.3.jar

This how it looks like:

jetty-lib/
├── apache-jsp
│   |── org.eclipse.jdt.core.compiler.ecj-4.4.2.jar
│   ├── org.eclipse.jetty.apache-jsp-9.3.8.v20160314.jar
│   ├── org.mortbay.jasper.apache-el-8.0.27.jar
│   └── org.mortbay.jasper.apache-jsp-8.0.27.jar
├── jetty-annotations-9.3.8.v20160314.jar
├── jetty-continuation-9.3.8.v20160314.jar
├── jetty-http-9.3.8.v20160314.jar
├── jetty-io-9.3.8.v20160314.jar
├── jetty-plus-9.3.8.v20160314.jar
├── jetty-security-9.3.8.v20160314.jar
├── jetty-server-9.3.8.v20160314.jar
├── jetty-servlet-9.3.8.v20160314.jar
├── jetty-util-9.3.8.v20160314.jar
├── jetty-webapp-9.3.8.v20160314.jar
├── jetty-xml-9.3.8.v20160314.jar
├── servlet-api-3.1.jar
└── setuid
    ├── 32libsetuid-linux.so
    ├── jetty-setuid-java-1.0.3.jar
    └── libsetuid-linux.so

PS: I've moved to 9.3.8 from 9.3.3



回答3:

I faced exactly the same issue when upgrading from Jetty 8.1 to 9.4. In my case, it was not about missing dependencies, but too many or conflicting ones. The issue went away after I removed the following artifacts from the classpath:

  • org.mortbay.jasper.apache-jsp
  • org.mortbay.jasper.apache-el


回答4:

The Jetty Project maintains an example project for JSP use in embedded-jetty.

See: github.com/jetty-project/embedded-jetty-jsp

What you need to fix:

  • Use a Build Tool! (this is the most important aspect of this answer, this alone would have solved 3/4 of your issues)
  • Fix your dependencies

Example:

[embedded-jetty-jsp]$ mvn dependency:tree
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building embedded-jetty-jsp 1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ embedded-jetty-jsp ---
[INFO] org.eclipse.jetty.demo:embedded-jetty-jsp:jar:1-SNAPSHOT
[INFO] +- javax.servlet:javax.servlet-api:jar:3.1.0:compile
[INFO] +- org.eclipse.jetty:jetty-annotations:jar:9.3.3.v20150827:compile
[INFO] |  +- org.eclipse.jetty:jetty-plus:jar:9.3.3.v20150827:compile
[INFO] |  |  \- org.eclipse.jetty:jetty-jndi:jar:9.3.3.v20150827:compile
[INFO] |  +- javax.annotation:javax.annotation-api:jar:1.2:compile
[INFO] |  +- org.ow2.asm:asm:jar:5.0.1:compile
[INFO] |  \- org.ow2.asm:asm-commons:jar:5.0.1:compile
[INFO] |     \- org.ow2.asm:asm-tree:jar:5.0.1:compile
[INFO] +- org.eclipse.jetty:jetty-webapp:jar:9.3.3.v20150827:compile
[INFO] |  +- org.eclipse.jetty:jetty-xml:jar:9.3.3.v20150827:compile
[INFO] |  \- org.eclipse.jetty:jetty-servlet:jar:9.3.3.v20150827:compile
[INFO] |     \- org.eclipse.jetty:jetty-security:jar:9.3.3.v20150827:compile
[INFO] +- org.eclipse.jetty:apache-jsp:jar:9.3.3.v20150827:compile
[INFO] |  +- org.eclipse.jetty:jetty-util:jar:9.3.3.v20150827:compile
[INFO] |  +- org.eclipse.jetty:jetty-server:jar:9.3.3.v20150827:compile
[INFO] |  |  +- org.eclipse.jetty:jetty-http:jar:9.3.3.v20150827:compile
[INFO] |  |  \- org.eclipse.jetty:jetty-io:jar:9.3.3.v20150827:compile
[INFO] |  +- org.eclipse.jetty.toolchain:jetty-schemas:jar:3.1.M0:compile
[INFO] |  +- org.mortbay.jasper:apache-jsp:jar:8.0.23.M1:compile
[INFO] |  |  \- org.mortbay.jasper:apache-el:jar:8.0.23.M1:compile
[INFO] |  \- org.eclipse.jetty.orbit:org.eclipse.jdt.core:jar:3.8.2.v20130121:compile
[INFO] \- org.eclipse.jetty:apache-jstl:pom:9.3.3.v20150827:compile
[INFO]    +- org.apache.taglibs:taglibs-standard-spec:jar:1.2.1:compile
[INFO]    \- org.apache.taglibs:taglibs-standard-impl:jar:1.2.1:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.884 s
[INFO] Finished at: 2015-09-15T05:37:53-07:00
[INFO] Final Memory: 13M/481M
[INFO] ------------------------------------------------------------------------
  • Setup your JSP environment properly.

    Pay attention to:

    • Instance Manager Setup
    • Temp / Scratch Dir
    • ContainerIncludeJarPattern
    • Container Initializers
    • JettyJasperInitializer
    • non-System ClassLoader requirement
    • Setup of JasperServlet
    • Setup of DefaultServlet


回答5:

I have been stuck with the same error for sometime. So for anyone who comes across the same error, the answer is exactly what others pointed out - dependency management.

If you see the Caused by: java.lang.NullPointerException at org.apache.jasper.compiler.Validator$ValidateVisitor.<init>(Validator.java:515) it is caused by failure to detect/load taglibs by Apache Jasper engine.

In other words you're missing the taglibs dependency or its API or its implementation somewhere.

Make sure all the following dependencies/JARs are in your POM

    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-jsp</artifactId>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.mortbay.jasper</groupId>
        <artifactId>apache-el</artifactId>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.mortbay.jasper</groupId>
        <artifactId>apache-jsp</artifactId>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.mortbay.jasper</groupId>
        <artifactId>jasper-jsp</artifactId>
        <type>pom</type>
    </dependency>
    <dependency>
        <groupId>org.apache.taglibs</groupId>
        <artifactId>taglibs-standard-impl</artifactId>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.taglibs</groupId>
        <artifactId>taglibs-standard-spec</artifactId>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>apache-jsp</artifactId>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>apache-jstl</artifactId>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-annotations</artifactId>
        <scope>compile</scope>
    </dependency>

And if you're shading the WAR into a FAT jar, you're in for another world of pain if dependencies are scoped differently (compile vs runtime), then the order of dependencies matter or otherwise you'll start getting the same NullPointerException.