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

8 java jsp tomcat java-8 tomcat8

我已经尝试了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 
Run Code Online (Sandbox Code Playgroud)

我正在使用IntelliJ IDEA 2016.2并已应用这些设置.

Project StructureProject,Project SDK1.8 (java version "1.8.0_102")

Project StructureProject,Project Language Level8.0 - Lambdas, type annotations etc.

Settings→交通Build, Execution, Deployment→交通Compiler→交通Java Compiler,Project bytecode version1.8

Settings→交通Build, Execution, Deployment→交通Compiler→交通Java Compiler,Target bytecode version1.8

我正在使用Tomcat v8.0.36并为JSP servlet提供以下内容.

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

任何建议将不胜感激!

Ale*_*nka 16

我使用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参数:

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

完.


小智 6

针对使用 Spring Boot 和 Tomcat 的用户的更新答案。由于 Spring Boot/MVC 中没有 Tomcat 的 XML 配置文件,我改编了从这些 spring 文档链接的代码,以在我的基本应用程序类中创建一个定制器 bean。修复了在 IntelliJ 和 Gradle CLI 的 JSP 中使用 Java 8 语法引起的问题。

如果您使用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);
    };
}
Run Code Online (Sandbox Code Playgroud)

如果您使用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);
    };
}
Run Code Online (Sandbox Code Playgroud)