Tomcat 使用 Java 8 SDK,但不会编译具有 Java 8 语言功能的 JSP。如何修复它?

wor*_*joe 5 java configuration jsp tomcat

我想我正在考虑 Tomcat 配置问题与我当前的问题。我正在为 Tomcat 8.5.8 开发 Java Servlet 和 JSP 应用程序,并已开始使用 Java 8 语言功能(特别是方法引用和流)。在我运行 jdk1.8.0_211 的本地计算机上,新代码可以正常工作,按照预期在运行时编译 JSP。

在我们的测试服务器(RH Linux)上,新的 JSP 无法编译(但应用程序的其余部分可以工作)。错误是

org.apache.jasper.JasperException: Unable to compile class for JSP: 

An error occurred at line: 135 in the jsp file: /jsp/directory/page.jsp
Method references are allowed only at source level 1.8 or above
Run Code Online (Sandbox Code Playgroud)

我自己没有设置服务器,但它运行 Java 8 的某些版本,并且具有相同的 Tomcat 版本(8.5.8),因此我怀疑某个地方有一个配置文件告诉它以较旧的语言编译 JSP等级。(证据是它知道 Method 引用是什么,但拒绝编译它;这是异常而不是错误。)

告诉 Tomcat 在较旧的语言级别编译 JSP 的配置可能隐藏在哪里?

Ben*_* R. 9

根据https://tomcat.apache.org/tomcat-8.0-doc/jasper-howto.html

实现 Jasper 的 servlet 是使用全局 $CATALINA_BASE/conf/web.xml 中的 init 参数进行配置的。

compilerSourceVM - 源文件与哪个 JDK 版本兼容?(默认值:1.7)compilerTargetVM - 生成的文件与哪个 JDK 版本兼容?(默认值:1.7)

举个例子,如果你的web.xml文件包含以下代码,它将把 JSP 编译到 1.8 语言级别:

<servlet>
    <servlet-name>jsp</servlet-name>
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>

    <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>

    <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>
Run Code Online (Sandbox Code Playgroud)

  • 我建议进行编辑,将正确配置的示例粘贴到您的答案中。 (2认同)