ฉันจะรัน 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 ค่อนข้างซับซ้อนมันไม่ใช่ตัวเลือกที่ดีที่สุดในการมองหลัง)