java.lang.IllegalArgumentException:类'org.eclipse.jetty.webapp.WebAppContext'的对象不是'org.eclipse.jetty.webapp.WebAppContext'类型的对象

时间:2017-04-13 20:18:45

标签: eclipse java-ee jetty

我正在尝试为我的web项目添加额外的类路径。为此,我已关注this guide并创建了一个包含以下内容的jetty-env.xml文件

<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
    <Set name="extraClasspath">lib/ivy/</Set>     
</Configure>

并将其放在WEB-INF/文件夹中。但是,当我启动Jetty时,我得到以下异常:

2017-04-13 15:55:41.937:WARN:oejw.WebAppContext:main: Failed startup of context o.e.j.w.WebAppContext@51931956{/server,file:/C:/Users/foo/project/webapps/server/,STARTING}{C:\Users\foo\project\webapps\server}
java.lang.IllegalArgumentException: Object of class 'org.eclipse.jetty.webapp.WebAppContext' is not of type 'org.eclipse.jetty.webapp.WebAppContext'. Object Class and type Class are from different loaders. in file:/C:/Users/foo/project/webapps/server/WEB-INF/jetty-env.xml
    at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.configure(XmlConfiguration.java:296)
    at org.eclipse.jetty.xml.XmlConfiguration.configure(XmlConfiguration.java:248)
    at org.eclipse.jetty.plus.webapp.EnvConfiguration.configure(EnvConfiguration.java:124)
    at org.eclipse.jetty.webapp.WebAppContext.configure(WebAppContext.java:479)
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1337)
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:741)
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:505)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.deploy.bindings.StandardStarter.processBinding(StandardStarter.java:41)
    at org.eclipse.jetty.deploy.AppLifeCycle.runBindings(AppLifeCycle.java:186)
    at org.eclipse.jetty.deploy.DeploymentManager.requestAppGoal(DeploymentManager.java:498)
    at org.eclipse.jetty.deploy.DeploymentManager.addApp(DeploymentManager.java:146)
    at org.eclipse.jetty.deploy.providers.ScanningAppProvider.fileAdded(ScanningAppProvider.java:180)
    at org.eclipse.jetty.deploy.providers.WebAppProvider.fileAdded(WebAppProvider.java:440)
    at org.eclipse.jetty.deploy.providers.ScanningAppProvider$1.fileAdded(ScanningAppProvider.java:64)
...
    at org.eclipse.jetty.start.Main.main(Main.java:112)

我做错了什么以及如何解决?

2 个答案:

答案 0 :(得分:1)

您无法在WebApp启动过程中添加额外的类路径条目(为时已晚,此时WebAppClassloader已存在)。

必须在WebAppContext部署之外定义,以便WebApp的启动可以使用它。

您需要一个可部署的XML。

假设你的战争是${jetty.base}/webapps/myserver.war

创建${jetty.base}/webapps/myserver.xml

<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN"
                           "http://www.eclipse.org/jetty/configure_9_3.dtd">

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
  <Set name="contextPath">/myserver</Set>
  <Set name="war"><Property name="jetty.webapps" default="."/>/myserver.war</Set>
  <Set name="extraClasspath">/full/path/to/my/extra/lib/ivy/</Set>
</Configure>

另请注意:extraClasspath不能是相对路径。它必须是一条绝对的道路。

如果您有扩展的目录Web应用程序部署,请考虑采用类似的方法。

假设您有${jetty.base}/webapps/foo/

的网络应用程序

创建${jetty.base}/webapps/foo.xml文件

<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN"
                           "http://www.eclipse.org/jetty/configure_9_3.dtd">

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
  <Set name="contextPath">/foo</Set>
  <Set name="war"><Property name="jetty.webapps" default="."/>/foo/</Set>
  <Set name="extraClasspath">/full/path/to/my/extra/lib/ivy/</Set>
</Configure>

答案 1 :(得分:1)

我想出来了。我在WEB-INF/lib文件夹中有一个jetty-all jar文件。删除它解决了问题。