Jak uruchomić lambdę Java 8 w plikach JSP

Sep 25 2020

To jest projekt Java JSP z zarządzaniem Maven i działającym lokalnie Jetty.

Mam problem gdzie mogę dostać ten błąd, gdy próbuje uruchomić lambda w .jspfplikach: Lambda expressions are allowed only at source level 1.8 or above.

Moja konfiguracja:

  • W strukturze projektu w Intellij IDEA ustawiłem Project SDK i język Project na Java 8.
  • Poziom języka modułu to 8 - Lambdy, adnotacje typu itp.
  • Korzystanie <maven.compiler.source>1.8</maven.compiler.source>i<maven.compiler.target>1.8</maven.compiler.target>
  • Wersja kodu bajtowego projektu jest ustawiona na 1.8
  • Najnowsza wersja Jetty (v9.4.31.x)
  • Projekt korzysta z jetty-jspc-maven-pluginwtyczki, w której ustawiłem sourceVersioni targetVersionna 1,8 cala<configuration>

Czy jest coś, czego mi brakuje, czy też Java 8 jest po prostu niemożliwa z JSP / jspc

Odpowiedzi

JoakimErdfelt Sep 25 2020 at 20:59

Istnięjące https://github.com/jetty-project/embedded-jetty-jspzawiera przykład ustawienia compilerSourceVMi compilerTargetVMzezwalania *.jspplikom na korzystanie z funkcji Java 8, takich jak lambda.

Zasadniczo konfigurujesz 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");

Poszedłem dalej i dodałem lambda.jsp, który używa prostej lambda w JSP, aby to udowodnić. (lambda zmieszane z jsp's JspWriter jest dość skomplikowane, nie był to najlepszy przykład z perspektywy czasu)