Embedded Jetty не может загрузить теги JSP, когда classpath указан в jar - PullRequest
2 голосов
/ 16 мая 2011

Я столкнулся с проблемой, которая, похоже, не решается подобными вопросами.

У меня есть приложение, которое встраивает Jetty, используя SpringMVC, JSP и библиотеки тегов.Я использую плагин maven для генерации jar, объединяю все зависимые jar в каталог и создаю манифест.

Когда я запускаю приложение, используя jar (например, java -jar app.jar), все работает нормальнопока я не попытаюсь загрузить JSP, который задает <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> или любой другой taglib по этому вопросу.

Если я запускаю java и указываю classpath в командной строке и явно называю свой основной класс, все это работает.Я убедился, что путь к классам внутри моего приложения jar MANIFEST.MF указан правильно.

До сих пор я придумал 2 обходных пути, которых я бы предпочел избежать.Пусть мой скрипт запуска сгенерирует classpath и поместит его в командную строку.Или извлеките файлы .tld из пакета Jetty jsp-api и сделайте их доступными как обычные файлы, что позволяет мне указывать их как метки.

Насколько я понимаю, Джаспер должен разорвать все Джарclasspath ищет файлы tld?При указании jar-файлов в командной строке как части пути к классу это работает, но когда путь к классу указан в jar-файле моего приложения, это не удается.

Ответы [ 2 ]

3 голосов
/ 18 мая 2011

Нашел решение. Оказывается, при встраивании Jetty, а не при его использовании для загрузки веб-приложения, некоторые вещи просто не работают в качестве не стандартного соглашения. Извлечение файлов tld в src / main / resources / META-INF / tld позволило найти их во время выполнения, когда путь к классу указан в jar.

1 голос
/ 16 мая 2011

Я не уверен насчет специфики Jetty и того, как он должен работать, но обычно должно быть достаточно, чтобы просто поместить JAR-файл JSTL в папку /WEB-INF/lib веб-приложения. Это там?

Обычный сервлет-контейнер не сканирует ни переменную окружения %CLASSPATH%, ни запись Class-Path ни в одном из JAR-файлов для поиска зависимых от веб-приложений зависимостей. Вместо этого он просто загрузит все файлы JAR в /WEB-INF/lib в соответствии со спецификацией сервлета.

Переменная окружения %CLASSPATH% по умолчанию только используется при выполнении команды java или javac без -cp, -classpath и -jar аргументы. Запись Class-Path в JAR - только , используемая при выполнении рассматриваемого JAR с использованием аргумента -jar. Но веб-приложение само по себе не выполняется java -jar. Он загружается и выполняется самим сервлет-контейнером в соответствии со спецификацией сервлета.

...