【问题标题】:Lambda expressions in JSP files will not compileJSP 文件中的 Lambda 表达式不会编译
【发布时间】:2017-02-23 09:41:53
【问题描述】:

我已经尝试了 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 并已应用这些设置。

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

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

SettingsBuild, Execution, DeploymentCompilerJava Compiler, Project bytecode version1.8

SettingsBuild, Execution, DeploymentCompilerJava 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>

任何建议将不胜感激!

【问题讨论】:

  • Tomcat 实例是否在 Java8 JVM 中运行?
  • @JimGarrison 是的,我刚刚确认了这一点。
  • 是来自服务器还是来自 IntelliJ ?

标签: java jsp tomcat java-8 tomcat8


【解决方案1】:

我使用 IntelliJ IDEA 2016.3.2,tomcat apache-tomcat-8.5.8,以下更改对我来说已经足够了:
1. 修改以下文件:apache-tomcat-8.5.8\conf\web.xml
2.修改

的配置
 org.apache.jasper.servlet.JspServlet
  1. 添加以下初始化参数:


    compilerSourceVM
    1.8


    compilerTargetVM
    1.8

完成。

【讨论】:

  • 这其实是对的,我的问题是我修改了错误的servlet的配置。
  • 太好了,谢谢!我正在使用 Eclipse Oxygen 并且遇到了同样的问题。你的解决方案解决了。
  • 使用 Spring STS 3.9.4,在 Servers/Tomcat v8.5 Server at localhost-config/web.xml 下的 Package Explorer 中进行了更改,也为我解决了问题。
【解决方案2】:

为使用 Spring Boot 和 Tomcat 的用户提供的更新答案。由于 Spring Boot/MVC 中没有 Tomcat 的 XML 配置文件,因此我修改了从 these spring docs 链接的代码,以在我的基本 Application 类中创建自定义程序 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);
    };
}

如果您使用 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);
    };
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 2017-01-06
    • 1970-01-01
    相关资源
    最近更新 更多