2009-09-02 2 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 (autodiscovered по Jetty):

<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, конечно).

The StackTrace:

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, но Jetty жалуется, что не имеет надлежащий конструктор использовать.

Я, очевидно, что-то пропустил, но что это?

Спасибо!

ответ

6

В вашем развертывании может быть несколько экземпляров класса UserTransaction. Если они загружаются из разных загрузчиков классов, то вы можете получить такую ​​ошибку.

Проверьте библиотеки Jetty для UserTransaction, а затем проверьте библиотеки приложений. У вас должен быть только один экземпляр.

+1

Проблема была связана с косвенной зависимостью от jboss-j2ee, которая поставляется с собственным UserTransaction. Спасибо! Я думал, что сойду с ума. – Henning

4

Я считаю, что вы не должны указывать банку JTA как требование «времени выполнения», а скорее как «предоставленное» требование. Подобно servlet-api и JMS, отдельные разработчики предоставляют свои собственные копии API и предоставляют банку Sun возможность их уничтожать.

2

Я понимаю, что это уже ответили, но я хочу выразить свой опыт, чтобы спасти других от горя, которое я только что пережил.

У меня была аналогичная проблема, но это было вызвано конфликтом в версиях спецификации geronimo-jta. В частности, тот, который зависел от атомисов, не ладил с той, что использовалась причалом. Я должен был исключить один из atomikos, например:

com.atomikos операции-основы-все 3.5.9 org.apache.geronimo.specs Джеронимо-jta_1.0.1B_spec

0

Как и Тейлор, я просто пару раз пропустил эту же проблему.Я использую Hibernate в качестве JPA-провайдера, и у него была резервная копия Maven на своем собственном Tranaction JTA. Как только я исключил эту зависимость, я обошел эту проблему.

Смежные вопросы