使用setExtractWar(false)在嵌入式Jetty中加载war会抛出IllegalArgumentException

时间:2013-03-05 18:09:50

标签: java jetty classloader war embedded-jetty

我正在使用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();

如果webapp在WEB-INF / lib中不包含任何jar,那么这很好用。但是,如果webapp包含jar,我会得到以下异常:

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嵌入在jar中,其中包含一个设置所有内容的主类,类似于start.jar。这旨在简化标准码头部署的简化(如果您愿意的话)。将仅使用特定的war包,但由于它们可能是可选的,因此它们位于可执行jar的外部。因此,目录结构如下所示:

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

1 个答案:

答案 0 :(得分:4)

您似乎必须根据来自jetty jira的this page设置webapp.setCopyWebInf(true);