代码之家  ›  专栏  ›  技术社区  ›  Henning

Maven构建环境中的Atomikos+Jetty-类加载器问题?

  •  2
  • Henning  · 技术社区  · 15 年前

    我正在从事一个有多个JDBC数据源和JTA的项目。我使用Maven作为构建工具,我希望在开发过程中使用Jetty插件(6.1.20)来运行应用程序。

    Atomikos 作为事务管理器。我在跟踪调查 Atomikos documentation from Jetty ,但Jetty启动失败,看起来像是类装入器问题。

    runtime my中的范围依赖关系 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启动良好(但不会暴露) UserTransaction 当然是通过JNDI)。

    堆栈跟踪:

        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 org.mortbay.jetty.plugin.Jetty6PluginWebAppContext@12515db{/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 org.mortbay.jetty.plugin.Jetty6PluginWebAppContext@12515db{/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 然而,Jetty抱怨它没有合适的构造器来使用。

    很明显我遗漏了一些东西,但那是什么?

    谢谢

    4 回复  |  直到 15 年前
        1
  •  6
  •   skaffman    15 年前

    您可能有多份 UserTransaction

    查看Jetty的库以了解更多信息 ,然后检查应用程序的库。你应该只有一份。

        2
  •  4
  •   Jherico    15 年前

        3
  •  2
  •   Taylor    15 年前

    我意识到这已经得到了回答,但我想用我的经验来拯救别人我刚刚经历的悲伤。

    我有一个类似的问题,但它是由geronimo jta规范版本中的冲突引起的。特别是atomikos依赖的版本与jetty使用的版本不一致。我必须从atomikos中排除该选项,例如:

    com.atomikos 交易要领 3.5.9 org.apache.geronimo.specs geronimo-jta_1.0.1B_规范

        4
  •  0
  •   Dave    14 年前

    和泰勒一样,我在这个问题上浪费了几个小时。我使用Hibernate作为JPA提供者,它在自己的JTA用户传输上有一个Maven depdency。一旦我排除了这种依赖性,我就克服了这个问题。

    推荐文章