【问题标题】:JSP compilation error on jetty-9.3.3jetty-9.3.3 上的 JSP 编译错误
【发布时间】:2015-09-15 09:59:38
【问题描述】:

我有一个在嵌入式 Jetty-7.6.8 (jdk-6) 上运行的 webapp 应用程序,但由于浏览器上的 Diffe-Hellman 错误,我们决定迁移到更新版本的 Jetty。所以,我们搬到了 Jetty-9.3.3。由于 Jetty-9.x 需要 jdk-8,我也升级了 jdk。现在码头启动没有错误,但是当我尝试访问我的登录页面时,我得到一个无法编译的jsp错误。

这些是依赖项:

-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

日志/浏览器出现的错误:

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

请提供有关问题所在的任何线索或建议。 TIA

【问题讨论】:

  • 你是如何管理你的依赖的?那个清单似乎不对。如果您使用的是构建工具(maven、gradle、grails、buildr、groovy grape、sbt 或 leiningen),您会得到不同的结果。
  • 我有一个manifest.mf,其中提到了所有这些依赖项。我将我的码头嵌入式类和其他类连同这个清单一起制作了一个罐子。
  • 所有提到的构建工具也可以根据你定义的传递依赖图来管理 manifest.mf 引用(使用普通的 java 引用,或 osgi 引用,甚至 Java 9 jigsaw/module 引用)。
  • @devd,嗨,你的问题解决了吗?
  • @wawa:请查看下面我刚刚发布的解决方法。

标签: java jsp jetty embedded-jetty jetty-9


【解决方案1】:

我添加了所有这些依赖后问题就解决了:

 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

它是这样的:

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:我已经从 9.3.3 移到了 9.3.8

【讨论】:

  • 我发现 add jetty-lib/jsp replace jetty-lib/apache-jsp ,它的工作原理。
【解决方案2】:

Embedded Jetty Server 9.4.15 和 JSP 支持也有同样的问题。 解决方案很简单:https://www.eclipse.org/jetty/documentation/current/embedded-examples.html#embedded-webapp-jsp

你必须启用 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" );

【讨论】:

    【解决方案3】:

    一段时间以来,我一直遇到同样的错误。所以对于遇到同样错误的人来说,答案正是其他人指出的——依赖管理。

    如果您看到Caused by: java.lang.NullPointerException at org.apache.jasper.compiler.Validator$ValidateVisitor.<init>(Validator.java:515),这是由于 Apache Jasper 引擎未能检测/加载标签库造成的。

    换句话说,您在某处缺少 taglibs 依赖或其 API 或其实现。

    确保以下所有依赖项/JAR 都在您的 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>
    

    如果您将 WAR 隐藏到 FAT jar 中,如果依赖项的范围不同(编译与运行时),那么您将面临另一个痛苦的世界,那么依赖项的顺序很重要,否则您将开始获得相同的NullPointerException

    【讨论】:

      【解决方案4】:

      从 Jetty 8.1 升级到 9.4 时,我遇到了完全相同的问题。就我而言,这不是缺少依赖项,而是太多或冲突的依赖项。在我从类路径中删除以下工件后,问题就消失了:

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

      【讨论】:

        【解决方案5】:

        Jetty 项目维护了一个示例项目,供 JSP 在 Embedded-jetty 中使用。

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

        您需要解决的问题:

        • 使用构建工具! (这是此答案最重要的方面,仅此一项就可以解决您 3/4 的问题)
        • 修复您的依赖关系

        例子:

        [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] ------------------------------------------------------------------------
        
        • 正确设置您的 JSP 环境。

          注意:

          • 实例管理器设置
          • 温度/暂存目录
          • ContainerIncludeJarPattern
          • 容器初始化器
          • JettyJasperInitializer
          • 非系统类加载器要求
          • JasperServlet 的设置
          • DefaultServlet 的设置

        【讨论】:

        • 谢谢,但我一直在 jetty-7.6.8 中使用这个 webapp,没有任何 maven 支持。实际上,我不知道如何使用 maven。
        • 我尝试了一个简单的jsp页面,编译也失败了。我没有使用的标记库。
        • 您有很多选择,maven 只是其中之一。 (请参阅问题下方 cmets 中的选项列表)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多