Tôi đang đóng gói một ứng dụng Web Archive (.WAR) để nó có thể được bắt đầu qua java -jar webapp.war
trong một vỏ bằng cách tung ra một bản sao nhúng của Jetty 9 sử dụng mã này trong một lớp học chính:Làm thế nào để bạn có được Jetty 9 được nhúng để giải quyết thành công URI JSTL?
int port = Integer.parseInt(System.getProperty("port", "80")); // I know this has implications :)
String contextPath = System.getProperty("contextPath", "");
Server server = new Server(port);
ProtectionDomain domain = Deployer.class.getProtectionDomain();
URL location = domain.getCodeSource().getLocation();
WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/" + contextPath);
webapp.setWar(location.toExternalForm());
server.setHandler(webapp);
server.start();
server.join();
Tuy nhiên, tôi đang chạy vào lỗi này khi JSP đầu tiên chứa một tuyên bố JSTL taglib được biên soạn:
org.apache.jasper.JasperException: /WEB-INF/html/user/login.jsp(2,62) PWC6188: The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application
at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:92)
at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:378)
at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:172)
at org.apache.jasper.compiler.TagLibraryInfoImpl.generateTLDLocation(TagLibraryInfoImpl.java:431)
at org.apache.jasper.compiler.TagLibraryInfoImpl.<init>(TagLibraryInfoImpl.java:240)
at org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:502)
at org.apache.jasper.compiler.Parser.parseDirective(Parser.java:582)
at org.apache.jasper.compiler.Parser.parseElements(Parser.java:1652)
at org.apache.jasper.compiler.Parser.parse(Parser.java:185)
at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:244)
at org.apache.jasper.compiler.ParserController.parse(ParserController.java:145)
at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:212)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:451)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:625)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:492)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:378)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:698)
etc...
cặp đôi dòng đầu tiên của mà JSP như sau:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" isELIgnored="false" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
Tôi đã nhìn xung quanh khá một chút (điều này dường như không phải là một vấn đề mới) và đã thử các giải pháp sau:
- Slimming xuống phụ thuộc của tôi và tìm kiếm xung đột (hiện tại tôi chỉ phụ thuộc trên
jetty-server
,jetty-webapp
, vàjetty-jsp
, tất cả các phiên bản9.0.4.v20130625
) - Xác định một
<taglib>
lập bản đồ rõ ràng trong file web.xml của webapp trỏ đến JSTL trực tiếp (có ý tưởng này từ việc đọc spec JSP) - Sửa đổi classpath máy chủ như trên this answer
- Lợi dụng phương pháp WebAppContext như
addServerClass
vàsetParentLoaderPriority
Theo Jetty's documentation, sử dụng JSTL chỉ nên làm việc, nhưng tôi nghĩ rằng bối cảnh nhúng có thể được thay đổi cách JSTL được nạp và làm cho nó thất bại.
Sẽ đánh giá cao bất kỳ ý tưởng hoặc đề xuất nào. Thiết lập này sẽ thay thế một thiết lập cũ hơn đã làm điều tương tự thành công trên Windows nhưng không hoạt động trên Linux do sự bao gồm của một phụ thuộc cũ được đưa vào this bug. Thật không may, tôi đã không thể tìm thấy sự thay thế nhanh chóng cho sự phụ thuộc đó (groupId org.mortbay.jetty
artifactId jsp-2.1-glassfish
phiên bản 2.1.v20100127
) không giới thiệu theo dõi ngăn xếp JSTL URI được đề cập ở trên.
CẬP NHẬT: Tôi đã tìm thấy giải pháp tối ưu. Việc hạ cấp xuống Jetty 7 được lấy cảm hứng từ this thread hiện đã giúp tôi thiết lập và chạy. Đây là một tin tuyệt vời, nhưng nó không khuyến khích nếu sau này tôi yêu cầu bất kỳ chức năng nào dành riêng cho Jetty 8 hoặc Jetty 9 mà tôi phải loại bỏ cơ sở hạ tầng triển khai này. Bất kỳ thông tin chi tiết nào về vấn đề taglib JSTL trong Jetty 9 sẽ vẫn được đánh giá cao.
Giải pháp này làm việc cho Jetty 9.0 nhưng không phải 9.1 –
Ngoài ra, không gây khó khăn cho Jetty 8.1 –