Como executo Java 8 lambda em arquivos JSP

Sep 25 2020

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 defini sourceVersione targetVersionpara 1.8 em<configuration>

Há algo que estou perdendo ou o Java 8 simplesmente não é possível com JSP / jspc

Respostas

JoakimErdfelt Sep 25 2020 at 20:59

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)