2010-03-29 97 views
2

我有一个用java编写的web应用程序。使用maven和嵌入式码头:ClassCastException

我想在嵌入式码头服务器上运行集成测试。

为此我有一个maven项目(仅用于运行集成测试)。

为了部署我使用cargo-maven2-plugin。不过,虽然码头启动,我收到以下内容:

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 [email protected]{/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> 

THX的帮助

回答

2

指定由货物所使用的嵌入码头的版本不支持(有一个旧的公开问题,请参阅CARGO-571)。事实上,如果我们看一下日志,我们可以看到它使用码头-6.1.1rc1:

2010-03-29 16:20:46.715::INFO: jetty-6.1.1rc1 

因此,首先,除去这实际上是ClassCastException的原因插件配置里面的码头依赖。

但一旦依赖删除,我面临的另一个模糊的共享记录的问题:

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> 

说实话,我不知道知道你为什么在这里打电话deploy-deploy的目标。没有它,Cargo会部署声明的deployable。所以IMO没有必要指定这个目标。如果你删除它,没有例外(那第二个“修复”)。

总结,下面的配置工作:

<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> 
+0

如果没有目标“部署部署”的应用程序将未部署。 Apache公用日志记录存在类加载器问题。最后我切换到jetty-maven-plugin。 – amra 2010-04-02 16:41:06

+0

@amra奇怪的是,它没有'部署 - 部署'工作对我来说(我在发布前测试过)。 – 2010-04-02 16:55:32

2

您可能处理“classl oader hell“,在JETTY中,它使用JETTY实例的父类加载器,它与用于Web应用程序的JETTY实例分开,因此即使它们应该是相同的类,它们也不是。

JETTY配置中有一些选项可以强制使用相同的类加载器,这可能有助于集成测试。

Classloading - JETTY

码头提供配置选项 来控制所有这三个选项。 方法 org.mortbay.jetty.webapp.WebAppContext.setParentLoaderPriority(布尔值) 允许正常的Java 2行为 可以使用,如果可能,所有的类将被装入 从系统类路径。 如果网络应用程序使用的库 在加载类应用程序中的 类和 类路径中存在 问题,这非常有用。

我不知道你如何接货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>