2009-09-02 97 views
2

我正在处理一个包含多个JDBC数据源和JTA的项目。我使用Maven作为构建工具,并且我想在开发期间使用Jetty插件(6.1.20)来运行应用程序。Atomikos + Jetty在Maven构建环境中 - Classloader问题?

我正在尝试将Jetty配置为使用Atomikos作为事务管理器。我遵循Atomikos documentation from Jetty,但Jetty启动失败,看起来像是类加载器问题。

这里是我的配置的相关位。

runtime范围依赖于我的pom.xml

<dependency> 
    <groupId>com.atomikos</groupId> 
    <artifactId>transactions-jta</artifactId> 
    <version>3.5.7</version> 
    <scope>runtime</scope> 
</dependency> 
<dependency> 
    <groupId>com.atomikos</groupId> 
    <artifactId>transactions-jdbc</artifactId> 
    <version>3.5.7</version> 
    <scope>runtime</scope> 
</dependency> 
<dependency> 
    <groupId>javax.transaction</groupId> 
    <artifactId>jta</artifactId> 
    <version>1.1</version> 
    <scope>runtime</scope> 
</dependency> 

jetty-env.xml位于/WEB-INF(由码头自动查找):

<New id="userTxImpl" class="com.atomikos.icatch.jta.UserTransactionImp" /> 

<New id="tx" class="org.mortbay.jetty.plus.naming.Transaction"> 
    <Arg> 
     <Ref id="userTxImpl" /> 
    </Arg> 
</New> 

tx在最后的实例是失败位,如果我离开它,Jetty启动正常(但当然不通过JNDI公开UserTransaction)。

堆栈跟踪:

2009-09-02 18:42:18.910::WARN: Config error at <New id="tx" class="org.mortbay.jetty.plus.naming.Transaction"><Arg> 
      <Ref id="userTxImpl"/> 
     </Arg></New> 
2009-09-02 18:42:18.910::WARN: Failed startup of context [email protected]{/administrator,C:\workspace\administrator\src\main\webapp} 
java.lang.IllegalStateException: No Constructor: <New id="tx" class="org.mortbay.jetty.plus.naming.Transaction"><Arg> 
      <Ref id="userTxImpl"/> 
     </Arg></New> on [email protected]{/administrator,C:\workspace\administrator\src\main\webapp} 
    at org.mortbay.xml.XmlConfiguration.newObj(XmlConfiguration.java:631) 
    at org.mortbay.xml.XmlConfiguration.configure(XmlConfiguration.java:256) 
    at org.mortbay.xml.XmlConfiguration.configure(XmlConfiguration.java:190) 
    at org.mortbay.jetty.plus.webapp.EnvConfiguration.configureWebApp(EnvConfiguration.java:130) 
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1247) 
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517) 
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467) 
    at org.mortbay.jetty.plugin.Jetty6PluginWebAppContext.doStart(Jetty6PluginWebAppContext.java:124) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50) 
    at org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:152) 
    at org.mortbay.jetty.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:156) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50) 
    at org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:152) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50) 
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130) 
    at org.mortbay.jetty.Server.doStart(Server.java:224) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50) 
    at org.mortbay.jetty.plugin.Jetty6PluginServer.start(Jetty6PluginServer.java:132) 
    at org.mortbay.jetty.plugin.AbstractJettyMojo.startJetty(AbstractJettyMojo.java:441) 
    at org.mortbay.jetty.plugin.AbstractJettyMojo.execute(AbstractJettyMojo.java:383) 
    at org.mortbay.jetty.plugin.AbstractJettyRunMojo.execute(AbstractJettyRunMojo.java:210) 
    at org.mortbay.jetty.plugin.Jetty6RunMojo.execute(Jetty6RunMojo.java:184) 
    at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:579) 
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:498) 
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegmentForProject(DefaultLifecycleExecutor.java:265) 
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:191) 
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:149) 
    at org.apache.maven.DefaultMaven.execute_aroundBody0(DefaultMaven.java:223) 
    at org.apache.maven.DefaultMaven.execute_aroundBody1$advice(DefaultMaven.java:304) 
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:1) 
    at org.apache.maven.embedder.MavenEmbedder.execute_aroundBody2(MavenEmbedder.java:904) 
    at org.apache.maven.embedder.MavenEmbedder.execute_aroundBody3$advice(MavenEmbedder.java:304) 
    at org.apache.maven.embedder.MavenEmbedder.execute(MavenEmbedder.java:1) 
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:176) 
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:63) 
    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.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:408) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:351) 
    at org.codehaus.classworlds.Launcher.main(Launcher.java:31) 

这看起来像一个类加载器的问题,因为org.mortbay.jetty.plus.naming.Transaction得到了一个构造函数采取javax.transaction.UserTransaction,和com.atomikos.icatch.jta.UserTransactionImp实现javax.transaction.UserTransaction,但码头抱怨它没有一个适当的构造函数来使用。

我很明显在这里失去了一些东西,但它是什么?

谢谢!

回答

6

您可能会在部署中有多个UserTransaction类别的副本。如果这些从不同的类加载器加载,那么最终会出现这种错误。

检查码头的库为UserTransaction,然后检查您的应用程序的库。你应该只有一个副本。

+1

jboss-j2ee与它自己的UserTransaction一起间接依赖,是问题所在。非常感谢!我以为我疯了。 – Henning 2009-09-02 16:56:16

4

我相信你不应该指定JTA jar作为'运行时'的要求,而是作为'提供'的要求。与servlet-api和JMS相似,各个实现者都提供它们自己的API副本,并提供Sun jar来弥补它们。

2

我意识到这已经回答了,但我想提出我的经验,以挽救他人我刚刚经历的悲痛。

我有一个类似的问题,但它是由geronimo-jta规范版本中的冲突引起的。具体而言,atomikos依赖的那个与码头使用的不相符。我不得不排除一个从Atomikos公司,如:

com.atomikos 交易必需品,所有 3.5.9 org.apache.geronimo.specs Geronimo的jta_1.0.1B_spec

0

就像泰勒一样,我在这个完全相同的问题上吹了几个小时。我使用Hibernate作为JPA提供者,并且在其自己的JTA用户传播中存在Maven依赖。一旦我排除了这种依赖性,我就解决了这个问题。