Como executo Java 8 lambda em arquivos JSP
Este é um projeto Java JSP com gerenciamento Maven e executando Jetty localmente.
Eu tenho um problema onde eu recebo este erro ao tentar executar lambda em .jspfarquivos: Lambda expressions are allowed only at source level 1.8 or above.
Minha configuração:
- Na estrutura do projeto no Intellij IDEA, configurei o SDK do projeto e a linguagem do projeto para Java 8.
- O nível de linguagem do módulo é 8 - Lambdas, digite anotações etc.
- Usando
<maven.compiler.source>1.8</maven.compiler.source>e<maven.compiler.target>1.8</maven.compiler.target> - A versão do bytecode do projeto está definida para 1.8
- Versão mais recente do Jetty (v9.4.31.x)
- O projeto está usando o
jetty-jspc-maven-pluginplugin onde eu definisourceVersionetargetVersionpara 1.8 em<configuration>
Há algo que estou perdendo ou o Java 8 simplesmente não é possível com JSP / jspc
Respostas
O existente https://github.com/jetty-project/embedded-jetty-jsptem um exemplo de configuração do compilerSourceVMe compilerTargetVMpara permitir que seus *.jsparquivos usem recursos Java 8, como o lambda.
Basicamente, você configura seu 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");
Eu fui em frente e adicionei um lambda.jsp que usa um lambda simples dentro de um JSP para provar isso. (lambda's misturado com JspWriter de jsp é bastante complicado, não era a melhor escolha de exemplo em retrospectiva)