Я собираю архив веб-приложений (.war), чтобы его можно было запустить через java -jar webapp.war
в оболочке, запустив встроенную копию Jetty 9 с помощью этого кода в основном классе:
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();
Однако я столкнулся с этой ошибкой, когда скомпилирован первый JSP, содержащий объявление taglib JSTL:
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
иjetty-jsp
, все версии9.0.4.v20130625
) - Указание явного сопоставления
<taglib>
в файле webapp web.xml, который указывает прямо на JSTL (получил эту идею от чтения спецификации JSP) - Изменение пути к классу сервера в соответствии с этим ответом
- Использование методов WebAppContext, таких как
addServerClass
иsetParentLoaderPriority
Согласно Документация Jetty, использование JSTL должно просто работать, но я думаю, что встроенный контекст может изменять способ загрузки JSTL и он терпит неудачу.
Поблагодарили бы за любые идеи или предложения. Эта настройка заменила бы более старую установку, которая успешно выполняла то же самое в Windows, но не работала в Linux из-за включения старой зависимости, которая привела к this ошибка. К сожалению, мне не удалось найти быструю замену этой зависимости (groupId org.mortbay.jetty
artifactId jsp-2.1-glassfish
version 2.1.v20100127
), которая не содержит упомянутую выше трассировку стека JSTL URI.
ОБНОВЛЕНИЕ: Я нашел субоптимальное решение. Теперь меня перешагнул на Jetty 7, вдохновленный этой нитью. Это отличная новость, но это обескураживает, что, если позже мне понадобится любая функциональность, исключительная для Jetty 8 или Jetty 9, мне придется отказаться от этой инфраструктуры развертывания. Любое понимание проблемы JLTL taglib в Jetty 9 все равно будет оценено.