我正在尝试在字符串功能上使用新的Java 7开关。
但是Tomcat没有合作。
我确保tomcat在java 7下运行,但它似乎没有在它下面进行编译。
我已将以下内容添加到jsp servlet条目下的web.xml文件中
<init-param>
<param-name>compiler</param-name>
<param-value>C:/Program Files/Java/jdk1.7.0/bin/javac.exe</param-value>
</init-param>
但它似乎没有做到这一点。
任何提示将不胜感激。
我们正在运行Tomcat 6并遇到了同样的问题。我们的解决方案是:
tomcat/lib/ecj-3.3.1.jar
替换ecj-3.7.2.jar
(可以从最新的Tomcat 7版本中获取);tomcat/conf/web.xml
...
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<init-param> <!-- this should be added -->
<param-name>compilerSourceVM</param-name>
<param-value>1.7</param-value>
</init-param>
<init-param>
<param-name>compilerTargetVM</param-name>
<param-value>1.7</param-value>
</init-param> <!-- last added line -->
<load-on-startup>3</load-on-startup>
</servlet>
当然,更简单的替代方法是安装Tomcat 7,但这可能不适合所有人。
你在这里混合了什么。您希望JSP使用Java 7进行编译,而不是使用Java 7运行tomcat.Tomcat使用的是尚未支持Java 7的Eclipse Java编译器。
编辑:我做了一些挖掘。正如您所见,here使用了内置的Eclipse编译器。与Tomcat 7.0.19一起发布的编译器是ECJ 3.7,它将支持Java 7而不是3.7.1之前的版本。
根据使用的Tomcat版本,tomcat提供的JSP引擎使用特定的Java默认版本来编译和运行JSP。
Tomcat 7使用1.6版本
compilerSourceVM - 与哪些JDK版本的源文件兼容? (默认值:1.6)
compilerTargetVM - 生成的文件与哪些JDK版本兼容? (默认值:1.6)
Tomcat 8使用1.7版本
compilerSourceVM - 与哪些JDK版本的源文件兼容? (默认值:1.7)
compilerTargetVM - 生成的文件与哪些JDK版本兼容? (默认值:1.7)
Tomcat 9使用1.8版本
compilerSourceVM - 与哪些JDK版本的源文件兼容? (默认值:1.8)
compilerTargetVM - 生成的文件与哪些JDK版本兼容? (默认值:1.8)
当然,如果默认值与您的要求不匹配,您可以更改使用的版本。
您可以通过修改全局org.apache.jasper.servlet.JspServlet
中声明的$CATALINA_BASE/conf/web.xml
servlet的init参数来实现。
例如,tomcat 8发行版的web.xml
以这种方式定义了JspServlet:
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
...
例如,要将1.8
版本指定为JSP文件的源和目标,您应该以这种方式更改它:
...
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<!-- added params -->
<init-param>
<param-name>compilerSourceVM</param-name>
<param-value>1.8</param-value>
</init-param>
<init-param>
<param-name>compilerTargetVM</param-name>
<param-value>1.8</param-value>
</init-param>
<!-- end added params -->
<load-on-startup>3</load-on-startup>
</servlet>
...
我们使用jdk8和tomcat6遇到了同样的问题。将值为1.8的compilerSourceVM
和compilerTargetVM
添加到conf / web.xml仍然无法在代码切换为字符串或lambda表达式时编译jsp。但是,从默认的lib替换ecj-4.3.1.jar与带有ecj-4.6.1.jar的tomcat 6.0.53(可以在maven存储库中找到),jsp将能够成功编译。
$ file ./work/Catalina/localhost/_/org/apache/jsp/test1_jsp.class
./work/Catalina/localhost/_/org/apache/jsp/test1_jsp.class: compiled Java class data, version 52.0 (Java 1.8)
希望这有助于任何坚持升级到jdk8 for tomcat6的人。
你有没有尝试将compilerSourceVM设置为1.7或7? (我担心我不能声称知道这是否有效)