【问题标题】:Jetty 9 (emedded) JSP compilation at runtimeJetty 9(嵌入式)运行时 JSP 编译
【发布时间】:2016-07-03 14:20:57
【问题描述】:

将基于 Jetty 6 的应用程序迁移到 9.2(嵌入式)。

我无法弄清楚 JSP 在运行时是如何编译的(没有预编译)。当我使用 JDK 时,我的应用程序运行正常。但是在 JRE 中运行时它无法服务 JSP,我得到的错误是:

org.apache.jasper.JasperException: PWC6345: There is an error in invoking javac.  A full JDK (not just JRE) is required
    at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:92)
    at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:378)
    at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:119)
    at org.apache.jasper.compiler.Jsr199JavaCompiler.compile(Jsr199JavaCompiler.java:208)
    at org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:384)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:453)

这清楚地表明 Jetty 正在寻找 JRE 中显然不存在的 Java 编译器。在查看 Jetty 9.2 文档时,我读到:

By default, the Apache JSP container will look for the Eclipse Java Compiler (jdt).

我在类路径中有 jetty-jsp-jdt-2.3.3.jar,但出于某种原因,Jetty 似乎忽略了它。

所以,我的问题是 - 如何在没有 JSP 预编译并能够在 JRE 中运行的情况下设置嵌入式 Jetty。这基本上就是我在 Jetty 6 中的应用程序通过内置 jasper 编译器所做的事情。 Jetty 9.2 甚至可以吗?

【问题讨论】:

标签: jsp jetty embedded-jetty


【解决方案1】:

其实我已经找到了解决这个问题的方法:

System.setProperty("org.apache.jasper.compiler.disablejsr199", "true"); 

这使得带有嵌入式 Jetty 9.2 的应用程序可以在 JRE 中愉快地运行。 参考this

【讨论】:

  • 注意:该属性在 Jetty 9.3+ 中不再有效。 (Jetty 项目放弃了 Glassfish Jasper impl 并转移到没有该属性的官方 Apache Jasper)
  • @Joakim - 这是否意味着 Jetty 9.3+ 将完全依赖 JDK 来运行?
  • Jetty 9.3+ 使用 Apache Jasper 8.0,它与 jsr199 编译器(如 ECJ)和普通 JDK 一起工作得很好。我只是说系统属性 org.apache.jasper.compiler.disablejsr199 对 Apache Jasper 没有任何意义(它不再使用该系统属性)
  • 我之前的陈述有误,请阅读 janbartel 关于以下错误的评论 - github.com/eclipse/jetty.project/issues/706
  • ECJ 编译器的存在意味着您可以坚持使用 JRE 发行版。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多