Ich habe zwei Ohren auf einer jboss-Instanz implementiert. Ich verwende in mbean konfigurierten Quarz. Beide Ohren benutzen StatefulJobs. Leider benutzt man die Bibliothek antlr-runtime-3.0, aber die zweite antlr-runtime-3.2. Wenn JBoss den Job aufruft, wird die falsche Bibliothek verwendet. Ich weiß nicht, wie man ihn dazu bringt, eine Bibliothek aus dem Ohr zu benutzen. Meine Quarzversion wurde auf 1.8.6 aufgerüstet. JBoss ist 4.2.2 GAjava.lang.NoSuchMethodError beim Aufruf des in jboss deklarierten Quarz-Jobs mbean
Meine erste Ohrstruktur:
META-INF
antlr-Runtime-3.0.jar
- ejb.jar
- App .war
Meine zweite Ohrstruktur:
- META-INF
- application.xml
- jboss-app.xml
- antlr-Runtime-3.2.jar
- ejb2.jar
- app2.war
Application.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE application PUBLIC
"-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN"
"http://java.sun.com/dtd/application_1_3.dtd">
<application>
<display-name>ear</display-name>
<module>
<web>
<web-uri>app.war</web-uri>
<context-root>/</context-root>
</web>
</module>
<module>
<ejb>app.jar</ejb>
</module>
</application>
jboss-app.xml
<?xml version='1.0' encoding='UTF-8' ?>
<jboss-app>
<loader-repository>
pck.class:app.war=unique-app.war
<loader-repository-config>java2ParentDelegation=false</loader-repository-config>
</loader-repository>
</jboss-app>
Stack:
org.quartz.SchedulerException: Problem instantiating class 'package.quartz.WsclFailureJob' - [See nested exception: java.lang.NoSuchMethodError: org.antlr.runtime.Lexer.<init>(Lorg/antlr/runtime/CharStream;Lorg/antlr/runtime/RecognizerSha
redState;)V]
at org.quartz.core.JobRunShell.initialize(JobRunShell.java:147)
at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:364)
Caused by: java.lang.NoSuchMethodError: org.antlr.runtime.Lexer.<init>(Lorg/antlr/runtime/CharStream;Lorg/antlr/runtime/RecognizerSharedState;)V
at package.cond.antlr.CondLexer.<init>(CondLexer.java:55)
at package.cond.antlr.CondLexer.<init>(CondLexer.java:52)
at package.cond.ExpressionFactory.getValue(ExpressionFactory.java:58)
at packagee.Configuration$ConfigInternal.loadParsableParams(Configuration.java:204)
at packagee.Configuration$ConfigInternal.reload(Configuration.java:172)
at packagee.Configuration$ConfigInternal.<init>(Configuration.java:161)
at packagee.Configuration.reload(Configuration.java:56)
at packagee.Configuration.<init>(Configuration.java:47)
at packagee.Configuration.<clinit>(Configuration.java:38)
at packagee.ScenarioProcessor.<init>(ScenarioProcessor.java:71)
at packagee.ScenarioProcessor.<clinit>(ScenarioProcessor.java:58)
at package.quartz.WsclFailureJob.<init>(WsclFailureJob.java:22)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:494)
at java.lang.Class.newInstance0(Class.java:350)
at java.lang.Class.newInstance(Class.java:303)
at org.quartz.simpl.SimpleJobFactory.newJob(SimpleJobFactory.java:55)
at org.quartz.core.JobRunShell.initialize(JobRunShell.java:140)
... 1 more
Ich habe versucht, auch mit java2ParentDelegation auf true gesetzt, aber es funktioniert nicht . Wenn ich diese Datei zum Projekt hinzufüge, gibt mein Quarz-Aufruf von jboss mi ClassNotFoundError beim Abrufen des Jobs von quartz_table. Ohne diese Datei funktioniert alles gut, aber wenn nur eine Anwendung auf jboss implementiert ist.
Stapel mit Jboss-app.xml:
15-04-15 17:49:00,010 TRACE [RepositoryClassLoader] attempt(1) was: true for :[email protected]{ url=null ,addedOrder=25}
2015-04-15 17:49:00,010 TRACE [LoadMgr3] registerLoaderThread, [email protected]{ url=null ,addedOrder=25}, t=Thread[MySystemClusteredScheduler_QuartzSchedulerThread,5,QuartzScheduler:MySystemClusteredScheduler], prevT=null
2015-04-15 17:49:00,010 TRACE [LoadMgr3] Begin beginLoadTask, [email protected]{classname: package.quartz.WsclFailureJob, requestingThread: Thread[MySystemClusteredScheduler_QuartzSchedulerThread,5,QuartzScheduler:MySystemClusteredScheduler], requestingClassLoader: [email protected]{ url=null ,addedOrder=25}, loadedClass: nullnull, loadOrder: 2147483647, loadException: null, threadTaskCount: 0, state: 0, #CCE: 0}
2015-04-15 17:49:00,010 TRACE [RepositoryClassLoader] loadClassLocally, [email protected]{ url=null ,addedOrder=25} name=package.quartz.WsclFailureJob
2015-04-15 17:49:00,010 TRACE [RepositoryClassLoader] Class in blacklist, name=package.quartz.WsclFailureJob
2015-04-15 17:49:00,010 TRACE [RepositoryClassLoader] loadClassLocally, [email protected]{ url=null ,addedOrder=25} name=package.quartz.WsclFailureJob not found
2015-04-15 17:49:00,010 TRACE [LoadMgr3] End beginLoadTask, ClassNotFoundException
2015-04-15 17:49:00,010 TRACE [LoadMgr3] Begin endLoadTask, [email protected]{classname: package.quartz.WsclFailureJob, requestingThread: Thread[MySystemClusteredScheduler_QuartzSchedulerThread,5,QuartzScheduler:MySystemClusteredScheduler], requestingClassLoader: [email protected]{ url=null ,addedOrder=25}, loadedClass: nullnull, loadOrder: 2147483647, loadException: null, threadTaskCount: 0, state: 0, #CCE: 0}
2015-04-15 17:49:00,010 TRACE [RepositoryClassLoader] release(1) for :[email protected]{ url=null ,addedOrder=25}
2015-04-15 17:49:00,010 TRACE [RepositoryClassLoader] released, holds: 0
2015-04-15 17:49:00,010 TRACE [RepositoryClassLoader] loadClass [email protected]{ url=null ,addedOrder=25} name=package.quartz.WsclFailureJob not found
2015-04-15 17:49:00,011 ERROR [JobStoreTX] Error retrieving job, setting trigger state to ERROR.
org.quartz.JobPersistenceException: Couldn't retrieve job because a required class was not found: No ClassLoaders found for: package.quartz.WsclFailureJob [See nested exception: java.lang.ClassNotFoundException: No ClassLoaders found for: package.quartz.WsclFailureJob]
at org.quartz.impl.jdbcjobstore.JobStoreSupport.retrieveJob(JobStoreSupport.java:1416)
at org.quartz.impl.jdbcjobstore.JobStoreSupport.triggerFired(JobStoreSupport.java:2903)
at org.quartz.impl.jdbcjobstore.JobStoreSupport$38.execute(JobStoreSupport.java:2871)
at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInNonManagedTXLock(JobStoreSupport.java:3788)
at org.quartz.impl.jdbcjobstore.JobStoreSupport.triggerFired(JobStoreSupport.java:2
865)
at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:319)
Caused by: java.lang.ClassNotFoundException: No ClassLoaders found for: package.quartz.WsclFailureJob
at org.jboss.mx.loading.LoadMgr3.beginLoadTask(LoadMgr3.java:306)
at org.jboss.mx.loading.RepositoryClassLoader.loadClassImpl(RepositoryClassLoader.java:521)
at org.jboss.mx.loading.RepositoryClassLoader.loadClass(RepositoryClassLoader.java:415)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at org.quartz.simpl.InitThreadContextClassLoadHelper.loadClass(InitThreadContextClassLoadHelper.java:72)
at org.quartz.simpl.CascadingClassLoadHelper.loadClass(CascadingClassLoadHelper.java:116)
at org.quartz.impl.jdbcjobstore.StdJDBCDelegate.selectJobDetail(StdJDBCDelegate.java:894)
at org.quartz.impl.jdbcjobstore.JobStoreSupport.retrieveJob(JobStoreSupport.java:1404)
Log ohne jboss-app.xml. Anwendung funktioniert gut, wenn dort nur ein auf Jboss eingesetzt ist:
2015-04-15 17:53:40,370 TRACE [org.jboss.mx.loading.RepositoryClassLoader] loadClassLocally, [email protected]{ url=file:/jboss/server/default/tmp/deploy/tmp34768system.ear ,addedOrder=44} name=package.quartz.WsclFailureJob class=class package.quartz.WsclFailureJob [email protected]{ url=file:/jboss/server/default/tmp/deploy/tmp34768system.ear ,addedOrder=44}
2015-04-15 17:53:40,370 TRACE [org.jboss.mx.loading.ClassLoadingTask] setLoadedClass, theClass=class package.quartz.WsclFailureJob, order=44
2015-04-15 17:53:40,370 TRACE [org.jboss.mx.loading.UnifiedLoaderRepository3] cacheLoadedClass, classname: package.quartz.WsclFailureJob, class: class package.quartz.WsclFailureJob, ucl: [email protected]{ url=file:/jboss/server/default/tmp/deploy/tmp34768system.ear ,addedOrder=44}, prevClass: null
2015-04-15 17:53:40,370 TRACE [org.jboss.mx.loading.LoadMgr3] Notifying task of thread completion, loadTask:[email protected]{classname: package.quartz.WsclFailureJob, requestingThread: Thread[main,5,jboss], requestingClassLoader: [email protected]{ url=file:/jboss/server/default/tmp/deploy/tmp34768system.ear ,addedOrder=44}, loadedClass: class [email protected]5b4<CodeSource: (file:/jboss/server/default/tmp/deploy/tmp34768system.ear-contents/system.jar <no signer certificates>)>, loadOrder: 44, loadException: null, threadTaskCount: 0, state: 1, #CCE: 0}
2015-04-15 17:53:40,370 TRACE [org.jboss.mx.loading.LoadMgr3] End nextTask(0), [email protected]{classname: package.quartz.WsclFailureJob, requestingThread: Thread[main,5,jboss], requestingClassLoader: [email protected]{ url=file:/jboss/server/default/tmp/deploy/tmp34768system.ear ,addedOrder=44}, loadedClass: class [email protected]5b4<CodeSource: (file:/jboss/server/default/tmp/deploy/tmp34768system.ear-contents/system.jar <no signer certificates>)>, loadOrder: 44, loadException: null, threadTaskCount: 0, state: 4, #CCE: 0}
2015-04-15 17:53:40,370 TRACE [org.jboss.mx.loading.LoadMgr3] Begin endLoadTask, [email protected]{classname: package.quartz.WsclFailureJob, requestingThread: Thread[main,5,jboss], requestingClassLoader: [email protected]{ url=file:/jboss/server/default/tmp/deploy/tmp34768system.ear ,addedOrder=44}, loadedClass: class [email protected]5b4<CodeSource: (file:/jboss/server/default/tmp/deploy/tmp34768system.ear-contents/system.jar <no signer certificates>)>, loadOrder: 44, loadException: null, threadTaskCount: 0, state: 4, #CCE: 0}
2015-04-15 17:53:40,370 TRACE [org.jboss.mx.loading.RepositoryClassLoader] release(1) for :[email protected]{ url=file:/jboss/server/default/tmp/deploy/tmp34768system.ear ,addedOrder=44}
2015-04-15 17:53:40,370 TRACE [org.jboss.mx.loading.RepositoryClassLoader] released, holds: 0
2015-04-15 17:53:40,371 TRACE [org.jboss.mx.loading.RepositoryClassLoader] loadClass [email protected]{ url=file:/jboss/server/default/tmp/deploy/tmp34768system.ear ,addedOrder=44} name=package.quartz.WsclFailureJob class=class package.quartz.WsclFailureJob [email protected]{ url=file:/jboss/server/default/tmp/deploy/tmp34768system.ear ,addedOrder=44}
2015-04-15 17:53:40,371 TRACE [org.jboss.mx.loading.RepositoryClassLoader] loadClass [email protected]{ url=file:/jboss/server/default/tmp/deploy/tmp34768system.ear ,addedOrder=44} name=package.quartz.VerifyTimeoutJob, loadClassDepth=0
Stapel ohne jboss-app.xml, aber im Fall von 2 bereitgestellten Anwendungen mit verschiedenen Versionen von Bibliothek antlr-Laufzeit:
2015-04-15 19:01:11,307 TRACE [RepositoryClassLoader] loadClassLocally, [email protected]{ url=file:/home/name/jboss/server/default/tmp/deploy/tmp34140system.ear ,addedOrder=48} name=org.antlr.runtime.Recognize
rSharedState class=class org.antlr.runtime.RecognizerSharedState [email protected]{ url=file:/home/name/jboss/server/default/tmp/deploy/tmp34140system.ear ,addedOrder=48}
2015-04-15 19:01:11,307 TRACE [ClassLoadingTask] setLoadedClass, theClass=class org.antlr.runtime.RecognizerSharedState, order=48
2015-04-15 19:01:11,307 TRACE [UnifiedLoaderRepository3] cacheLoadedClass, classname: org.antlr.runtime.RecognizerSharedState, class: class org.antlr.runtime.RecognizerSharedState, ucl: [email protected]{ ur
l=file:/home/name/jboss/server/default/tmp/deploy/tmp34140system.ear ,addedOrder=48}, prevClass: null
2015-04-15 19:01:11,307 TRACE [LoadMgr3] Notifying task of thread completion, loadTask:[email protected]{classname: org.antlr.runtime.RecognizerSharedState, requestingThread: Thread[MySystemClusteredScheduler_QuartzS
chedulerThread,5,QuartzScheduler:MySystemClusteredScheduler], requestingClassLoader: [email protected]{ url=file:/home/name/jboss/server/default/tmp/deploy/tmp34140system.ear ,addedOrder=48}, loadedClass: class org.a
ntlr.runti[email protected]196b1a5<CodeSource: (file:/home/name/jboss/server/default/tmp/deploy/tmp34140system.ear-contents/antlr-runtime-3.2.jar <no signer certificates>)>, loadOrder: 48, loadEx
ception: null, threadTaskCount: 0, state: 1, #CCE: 0}
2015-04-15 19:01:11,307 TRACE [LoadMgr3] End nextTask(0), [email protected]{classname: org.antlr.runtime.RecognizerSharedState, requestingThread: Thread[MySystemClusteredScheduler_QuartzSchedulerThread,5,Qua
rtzScheduler:MySystemClusteredScheduler], requestingClassLoader: [email protected]{ url=file:/home/name/jboss/server/default/tmp/deploy/tmp34140system.ear ,addedOrder=48}, loadedClass: class org.antlr.runtime.Recogni
[email protected]<CodeSource: (file:/home/name/jboss/server/default/tmp/deploy/tmp34140system.ear-contents/antlr-runtime-3.2.jar <no signer certificates>)>, loadOrder: 48, loadException: null, threa
dTaskCount: 0, state: 4, #CCE: 0}
2015-04-15 19:01:11,307 TRACE [LoadMgr3] Begin endLoadTask, [email protected]{classname: org.antlr.runtime.RecognizerSharedState, requestingThread: Thread[MySystemClusteredScheduler_QuartzSchedulerThread,5,Quart
zScheduler:MySystemClusteredScheduler], requestingClassLoader: [email protected]{ url=file:/home/name/jboss/server/default/tmp/deploy/tmp34140system.ear ,addedOrder=48}, loadedClass: class org.antlr.runtime.Recognize
[email protected]<CodeSource: (file:/home/name/jboss/server/default/tmp/deploy/tmp34140system.ear-contents/antlr-runtime-3.2.jar <no signer certificates>)>, loadOrder: 48, loadException: null, threadT
askCount: 0, state: 4, #CCE: 0}
2015-04-15 19:01:11,307 TRACE [RepositoryClassLoader] release(1) for :[email protected]{ url=file:/home/name/jboss/server/default/tmp/deploy/tmp34140system.ear ,addedOrder=48}
2015-04-15 19:01:11,307 TRACE [RepositoryClassLoader] released, holds: 0
2015-04-15 19:01:11,307 TRACE [RepositoryClassLoader] loadClass [email protected]{ url=file:/home/name/jboss/server/default/tmp/deploy/tmp34140system.ear ,addedOrder=48} name=org.antlr.runtime.RecognizerSharedState class=class org.antlr.runtime.RecognizerSharedState [email protected]{ url=file:/home/name/jboss/server/default/tmp/deploy/tmp34140system.ear ,addedOrder=48}
2015-04-15 19:01:11,307 TRACE [RepositoryClassLoader] loadClass [email protected]{ url=file:/home/name/jboss/server/default/tmp/deploy/tmp34140system.ear ,addedOrder=48} name=org.antlr.runtime.BitSet, loadClassDepth=0
2015-04-15 19:01:11,307 TRACE [RepositoryClassLoader] Loaded class from cache, [email protected]<CodeSource: (file:/home/name/jboss/server/default/tmp/deploy/tmp34122OTHER_SYSTEM.ear-contents/antlr-runtime-3.0.jar <no signer certificates>)>
2015-04-15 19:01:11,307 TRACE [RepositoryClassLoader] loadClass [email protected]{ url=file:/home/name/jboss/server/default/tmp/deploy/tmp34140system.ear ,addedOrder=48} name=org.antlr.runtime.BitSet class=class org.antlr.runtime.BitSet [email protected]{ url=file:/home/name/jboss/server/default/tmp/deploy/tmp34122OTHER_SYSTEM.ear ,addedOrder=45}
2015-04-15 19:01:11,309 ERROR [ErrorLogger] An error occured instantiating job to be executed. job= 'DEFAULT.package.quartz.WsclFailureJob'
org.quartz.SchedulerException: Problem instantiating class 'package.quartz.WsclFailureJob' - [See nested exception: java.lang.NoSuchMethodError: org.antlr.runtime.Lexer.<init>(Lorg/antlr/runtime/CharStream;Lorg/antlr/runtime/RecognizerSharedState;)V]
at org.quartz.core.JobRunShell.initialize(JobRunShell.java:147)
at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:364)
Caused by: java.lang.NoSuchMethodError: org.antlr.runtime.Lexer.<init>(Lorg/antlr/runtime/CharStream;Lorg/antlr/runtime/RecognizerSharedState;)V
at package.cond.antlr.CondLexer.<init>(CondLexer.java:55)
at package.cond.antlr.CondLexer.<init>(CondLexer.java:52)
at package.cond.ExpressionFactory.getValue(ExpressionFactory.java:58)
at package.core.Configuration$ConfigInternal.loadParsableParams(Configuration.java:204)
at package.core.Configuration$ConfigInternal.reload(Configuration.java:172)
at package.core.Configuration$ConfigInternal.<init>(Configuration.java:161)
at package.core.Configuration.reload(Configuration.java:56)
at package.core.Configuration.<init>(Configuration.java:47)
at package.core.Configuration.<clinit>(Configuration.java:38)
at package.core.ScenarioProcessor.<init>(ScenarioProcessor.java:71)
at package.core.ScenarioProcessor.<clinit>(ScenarioProcessor.java:58)
at package.quartz.WsclFailureJob.<init>(WsclFailureJob.java:22)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:494)
at java.lang.Class.newInstance0(Class.java:350)
at java.lang.Class.newInstance(Class.java:303)
at org.quartz.simpl.SimpleJobFactory.newJob(SimpleJobFactory.java:55)
at org.quartz.core.JobRunShell.initialize(JobRunShell.java:140)
ich war auch Quarz Eigenschaften wie der Versuch:
org.quartz.scheduler.classLoadHelper.class=org.quartz.simpl.CascadingClassLoadHelper
org.quartz.scheduler.threadsInheritContextClassLoaderOfInitializer=true
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
Sie können einen Weg finden, Ihren eigenen Classloader in Code einzubringen. Abhängig davon, wie viel Kontrolle Sie haben, könnten Sie eine Fabrik erstellen, die die Klasse manuell aus dem gewünschten Verzeichnis lädt – kolossus
Ich dachte darüber nach, aber ich dachte, dass existiert eine bessere Idee ... Es sieht aus wie eine Umgehungslösung ... –