2014-02-21 37 views
2

我正在尝试使用JRE而不是JDK的jetty。我想如果我预编译的JSP,并把所产生的类文件的类路径,应该没有必要码头,试图当浏览器请求它编译JSP,但我得到加载与预编译的码头jsps仍然需要jdk?

org.apache.jasper.JasperException: PWC6345: There is an error in invoking javac. 
A full JDK (not just JRE) is required 

不管我当我从浏览器请求jsp时。

我在webdefault.xml有这些初始化参数和内置的类文件肯定是在classpath

<init-param> 
     <param-name>reloading</param-name> 
     <param-value>false</param-value> 
    </init-param> 
    <init-param> 
     <param-name>development</param-name> 
     <param-value>false</param-value> 
    </init-param> 
    <init-param> 
     <param-name>classpath</param-name> 
     <param-value>c:/project/build/classes</param-value> 
    </init-param> 

如何让码头不尝试重新编译JSP这样我就可以运行它一个jre而不是一个jdk?

+0

也许他们必须编译使用一些码头特定的东西。不同的servlet容器使用不同的方式来实现API。 http://stackoverflow.com/questions/11735628/precompile-jsps-into-classes-for-jetty8-using-ant – developerwjk

+0

以及我编译它与jetty本身使用相同的jspc类。还有什么可以不同? – stu

回答

2

在JRE上运行用于Jetty的预编译JSP之后,我发现预编译不是必需的。 Jetty(7.5.5和更高版本)附带一个编译器,当Jetty使用JRE运行时,该编译器可用于编译JSP。细节可以在此页面上找到:

https://wiki.eclipse.org/Jetty/Howto/Configure_JSP#Compiling_JSPs

总之,无论下面的代码片段添加到jetty.xml

<Call class="java.lang.System" name="setProperty"> 
    <Arg>org.apache.jasper.compiler.disablejsr199</Arg> 
    <Arg>true</Arg> 
</Call> 

或此行到start.ini

-Dorg.apache.jasper.compiler.disablejsr199=true 
+0

我最终也想到了这一点(我没有在编译器中包含org.eclipse.jdt.core-3.7.1.jar,所以花了我一段时间才搞定它。现在我遇到的问题是在android jetty上不起作用,因为即使你编译它,也没有任何东西可以将它转换为dalvik。所以再次预编译的jsps将是要走的路,但是jetty拒绝接受。 – stu

+1

我唯一能想到的在web.xml中,映射是不正确的 - 这些都是将jsps的请求发送给编译后的代码。最终,你要做的只不过是将模式映射到servlet。在web.xml中将一个端点(例如/ test)映射到由JspC创建的类,我会修改一个空的web应用程序,以消除代码中可能出现的其他问题。 – Paul