Maven 2 使用maven和嵌入式jetty:ClassCastException
我有一个用java编写的web应用程序 我想在嵌入式jetty服务器上运行集成测试 为此,我有一个maven项目(仅用于运行集成测试) 对于部署,我使用cargo-maven2-plugin。但在jetty启动期间,我收到以下信息:Maven 2 使用maven和嵌入式jetty:ClassCastException,maven-2,jetty,cargo,maven-cargo,Maven 2,Jetty,Cargo,Maven Cargo,我有一个用java编写的web应用程序 我想在嵌入式jetty服务器上运行集成测试 为此,我有一个maven项目(仅用于运行集成测试) 对于部署,我使用cargo-maven2-plugin。但在jetty启动期间,我收到以下信息: java.lang.ClassCastException: org.mortbay.jetty.webapp.WebInfConfiguration cannot be cast to org.mortbay.jetty.webapp.Configuration
java.lang.ClassCastException: org.mortbay.jetty.webapp.WebInfConfiguration cannot be cast to org.mortbay.jetty.webapp.Configuration
完整日志:
[beddedLocalContainer] Jetty 6.x Embedded starting...
2010-03-29 16:20:46.615::INFO: Logging to STDERR via org.mortbay.log.StdErrLog
2010-03-29 16:20:46.715::INFO: jetty-6.1.1rc1
2010-03-29 16:20:46.980::INFO: Extract jar:file:/C:/Documents%20and%20Settings/Alpha/Local%20Settings/Temp/cargo/conf/cargocpc.war!/ to C:\DOCUME~1\Alpha\LOCALS~1\Temp\Jetty_0_0_0_0_8080_cargocpc.war__cargocpc__xflgf3\webapp
log4j:WARN No appenders could be found for logger (org.apache.jasper.compiler.JspRuntimeContext).
log4j:WARN Please initialize the log4j system properly.
2010-03-29 16:20:47.897::INFO: Started SelectChannelConnector @ 0.0.0.0:8080
[beddedLocalContainer] Jetty 6.x Embedded started on port [8080]
[cargo:deployer]
[mbeddedLocalDeployer] Deploying [c:\maven-repo\myapp\2.1-SNAPSHOT\myapp-2.1-SNAPSHOT.war]
2010-03-29 16:20:51.711::WARN: Failed startup of context org.mortbay.jetty.webapp.WebAppContext@132e910{/myapp,c:\maven-repo\myapp\2.1-SNAPSHOT\myapp-2.1-SNAPSHOT.war}
java.lang.ClassCastException: org.mortbay.jetty.webapp.WebInfConfiguration cannot be cast to org.mortbay.jetty.webapp.Configuration
at org.mortbay.jetty.webapp.WebAppContext.loadConfigurations(WebAppContext.java:801)
at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:403)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.codehaus.cargo.container.jetty.Jetty6xEmbeddedLocalContainer.addHandler(Jetty6xEmbeddedLocalContainer.java:294)
at org.codehaus.cargo.container.jetty.Jetty6xEmbeddedLocalDeployer.deployWebApp(Jetty6xEmbeddedLocalDeployer.java:77)
at org.codehaus.cargo.container.jetty.internal.AbstractJettyEmbeddedLocalDeployer.deploy(AbstractJettyEmbeddedLocalDeployer.java:95)
at org.codehaus.cargo.maven2.DeployerDeployMojo.performDeployerActionOnSingleDeployable(DeployerDeployMojo.java:79)
at org.codehaus.cargo.maven2.AbstractDeployerMojo.performDeployerActionOnAllDeployables(AbstractDeployerMojo.java:104)
at org.codehaus.cargo.maven2.AbstractDeployerMojo.doExecute(AbstractDeployerMojo.java:47)
at org.codehaus.cargo.maven2.AbstractCargoMojo.execute(AbstractCargoMojo.java:255)
at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:490)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:694)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLifecycle(DefaultLifecycleExecutor.java:556)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:535)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:387)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:348)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:180)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:328)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:138)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:362)
at org.apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.java:60)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)
at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
Maven货物设置:
<profile>
<id>container-cargo-jetty</id>
<properties>
<skip.test.phase>true</skip.test.phase>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<version>1.0</version>
<configuration>
<wait>false</wait>
<container>
<containerId>jetty6x</containerId>
<type>embedded</type>
</container>
<configuration>
<properties>
<cargo.servlet.port>8080</cargo.servlet.port>
<cargo.logging>medium</cargo.logging>
</properties>
</configuration>
<deployer>
<deployables>
<deployable>
<groupId>myapp</groupId>
<artifactId>myapp</artifactId>
<type>war</type>
<properties>
<context>/myapp</context>
</properties>
</deployable>
</deployables>
</deployer>
</configuration>
<executions>
<execution>
<id>start-container</id>
<phase>pre-integration-test</phase>
<goals>
<goal>start</goal>
<goal>deployer-deploy</goal>
</goals>
</execution>
<execution>
<id>stop-container</id>
<phase>post-integration-test</phase>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-embedded</artifactId>
<version>6.1.22</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
集装箱码头
真的
org.codehaus.cargo
cargo-maven2-plugin
1
假的
码头6X
嵌入的
8080
中等的
myapp
myapp
战争
/myapp
启动容器
预集成测试
开始
部署人员部署
停止容器
整合后测试
停止
org.mortbay.jetty
嵌入式码头
6.1.22
thx帮助您可能正在处理JETTY中的“类加载器地狱”,它为JETTY实例使用父类加载器,该实例与Web应用程序使用的类不同,因此即使它们应该是相同的类,它们也不是
JETTY配置中有一些选项可以强制使用相同的类加载器,这可能有助于集成测试
Jetty提供配置选项
来控制这三个选项。
方法
org.mortbay.jetty.webapp.WebAppContext.setParentLoaderPriority(布尔值)
允许正常的Java2行为
将使用,并将加载所有类
如果可能,从系统类路径。
这是非常有用的,如果库
web应用程序使用的
加载同时具有两个属性的类时出现问题
在web应用程序和系统上
类路径
我不确定如何在Cargo中访问JETTY配置,但在普通JETTY maven插件中,您可以执行以下操作:
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>7.0.0.pre5</version>
<configuration>
<jettyConfig>${jetty.configs}</jettyConfig>
<reload>manual</reload>
<contextPath>/</contextPath>
<webAppConfig>
<parentLoaderPriority>true</parentLoaderPriority>
</webAppConfig>
</configuration>
</plugin>
org.mortbay.jetty
jetty maven插件
7.0.0.5
${jetty.configs}
手册
/
真的
不支持指定Cargo使用的嵌入式码头版本(这方面有一个老问题,请参阅)。事实上,如果我们查看日志,我们会发现它使用jetty-6.1.1rc1:
2010-03-29 16:20:46.715::INFO: jetty-6.1.1rc1
因此,首先,删除插件配置中的jetty依赖项,这实际上是导致ClassCastException
的原因
但一旦删除了依赖关系,我就面临另一个晦涩难懂的commons日志问题:
Caused by: org.apache.commons.logging.LogConfigurationException: Invalid class loader hierarchy. You have more than one version of 'org.apache.commons.logging.Log' visible, which is not allowed.
原因似乎是这一部分:
<execution>
<id>start-container</id>
<phase>pre-integration-test</phase>
<goals>
<goal>start</goal>
<goal>deployer-deploy</goal>
</goals>
</execution>
如果没有目标“部署”,应用程序将无法部署。我在Apache commons日志记录中遇到了类装入器问题。最后我切换到jetty maven插件。@amra-wird,它在没有
deploy-deploy
的情况下对我有效(我在发布之前测试过)。
<profile>
<id>container-cargo-jetty</id>
<properties>
<skip.test.phase>true</skip.test.phase>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<version>1.0</version>
<configuration>
<wait>false</wait>
<container>
<containerId>jetty6x</containerId>
<type>embedded</type>
</container>
<configuration>
<properties>
<cargo.servlet.port>8080</cargo.servlet.port>
<cargo.logging>medium</cargo.logging>
</properties>
</configuration>
<deployer>
<deployables>
<deployable>
<groupId>myapp</groupId>
<artifactId>myapp</artifactId>
<type>war</type>
<properties>
<context>/myapp</context>
</properties>
</deployable>
</deployables>
</deployer>
</configuration>
<executions>
<execution>
<id>start-container</id>
<phase>pre-integration-test</phase>
<goals>
<goal>start</goal>
</goals>
</execution>
<execution>
<id>stop-container</id>
<phase>post-integration-test</phase>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>