Как запустить лямбда-выражение Java 8 в файлах JSP

Sep 25 2020

Это проект Java JSP с управлением Maven и локальным запуском Jetty.

У меня есть проблема , когда я получаю эту ошибку при попытке запустить лямбда в .jspfфайлах: Lambda expressions are allowed only at source level 1.8 or above.

Моя установка:

  • В структуре проекта в Intellij IDEA я установил Project SDK и язык проекта на Java 8.
  • Уровень языка модуля - 8 - лямбды, аннотации типов и т. Д.
  • Использование <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на 1,8 дюйма<configuration>

Есть ли что-то, что мне не хватает, или Java 8 просто невозможна с JSP / jspc

Ответы

JoakimErdfelt Sep 25 2020 at 20:59

Существующий https://github.com/jetty-project/embedded-jetty-jspесть пример настройки compilerSourceVMи, compilerTargetVMчтобы разрешить вашим *.jspфайлам использовать функции Java 8, такие как лямбда.

В основном вы настраиваете свой 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, чтобы доказать это. (лямбда, смешанная с jsp JspWriter, довольно сложна, это был не лучший выбор для примера)