2009-09-02 92 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依賴。一旦我排除了這種依賴性,我就解決了這個問題。