Загрузка войны во встроенном Jetty с помощью setExtractWar(false) вызывает IllegalArgumentException

Я использую Jetty 8.1.9 в качестве API и развертываю вручную, добавляя обработчик WebAppContext на сервер.

Server server = new Server();

WebAppContext webapp = new WebAppContext();
webapp.setContextPath(CONTEXT_PATH);
webapp.setWar(WEBAPP_PATH);
webapp.setExtractWAR(false);
server.setHandler(webapp);

server.start();
server.join();

Если веб-приложение не содержит jar-файлов в WEB-INF/lib, то это работает нормально. Однако, если веб-приложение содержит банки, я получаю следующее исключение:

java.lang.IllegalArgumentException: !file: jar:file:/F:/projects/jetty-example/webapps/app.war!/WEB-INF/lib/whatever.jar
    at org.eclipse.jetty.webapp.WebAppClassLoader.addClassPath(WebAppClassLoader.java:245)

Это работает, если я установил webapp.setCopyWebInf(true);

Я что-то не так делаю, это баг, или Jetty не может загружать библиотеки напрямую из варов?

Редактировать:
Чтобы предоставить немного больше информации о моей настройке, Jetty встроен в банку с основным классом, который настраивает все, подобно start.jar. Это задумано как упрощение (фасад, если хотите) стандартного развертывания пристани. Будут использоваться только определенные военные пакеты, но, поскольку они потенциально необязательны, они являются внешними по отношению к исполняемому банку. Итак, структура каталогов выглядит примерно так:

/ baseDirectory
  | embedded-jetty.jar
  / webapps
    | myWar1.war
    | myWar2.war

person Shaun    schedule 05.03.2013    source источник
comment
Прежде чем я опубликую и отвечу, я хотел убедиться, что вы пытаетесь поместить пристань внутрь самой войны и начать все это с чего-то вроде java -jar foo.war? Если это не так, пожалуйста, объясните немного больше о вашей настройке в этом отношении.   -  person jesse mcconnell    schedule 05.03.2013
comment
Не совсем. Обновил мой вопрос, чтобы уточнить.   -  person Shaun    schedule 06.03.2013
comment
Значит, у вас войны внутри банки? если это так, просто распакуйте эти военные файлы как /webapps/myWar1 и /webapps/myWar2 внутри вашего baseDirectory.jar   -  person Joakim Erdfelt    schedule 14.03.2013
comment
На самом деле, это jar-файлы внутри стандартной войны, из-за чего Jetty WebAppClassLoader выходит из строя, если, по крайней мере, jar-файлы не извлечены из войны во время выполнения.   -  person Shaun    schedule 15.03.2013


Ответы (1)


Похоже, вам нужно установить webapp.setCopyWebInf(true); в соответствии с этой страницей на причале jira.

person ericson    schedule 08.03.2013
comment
Я наткнулся на это раньше. Кажется, в нем явно не указано, что вы не должны иметь возможность загружать .jars непосредственно из войн или почему. Тем не менее, вы можете быть правы. - person Shaun; 08.03.2013