我正在使用货物maven插件进行测试 . Cargo用于启动我们的webapp,然后针对它运行REST API测试 . 我们正在使用jetty 9.1.1 .

我使用的货物版本:1.4.8

这是货物插件的配置:

<dependencies>
            <dependency>
                <groupId>org.codehaus.cargo</groupId>
                <artifactId>cargo-core-uberjar</artifactId>
                <version>${cargo.version}</version>
            </dependency>
        </dependencies>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.codehaus.cargo</groupId>
                    <artifactId>cargo-maven2-plugin</artifactId>
                    <version>${cargo.version}</version>
                    <configuration>
                        <wait>false</wait>
                        <container>
                            <containerId>jetty9x</containerId>
                            <timeout>180000</timeout>
                            <artifactInstaller>
                                <groupId>org.eclipse.jetty</groupId>
                                <artifactId>jetty-distribution</artifactId>
                                <version>${jetty.version}</version>
                            </artifactInstaller>
                        </container>
                        <configuration>
                            <type>standalone</type>
                            <properties>
                                <cargo.servlet.port>${jetty.port}</cargo.servlet.port>
                                <cargo.jvmargs>-Xmx1024m -XX:MaxPermSize=512m</cargo.jvmargs>
                                <cargo.logging>high</cargo.logging>
                            </properties>
                        </configuration>
                        <deployables>
                            <deployable>
                                <groupId>org.codehaus.cargo</groupId>
                                <artifactId>simple-war</artifactId>
                                <type>war</type>
                                <location>${unpacked.war.directory}</location>
                                <properties>
                                    <context>portal</context>
                                </properties>
                            </deployable>
                        </deployables>                              
                    </configuration>
                    <executions>
                        <execution>
                            <id>start-server</id>
                            <phase>pre-integration-test</phase>
                            <goals>
                                <goal>start</goal>
                            </goals>
                        </execution>
                        <execution>
                            <id>stop-server</id>
                            <phase>post-integration-test</phase>
                            <goals>
                                <goal>stop</goal>
                            </goals>
                        </execution>
                    </executions>                                          
                </plugin>                
            </plugins>
        </build>

我们在其中一个servlet中的代码使用 org.eclipse.jetty.servlet.ServletContextHandler$Context

由于我们在带有jetty嵌入式的 生产环境 中运行,我们在 pom.xml 中使用它的模块中配置了jetty模块的 provided 范围 .

生产环境 中没有问题 .

但是当在货物中运行时,我得到以下例外:

java.lang.NoClassDefFoundError: org/eclipse/jetty/servlet/ServletContextHandler$Context
at my.package.DefaultServletConfiguration.setServletConfig(DefaultServletConfiguration.java:42)
at my.package.InitServlet.init(InitServlet.java:204)
at javax.servlet.GenericServlet.init(GenericServlet.java:244)
at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:612)
at org.eclipse.jetty.servlet.ServletHolder.initialize(ServletHolder.java:395)
at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:871)
at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:298)
at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1349)
at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1342)
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:461)
at org.eclipse.jetty.deploy.providers.ScanningAppProvider$1.fileAdded(ScanningAppProvider.java:64)
at org.eclipse.jetty.util.Scanner.reportAddition(Scanner.java:609)
at org.eclipse.jetty.util.Scanner.reportDifferences(Scanner.java:528)
at org.eclipse.jetty.util.Scanner.scan(Scanner.java:391)
at org.eclipse.jetty.util.Scanner.doStart(Scanner.java:313)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at org.eclipse.jetty.deploy.providers.ScanningAppProvider.doStart(ScanningAppProvider.java:150)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at org.eclipse.jetty.deploy.DeploymentManager.startAppProvider(DeploymentManager.java:560)
at org.eclipse.jetty.deploy.DeploymentManager.doStart(DeploymentManager.java:235)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132)
at org.eclipse.jetty.server.Server.start(Server.java:387)
at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114)
at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61)
at org.eclipse.jetty.server.Server.doStart(Server.java:354)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at org.eclipse.jetty.xml.XmlConfiguration$1.run(XmlConfiguration.java:1255)
at java.security.AccessController.doPrivileged(Native Method)
at org.eclipse.jetty.xml.XmlConfiguration.main(XmlConfiguration.java:1174)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.eclipse.jetty.start.Main.invokeMain(Main.java:321)
at org.eclipse.jetty.start.Main.start(Main.java:817)
at org.eclipse.jetty.start.Main.main(Main.java:112)
Caused by: java.lang.ClassNotFoundException: org.eclipse.jetty.servlet.ServletContextHandler$Context
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at org.eclipse.jetty.webapp.WebAppClassLoader.findClass(WebAppClassLoader.java:510)
at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:441)
at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:403)
... 45 more

我还尝试为jetty模块指定范围为 compile ,以便它们位于webapp内的 lib 目录中,但后来似乎有不同的类加载器问题 . 在webapp中加载 Context 类的加载器与加载jetty的加载器不同 .

这有什么不对?

更新

货物版本1.4.14和码头9.2.9.v20150224也是如此


更新2

我试图将jetty-servlet作为附加的jar依赖项放在classpath中,根据货物maven插件的文档:here

<container>
    <containerId>jetty9x</containerId>
    <timeout>180000</timeout>
    <artifactInstaller>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-distribution</artifactId>
        <version>${jetty.version}</version>
    </artifactInstaller>
    <dependencies>
        <dependency>
            <artifactId>jetty-servlet</artifactId>
            ...
        </dependency>
    </dependencies>
</container>

现在我看到 dependency 元素上有一个属性,名为 classpath ,它有2个值: sharedextra . 默认值为 extra . 我将尝试 shared 一,并将检查结果 .

更新3

classpathcontainer 依赖值 shared 没有帮助 . 我看到我的WebApp(来自servlet)只能看到以下jar:

.../target/cargo/installs/jetty-distribution-9.2.9.v20150224/jetty-distribution-9.2.9.v20150224/start.jar