JSP文件中的Lambda表达式无法编译。

10

我尝试过stackoverflow上提到的大多数建议,但还没有找到解决方案。我遇到的错误如下所示。

An error occurred at line: 379 in the jsp file: /application-new-project_process.jsp
Lambda expressions are allowed only at source level 1.8 or above 

我正在使用 IntelliJ IDEA 2016.2,并已应用以下设置。

项目结构项目项目 SDK 设置为 1.8(java 版本“1.8.0_102”)

项目结构项目项目语言级别 设置为 8.0 - Lambdas,type annotations 等

设置构建、执行、部署编译器Java 编译器,将 项目字节码版本 设置为 1.8

设置构建、执行、部署编译器Java 编译器,将 目标字节码版本 设置为 1.8

我正在使用 Tomcat v8.0.36,并对 JSP servlets 进行了以下设置。

<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> 
        <param-name>compiler</param-name> 
        <param-value>modern</param-value> 
    </init-param> 
    <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>suppressSmap</param-name> 
        <param-value>true</param-value> 
    </init-param> 
    <load-on-startup>3</load-on-startup>
</servlet>
任何建议都将不胜感激!

Tomcat实例运行在Java8 JVM中吗? - Jim Garrison
@JimGarrison 是的,我刚刚确认了这一点。 - user5908538
它是来自服务器还是来自IntelliJ? - AxelH
2个回答

19
我使用的是 IntelliJ IDEA 2016.3.2 版本和 Tomcat apache-tomcat-8.5.8 版本,以下更改对我来说已经足够了:
1. 更改以下文件: apache-tomcat-8.5.8\conf\web.xml
2. 修改配置为:
 <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
  1. 添加以下初始参数:

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

完成。


这实际上是正确的,我的问题在于我修改了错误的servlet配置。 - user5908538
太好了,谢谢!我也在使用Eclipse Oxygen时遇到了同样的问题。你的解决方案解决了它。 - Chris Claxton
使用Spring STS 3.9.4,在“Package Explorer”中的Servers/Tomcat v8.5 Server at localhost-config/web.xml下进行了更改,并且也为我解决了问题。 - Andrew Wynham

6
对于正在使用Spring Boot和Tomcat的用户,这里有一个更新的答案。由于在Spring Boot/MVC中没有Tomcat的XML配置文件,我通过从这些Spring文档链接的代码,创建了一个自定义bean来适配基础应用程序类。修复了在IntelliJ和Gradle CLI中使用Java 8语法时在JSP中引起的问题。
如果您使用 Spring 1.x ,请添加一个EmbeddedServletContainerCustomizer bean:
@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
    return (ConfigurableEmbeddedServletContainer container) -> {
        TomcatEmbeddedServletContainerFactory tomcat = (TomcatEmbeddedServletContainerFactory) container;
        JspServlet servlet = tomcat.getJspServlet();
        Map<String, String> jspServletInitParams = servlet.getInitParameters();
        jspServletInitParams.put("compilerSourceVM", "1.8");
        jspServletInitParams.put("compilerTargetVM", "1.8");
        servlet.setInitParameters(jspServletInitParams);
    };
}

如果您使用的是 Spring 2.x,请添加一个 WebServerFactoryCustomizer bean:
@Bean
public WebServerFactoryCustomizer containerCustomizer() {
    return (WebServerFactoryCustomizer<TomcatServletWebServerFactory>) factory -> {
        Map<String, String> jspServletInitParams = factory.getInitParameters();
        jspServletInitParams.put("compilerSourceVM", "1.8");
        jspServletInitParams.put("compilerTargetVM", "1.8");
        factory.getJsp().setInitParameters(jspServletInitParams);
    };
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接