¿Cómo ejecuto Java 8 lambda en archivos JSP?
Este es un proyecto Java JSP con administración de Maven y ejecutando Jetty localmente.
Tengo un problema en el que me sale este error al intentar ejecutar lambda de .jspfarchivos: Lambda expressions are allowed only at source level 1.8 or above.
Mi configuración:
- En la estructura del proyecto en Intellij IDEA, configuré Project SDK y Project language en Java 8.
- El nivel de lenguaje del módulo es 8: Lambdas, anotaciones de tipo, etc.
- Usando
<maven.compiler.source>1.8</maven.compiler.source>y<maven.compiler.target>1.8</maven.compiler.target> - La versión del código de bytes del proyecto se establece en 1.8
- Última versión de Jetty (v9.4.31.x)
- El proyecto está usando el
jetty-jspc-maven-plugincomplemento donde lo configurésourceVersionytargetVersionen 1.8 in<configuration>
¿Hay algo que me falta o Java 8 simplemente no es posible con JSP / jspc?
Respuestas
La existencia https://github.com/jetty-project/embedded-jetty-jsptiene un ejemplo de configuración de compilerSourceVMy compilerTargetVMpara permitir que sus *.jsparchivos usen funciones de Java 8, como lambda.
Básicamente, configura su 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");
Seguí adelante y agregué un lambda.jsp que usa un lambda simple dentro de un JSP para probarlo. (La mezcla de lambda con JspWriter de jsp es bastante complicada, no fue la mejor opción de ejemplo en retrospectiva)