2009-09-02 4 views
2

나는 여러 JDBC 데이터 소스와 JTA가있는 프로젝트를 작업 중이다. 빌드 도구로 Maven을 사용하고 있으며 Jetty 플러그인 (6.1.20)을 사용하여 개발 중에 응용 프로그램을 실행하고 싶습니다.Maven 빌드 환경의 Atomikos + Jetty - Classloader 문제?

Atomikos을 트랜잭션 관리자로 사용하도록 Jetty를 구성하려고합니다. Atomikos documentation from Jetty을 따르고 있지만 클래스 로더 문제처럼 보이는 Jetty 시작이 실패합니다.

다음은 본인 구성의 관련 비트입니다. 내 pom.xml에서

runtime 범위 종속 관계 :

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

/WEB-INF에 위치한 jetty-env.xml은 (부두에서 autodiscovered) : 마지막에 tx의 인스턴스가 실패 비트는 경우입니다

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

나는 그것을 내버려 둔다, 부두는 잘 시작한다 (물론 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.Transactionjavax.transaction.UserTransaction 복용 생성자를 가지고 같은이, 클래스 로더 문제처럼 보이는, 그리고 com.atomikos.icatch.jta.UserTransactionImpjavax.transaction.UserTransaction를 구현, 아직 부두 그것이 적절한 생성자를 사용하지 않습니다 뿌려줍니다.

분명히 여기에 뭔가가 빠졌지 만 무엇입니까?

감사합니다.

답변

6

배포시 UserTransaction 클래스가 여러 개 복사되어있을 수 있습니다. 이들이 다른 클래스 로더에서로드되면 이러한 종류의 오류가 발생할 수 있습니다.

UserTransaction에 대한 부두의 라이브러리를 확인한 다음 응용 프로그램의 라이브러리를 확인하십시오. 복사본은 하나만 가져야합니다.

+1

자체 UserTransaction과 함께 제공되는 jboss-j2ee에 대한 간접적 인 종속성이 문제였습니다. 정말 고마워! 나는 미쳤다고 생각했다. – Henning

4

JTA jar를 '런타임'요구 사항으로 지정하지 말고 '제공된'요구 사항으로 지정해야한다고 생각합니다. servlet-api 및 JMS와 마찬가지로 개별 구현자가 API 사본을 제공하며 Sun jar를 제공하면 이러한 API를 사용할 수 있습니다.

2

나는 이것이 이미 답변 된 것을 알고 있지만, 나는 방금 지나간 슬픔을 다른 사람들을 위해 저장하려고한다.

비슷한 문제점이 있었지만 geronimo-jta 스펙의 충돌로 인해 발생했습니다. 특히 atomikos에 의존 한 것은 부두에서 사용하는 것과 관련이 없었습니다.

com.atomikos 거래 - 필수 - 모든 3.5.9 org.apache.geronimo.specs 제로니모 - jta_1.0.1B_spec

: 나는 atomikos에서 하나의 예를 제외했다
0

Taylor와 마찬가지로이 똑같은 문제에 대해 몇 시간 만 더 기다렸습니다.나는 JPA 제공자로서 Hibernate를 사용하고 그것 자체의 JTA User Tranaction에 Maven dependency를 가지고있다. 일단이 종속성을 제외하면 문제가 끝났습니다.