我正在打包一个 Web 应用程序存档 (.war),以便可以通过java -jar webapp.war
在主类中使用以下代码启动 Jetty 9 的嵌入式副本在 shell 中启动它:
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();
但是,当包含 JSTL taglib 声明的第一个 JSP 被编译时,我遇到了这个错误:
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...
该 JSP 的前几行如下:
<%@ 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" %>
我环顾四周(这似乎不是一个新问题)并尝试了以下解决方案:
- 精简我的依赖项并寻找冲突(目前我只依赖
jetty-server
,jetty-webapp
, andjetty-jsp
, all version9.0.4.v20130625
) - 在 webapp 的 web.xml 文件中指定一个
<taglib>
直接指向 JSTL 的显式映射(从阅读 JSP 规范中得到这个想法) - 根据此答案修改服务器类路径
- 利用 WebAppContext 的方法,例如
addServerClass
和setParentLoaderPriority
根据Jetty 的文档,使用 JSTL 应该可以正常工作,但我认为嵌入式上下文可能会改变 JSTL 的加载方式并导致其失败。
将不胜感激任何想法或建议。此设置将替换旧设置,该设置在 Windows 上成功完成相同操作,但由于包含导致此错误的旧依赖项而在 Linux 上无法运行。不幸的是,我无法找到不引入上述 JSTL URI 堆栈跟踪的依赖项(groupId org.mortbay.jetty
artifactId jsp-2.1-glassfish
version )的快速替换。2.1.v20100127
更新:我找到了一个次优的解决方案。受此线程启发,降级到 Jetty 7现在让我启动并运行。这是个好消息,但令人沮丧的是,如果我以后需要 Jetty 8 或 Jetty 9 独有的任何功能,我将不得不放弃这个部署基础设施。对 Jetty 9 中 JSTL taglib 问题的任何见解仍将不胜感激。