ฉันจะรัน Java 8 lambda ในไฟล์ 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 - Lambdas ประเภทคำอธิบายประกอบเป็นต้น
  • การใช้<maven.compiler.source>1.8</maven.compiler.source>และ<maven.compiler.target>1.8</maven.compiler.target>
  • เวอร์ชัน bytecode ของโครงการถูกตั้งค่าเป็น 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ที่ใช้ lambda แบบธรรมดาภายใน JSP เพื่อพิสูจน์มัน (แลมบ์ดาผสมกับ JspWriter ของ jsp ค่อนข้างซับซ้อนมันไม่ใช่ตัวเลือกที่ดีที่สุดในการมองหลัง)