Atomikos + Jetty-Maven-build-Umgebung - Classloader-Problem?
Arbeite ich an einem Projekt mit mehreren JDBC-Datenquellen und JTA. Ich benutze Maven als build-tool, und ich möchte das Jetty-plugin (6.1.20) zum ausführen der Anwendung während der Entwicklung.
Ich versuche zu konfigurieren Jetty zu verwenden Atomikos als Transaktion manager. Ich bin nach der Atomikos Dokumentation von Jetty, aber die Jetty-Start schlägt fehl, mit dem, was sieht aus wie eine class-loader-Problem.
Hier sind die relevanten bits von meiner Konfiguration.
runtime
Umfang Abhängigkeiten in meinem 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>
Meine jetty-env.xml
befindet sich in /WEB-INF
(autodiscovered von 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>
Die Instanziierung von tx
am Ende wird das bit Fehler auf, wenn ich es weglassen, Jetty startet, feine (aber nicht aussetzen UserTransaction
über JNDI, natürlich).
Den 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 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)
Dieser sieht aus wie ein classloader-Problem, wie org.mortbay.jetty.plus.naming.Transaction
hat einen Konstruktor nehmen eine javax.transaction.UserTransaction
, und com.atomikos.icatch.jta.UserTransactionImp
implementiert javax.transaction.UserTransaction
, noch Steg beschwert es keinen richtigen Konstruktor zu verwenden.
Bin ich natürlich hier etwas fehlt, aber was ist es?
Dank!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie mehrere Kopien der
UserTransaction
Klasse kicken in Ihrer Bereitstellung. Wenn diese von verschiedenen classloadern geladen würden, dann können Sie am Ende mit dieser Art von Fehler.Überprüfen Jetty-Bibliotheken für
UserTransaction
, und dann überprüfen Sie Ihre Anwendung in Bibliotheken. Sie sollten nur eine Kopie.Ich glaube, dass sollte man nicht die Angabe der JTA-Glas als 'runtime' - Anforderung, sondern vielmehr als ein 'versehen' Anforderung. Ähnlich servlet-api und JMS, die einzelnen Entwickler Ihre eigenen Kopien der API und die Bereitstellung der Sun jar können dreck diese.
Ich weiß, das ist schon beantwortet, aber ich möchte zu meinen Erfahrungen andere zu retten, die Trauer, ich ging gerade durch.
Ich hatte ein ähnliches problem, aber es wurde verursacht durch einen Konflikt in den Versionen von geronimo-jta-spec. Speziell die eine hing von atomikos war nicht immer zusammen mit die Verwendung von jetty. Ich musste ausschließen, dass der eine von atomikos, z.B.:
com.atomikos
Transaktionen-essentials-alle
3.5.9
org.apache.geronimo.Spezifikationen
geronimo-jta_1.0.1B_spec
Wie Taylor, ich blies nur ein paar Stunden auf genau dem gleichen Problem. Ich benutze Hibernate als JPA-provider und es war ein Maven depdency auf seine eigene JTA Benutzer Tranaction. Einmal habe ich ausgeschlossen, diese Abhängigkeit habe ich hinter das Problem.