2016-07-03 115 views
1

将基于Jetty 6的应用程序迁移到9.2(嵌入式)。Jetty 9(emedded)运行时JSP编译

我无法弄清楚JSP在运行时是如何编译的(无需预编译)。当我使用JDK时,我的应用程序运行正常。但它不能成为JSP时JRE运行时,我得到的错误是:

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是寻找Java编译器,显然是不存在的JRE。展望码头9.2文档,我读了:

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

我在classpath 码头,JSP的JDT-2.3.3.jar但由于某些原因,码头似乎忽略它。

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

+0

有一个github项目演示了嵌入JSP的Jetty 9(由Jetty项目维护) - > https://github.com/jetty-project/embedded-jetty-jsp –

回答

0

其实我已经找到了解决这一简单地做:

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

这与嵌入式码头9.2运行在JRE提出申请愉快。 请参阅this以供参考。

+1

注意:该属性在Jetty中不再有效9.3+。 (Jetty项目放弃了Glassfish Jasper impl并转移到了官方的Apache Jasper,它没有该属性) –

+0

@Joakim - 这是否意味着Jetty 9.3+完全依赖于JDK运行? – Dima

+0

Jetty 9.3+使用Apache Jasper 8.0,它可以与jsr199编译器(如ECJ)一起使用,并且可以使用普通的JDK。我只是说系统属性'org.apache.jasper.compiler.disablejsr199'对Apache Jasper不再有任何意义(它不使用该系统属性) –