问题描述
这是一个具有Maven管理并在本地运行Jetty的Java JSP项目。
我遇到一个问题,尝试在.jspf
文件Lambda expressions are allowed only at source level 1.8 or above
中运行lambda时出现此错误。
我的设置:
- 在Intellij IDEA的项目结构中,我已将Project SDK和Project语言设置为Java 8。
- 模块语言级别为8-Lambda,类型注释等。
- 使用
<maven.compiler.source>1.8</maven.compiler.source>
和<maven.compiler.target>1.8</maven.compiler.target>
- 项目字节码版本设置为1.8
- 最新版本的Jetty(v9.4.31.x)
- 该项目正在使用
jetty-jspc-maven-plugin
插件,其中我已将sourceVersion
中的targetVersion
和<configuration>
设置为1.8
有什么我想念的吗?或者JSP / jspc根本无法实现Java 8
解决方法
现有的https://github.com/jetty-project/embedded-jetty-jsp举例说明了设置compilerSourceVM
和compilerTargetVM
以允许您的*.jsp
文件使用Java 8功能,例如lambda的功能。
基本上,您可以配置JettyJspServlet
// Create / Register JSP Servlet (must be named "jsp" per spec)
ServletHolder holderJsp = new ServletHolder("jsp",JettyJspServlet.class);
holderJsp.setInitOrder(0);
holderJsp.setInitParameter("logVerbosityLevel","DEBUG");
holderJsp.setInitParameter("fork","false");
holderJsp.setInitParameter("xpoweredBy","false");
holderJsp.setInitParameter("compilerTargetVM","1.8");
holderJsp.setInitParameter("compilerSourceVM","1.8");
holderJsp.setInitParameter("keepgenerated","true");
servletContextHandler.addServlet(holderJsp,"*.jsp");
我继续并添加了一个lambda.jsp,它在JSP中使用一个简单的lambda来证明这一点。 (lambda与jsp的JspWriter混合使用非常复杂,这并不是事后看来的最佳选择)