JSP 文件中的 Lambda 表达式将无法编译
Lambda expressions in JSP files will not compile
我已经尝试了 Whosebug 上提到的大部分建议,但还没有找到解决方案。我遇到的错误如下。
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 Structure
→ Project
, Project SDK
至 1.8 (java version "1.8.0_102")
Project Structure
→ Project
, Project Language Level
至 8.0 - Lambdas, type annotations etc.
Settings
→ Build, Execution, Deployment
→ Compiler
→ Java Compiler
, Project bytecode version
到 1.8
Settings
→ Build, Execution, Deployment
→ Compiler
→ Java Compiler
, Target bytecode version
到 1.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>
如有任何建议,我们将不胜感激!
我使用的是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>
添加以下初始化参数:
<初始化参数>
compilerSourceVM
<参数值>1.8参数值>
初始化参数>
<初始参数>
compilerTargetVM
<参数值>1.8参数值>
完成。
为那些使用 Spring Boot 和 Tomcat 的人更新的答案。由于在 Spring Boot/MVC 中没有 Tomcat 的 XML 配置文件,我调整了从 these spring docs 链接的代码以在我的基础应用程序 class。修复了在 IntelliJ 和 Gradle CLI 的 JSP 中使用 Java 8 语法引起的问题。
如果你使用Spring1.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);
};
}
如果你使用Spring2.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);
};
}
我已经尝试了 Whosebug 上提到的大部分建议,但还没有找到解决方案。我遇到的错误如下。
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 Structure
→ Project
, Project SDK
至 1.8 (java version "1.8.0_102")
Project Structure
→ Project
, Project Language Level
至 8.0 - Lambdas, type annotations etc.
Settings
→ Build, Execution, Deployment
→ Compiler
→ Java Compiler
, Project bytecode version
到 1.8
Settings
→ Build, Execution, Deployment
→ Compiler
→ Java Compiler
, Target bytecode version
到 1.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>
如有任何建议,我们将不胜感激!
我使用的是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>
添加以下初始化参数:
<初始化参数>
compilerSourceVM
<参数值>1.8参数值>
初始化参数>
<初始参数>
compilerTargetVM
<参数值>1.8参数值>
完成。
为那些使用 Spring Boot 和 Tomcat 的人更新的答案。由于在 Spring Boot/MVC 中没有 Tomcat 的 XML 配置文件,我调整了从 these spring docs 链接的代码以在我的基础应用程序 class。修复了在 IntelliJ 和 Gradle CLI 的 JSP 中使用 Java 8 语法引起的问题。
如果你使用Spring1.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);
};
}
如果你使用Spring2.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);
};
}