2015-04-15 26 views
9

Ho due orecchie distribuite su un'istanza di jboss. Sto usando il quarzo configurato all'interno di mbean. Entrambe le orecchie utilizzano StatefulJobs. Sfortunatamente si sta usando la libreria antlr-runtime-3.0, ma la seconda antlr-runtime-3.2. Quando JBoss sta invocando il lavoro prende la libreria sbagliata. Non so come costringerlo a usare la biblioteca dall'orecchio. La mia versione al quarzo è aggiornata alla 1.8.6. JBoss è 4.2.2 GAjava.lang.NoSuchMethodError durante il richiamo del processo al quarzo dichiarato all'interno di jboss mbean

mia prima struttura dell'orecchio:

  • META-INF

  • antlr-runtime-3.0.jar

  • ejb.jar
  • app .war

La mia seconda struttura dell'orecchio:

  • 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 

Cercavo anche con java2ParentDelegation impostata su true, ma non funziona . Quando aggiungo questo file per proiettare il mio quarzo invocando da jboss, restituisco mi ClassNotFoundError durante il recupero del lavoro da quartz_table. Senza questo file tutto funziona bene, ma quando su jboss è distribuita una sola applicazione.

Stack con 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 senza jboss-app.xml. Applicazione funziona bene quando v'è un solo distribuito su JBoss:

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 

Pila senza jboss-app.xml, ma in caso di 2 applicazioni distribuite con diverse versioni della libreria di runtime antlr-:

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) 

cercavo anche proprietà quarzo come:

org.quartz.scheduler.classLoadHelper.class=org.quartz.simpl.CascadingClassLoadHelper 
org.quartz.scheduler.threadsInheritContextClassLoaderOfInitializer=true 
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true 
+1

È possibile trovare un modo per introdurre il proprio classloader nel codice. A seconda di quanto controllo hai, puoi creare una factory che carica manualmente la classe dalla directory desiderata – kolossus

+0

Ci stavo pensando, ma ho pensato che esista un'idea migliore ... Sembra una soluzione ... –

risposta

3

Quando si dispone di due orecchie separate che hanno dipendenze in conflitto, può aiutare a isolare loro in termini di classloader.JBoss 4 è considerato piuttosto vecchio questi giorni, ma le caratteristiche richieste erano disponibili fin da 3.0.2 a quanto pare:

http://www.mastertheboss.com/jboss-server/jboss-configuration/jboss-classloader-issues

+0

On lo stesso JBoss, oltre a queste due applicazioni orecchio ho anche implementato altre applicazioni: war & ear. Quindi sono 4 applicazioni. Inoltre, stavo tentando di separare classLoaders dalla configurazione xml, ma non funziona. Pubblico la mia configurazione xml per app. Non riesco a impostare le orecchie isolate per tutte le app perché stanno utilizzando quarzo mbeans e quindi il quarzo non sarà in grado di vedere le classi di lavoro (stavo cercando di farlo e avevo NoClassLoadersFound Exception). –

+0

Penso che il quarzo non vedendo le classi possa essere in realtà un effetto collaterale del lavoro di isolamento. Ci sono documenti e discussioni a riguardo (ad esempio http://goo.gl/zn8v3U), le persone suggeriscono di definire la proprietà di configurazione Quartz org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true –

+0

Ho aggiornato la descrizione del problema sulla configurazione del mio quarzo. Sfortunatamente non mi aiuta. Con il quarzo loader di classe isolato guidato da JBoss non vedo le mie lezioni. Puoi leggerlo dal secondo stack: "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] Classe in lista nera, nome = pacchetto.quartz.WsclFailureJob " –

2

Questo a causa della più recente classe compilata e vaso dipendente disponibili nell'applicazione sono di diversa versione. Per esempio: Sia la Classe A compilata con il vaso dipendente X in posizione, poi la stessa Classe A compilata in un ambiente diverso con il vaso dipendente X1 che consiste in un nuovo metodo chiamato Y. ora la classe verrà compilata perché il nuovo metodo Y è disponibile in jar X1 quando la stessa classe A viene utilizzata nell'ambiente con jar X in posizione, quindi porta all'eccezione NoSuchMethod quando si tenta di caricare la classe nella memoria della classe. Classloader esegue la verifica delle classi dipendenti prima di caricare la classe nella memoria della classe prima di richiamare l'esecuzione reale.

+0

Ok, ma non ho idea di come sistemarlo e di tenere due orecchie? Ho deciso di cambiare progetto ear in war one, ma in questo modo ho meno possibilità di usare endpoint EJB e ho dovuto usare manualmente il quarzo attraverso la mia applicazione (non attraverso Jboss Container) –

+0

Due orecchie che parlano qui sopra sono versioni diverse della stessa applicazione? –

+0

No, sono diverse applicazioni che usano versioni diverse della stessa libreria, ma i loro lavori sono invocati da quarzo che è controllato dallo stesso contenitore (JBoss) e questo è il problema. –