如何在JSP文件中运行Java 8 lambda

问题描述

这是一个具有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举例说明了设置compilerSourceVMcompilerTargetVM以允许您的*.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混合使用非常复杂,这并不是事后看来的最佳选择)