Jetty 9.0 Абсолютный uri: http://java.sun.com/jsp/jstl/core не может быть разрешен
Автор вопроса: RossMcCОтветов: 3
я использую
Встроенный Jetty 9.
Мавен
Ява 1.7
JSTL
Когда я запускаю свое приложение в Eclipse и просматриваю свою веб-страницу, содержащую теги JSTL, все работает нормально. Когда я связываю его в исполняемый файл jar и запускаю из командной строки cmd, я получаю
org.apache.jasper.JasperException: /jsp/pcReport.jsp(4,62) PWC6188: Абсолютный uri: http://java.sun.com/jsp/jstl/core не может быть разрешен ни в web.xml, ни в файлах jar, развернутых с этим приложением.
У меня есть jar JSTL в WEB-INF/lib, который находится в моем пути к классам манифеста.
Я просто не могу понять, почему это работает при запуске под eclipse, но не работает при запуске из исполняемого файла jar. Я также пытался вручную добавить в путь к классам при запуске безрезультатно.
java -classpath ./jstl-1.2.jar -jar app.jar
Я пропустил что-то очевидное!?
возможный дубликат http://stackoverflow.com/questions/4928271/jstl-1-2-the-absolute-uri-http-java-sun-com-jstl-core-cannot-be-resolved Joe 18.10.2013
Надеюсь, вы просмотрели эту ссылку, wiki.eclipse.org/Jetty/Howto/Configure_JSP dipu 02.01.2014
Я столкнулся с той же проблемой, но не нашел ответа в последнее время. Мне пришлось отлаживать код Glassfish, чтобы решить эту проблему. Я надеюсь, что следующее объяснение может помочь другим.
Что касается зависимостей, для работы с JSP с помощью Glassfish вам понадобится:
Причина, по которой ваш встроенный Jetty не может загрузить ядро, даже если у вас есть jar JSLT 1.2 (вероятно, javax.servlet.jsp.jstl.jar от Glassfish), заключается в TldScanner класс в том числе в стеклянных банках для JSP. Чтобы было ясно, этот класс имеет некоторые статические элементы, такие как:
515 private void mapTldLocation(String resourcePath, TldInfo tldInfo,
516 boolean isLocal) {
517
518 String uri = tldInfo.getUri();
519 if (uri == null) {
520 return;
521 }
522
523 if ((isLocal
524 // Local tld files override the tlds in the jar files,
525 // unless it is in a system jar (except when using myfaces)
526 && mappings.get(uri) == null
527 && !systemUris.contains(uri)
528 && (!systemUrisJsf.contains(uri) || useMyFaces)
529 ) ||
530 (!isLocal
531 // Jars are scanned bottom up, so jars in WEB-INF override
532 // thos in the system (except when using myfaces)
533 && (mappings.get(uri) == null
534 || systemUris.contains(uri)
535 || (systemUrisJsf.contains(uri) && !useMyFaces)
536 )
537 )
538 ) {
...
Невозможно загрузить ваш TLD, если URL-адрес "http://java.sun.com/jsp/jstl/core" и хранится в локальном банке. Чтобы сделать его НЕ ЛОКАЛЬНЫМ, приложение должно быть загружено загрузчиком классов, родительский элемент которого содержит jar-файл JSTL. Короче говоря, вам нужно изменить код для инициализации WebAppContext примерно так:
...
WebAppContext webapp = new WebAppContext();
// classURLs may contains URL to WEB-INF/classes or WEB-INF/lib/additional_jar of you web app
URLClassLoader classLoader = new URLClassLoader(classURLs.toArray(new URL[classURLs.size()]),
Thread.currentThread().getContextClassLoader());
webapp.setClassLoader(classLoader);
...
ContextHandlerCollection contextCollection = new ContextHandlerCollection();
contextCollection.addHandler(webapp);
...
Server server = new Server(threadPool);
server.setHandler(contextCollection);
server.start();
...
Если это не поможет, я хотел бы узнать, как вы встраиваете Jetty в свое приложение.
Ответ 2 · рейтинг 2 · Joakim Erdfelt
У вас есть конфликтующий/дублирующийся артефакт для JSTL.
Упростите свои зависимости.
<dependencies>
<!-- Meta Dependency - adds JSP support to the same version of Jetty -->
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-jsp</artifactId>
<version>9.0.6.v20130930</version>
</dependency>
<!-- NOT NEEDED
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency> -->
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-webapp</artifactId>
<version>9.0.6.v20130930</version>
</dependency>
<!-- NOT NEEDED
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jsp-2.1-glassfish</artifactId>
<version>2.1.v20100127</version>
</dependency> -->
</dependency>
Как видите, мы не используем артефакт JSTL, а org.mortbay.jetty предоставил уровень поддержки jsp. Jetty предоставила мета-зависимость для извлечения артефактов для поддержки JSP в той же версии Jetty, что и ваша пристань. артефакт веб-приложения.