2010-03-29 4 views
2

J'ai une application Web écrite en Java. Je voudrais lancer des tests d'intégration sur un serveur jetée embarqué. Pour cela, j'ai un projet maven (juste pour faire des tests d'intégration).Utilisation de maven et de jetty intégrée: ClassCastException

Pour le déploiement, j'utilise cargo-maven2-plugin. Mais alors que le démarrage de la jetée, je reçois ce qui suit:

java.lang.ClassCastException: org.mortbay.jetty.webapp.WebInfConfiguration cannot be cast to org.mortbay.jetty.webapp.Configuration 

journal complet:

[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 paramètres cargo:

<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 pour l'aide

Répondre

2

Spécification de la version de la jetée intégrée utilisée par Cargo est pas pris en charge (il existe un ancien problème ouvert à ce sujet, voir CARGO-571). Et en effet, si l'on regarde le journal, on voit qu'il utilise la jetée-6.1.1rc1:

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

Alors, d'abord, supprimer la dépendance de la jetée dans la configuration du plugin qui est en fait la cause de la ClassCastException.

Mais une fois la dépendance enlevée, je faisais face à une autre question obscure diagraphie des communes:

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. 

Et la cause semble être cette partie:

  <execution> 
       <id>start-container</id> 
       <phase>pre-integration-test</phase> 
       <goals> 
        <goal>start</goal> 
        <goal>deployer-deploy</goal> 
       </goals> 
      </execution> 

Pour être honnête, je ne sais pourquoi vous appelez l'objectif deploy-deploy ici. Sans cela, Cargo déploie le deployable déclaré. Il n'y a donc pas besoin d'OMI pour spécifier cet objectif. Et si vous le supprimez, il n'y a pas d'exception (et que le second "correctif").

En résumé, la configuration suivante fonctionne:

<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

Sans but « déployer déployer » l'application ne sera pas déployée. J'ai eu des problèmes de chargeur de classe avec la consignation des communs Apache. Finalement, je suis passé à jetty-maven-plugin. – amra

+0

@amra Bizarre, ça marche pour moi sans 'deploy-deploy' (j'ai testé ça avant de poster). –

2

Vous pouvez être traiter avec "classl oader hell "dans JETTY, où il utilise un chargeur de classe parent pour l'instance de JETTY qui est séparé de celui utilisé pour votre application web et donc même si elles doivent être des classes identiques, elles ne le sont pas.

Il existe certaines options dans la configuration JETTY pour forcer l'utilisation du même chargeur de classe, ce qui peut vous aider dans vos tests d'intégration.

Classloading - JETTY

Jetty fournit des options de configuration pour contrôler tous les trois de ces options. La méthode org.mortbay.jetty.webapp.WebAppContext.setParentLoaderPriority (Boolean) permet le comportement java 2 normal être utilisé et toutes les classes seront chargées du système si classpath possible. Ceci est très utile si les bibliothèques qu'une application utilise web éprouvent des problèmes cours de chargement qui sont à la fois dans une application Web et sur le système classpath.

Je ne sais pas comment accéder à la configuration Jetty en Cargo, mais dans le Maven Jetty normal, vous plugin feriez quelque chose comme:

<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> 
Questions connexes