JBoss: file WAR in EAR non può trovare la libreria JAR sul classpath
-
19-09-2019 - |
Domanda
Sto avendo problemi durante la distribuzione di un orecchio con le guerre in bundle, barattoli, e file di configurazione (file .properties) su JBoss 4.3-EAP. Ecco la mia struttura dell'orecchio:
+app.ear
+lib
*.jar libraries that the war's use
+classes
*.properties and other configuration files
+META-INF
application.xml
jbos-app.xml
app.war
app2.war
appn.war
Ho il seguente nel mio jboss-app.xml:
<jboss-app>
<jmx-name>app.startup.JbossStartUpServer:service=JbossStartUpService</jmx-name>
</jboss-app>
Il mio application.xml si presenta così:
<application id="app_id">
<display-name>App>/display-name>
<description>TheApp>/description>
<!--
<module id="core">
<java>lib/core.jar</java>
</module>
<module id="tag">
<java>lib/tag.jar</java>
</module>
-->
<module id="app">
<web>
<web-uri>app.war</web-uri>
<context-root>/</context-root>
</web>
</module>
<module id="app2">
<web>
<web-uri>app2.war</web-uri>
<context-root>/app2</context-root>
</web>
</module>
<module id="appn">
<web>
<web-uri>appn.war</web-uri>
<context-root>/appn</context-root>
</web>
</module>
<security-role id="secRole">
<description>users</description>
<role-name id="appRoleName">users</role-name>
</security-role>
<library-directory>lib</library-directory>
</application>
In sostanza, dopo la distribuzione l'orecchio, mi imbatto in un problema in cui uno dei miei guerre non si può trovare una classe nel file core.jar
(java.lang.NoClassDefFoundErro
r). Penso che questo sia dovuto al fatto che la guerra non è trovare questa libreria, anche se è nella cartella lib
/ percorso di classe. Se provo a rimuovere il commento i primi due moduli per aggiungere le prime biblioteche partito (core.jar
e tag.jar
), tutto ad un tratto i file di proprietà non è più possibile trovare (si trovano, per ora, in lib/classes
, in modo che, spero in ogni caso , vengono raccolti dal programma di caricamento classe. Idealmente mi piacerebbe mettere le classi nella propria directory e aggiungerlo al classpath separatamente, ma per ora mi sto solo cercando di fare questo lavoro).
Ho provato alcune altre cose, tra cui l'aggiunta manualmente core.jar
nel file manifest.mf
della guerra, cambiando UseJBossWebLoader
a true nel file jboss-service.xml
sotto il jboss-web.deployer
, e varie combinazioni di quanto sopra, o nessun successo. Mi sia perdo la directory classes
dal percorso di classe (cartella lib
) e nessuno dei miei file di proprietà ottenere raccolti, o la guerra non può accedere alla classe corretta dal vaso. Penso che ci deve essere qualche configurazione che è sbagliato, e mentre Ho provato a leggere sul modo in cui JBoss fa implementazioni orecchio e classloading, io non riesco a adattarlo alla mia configurazione attuale.
Qualche suggerimento sarebbe molto apprezzato.
Qui ci sono alcuni siti che mi sono stati a guardare:
Raible Design JBoss ClassLoader Logic
Questi sono solo alcuni dei siti che ho guardato. I problemi potrebbero derivano dalla configurazione del progetto e, in quanto questo è un grande progetto stabilito che è (in misura) essendo migrazione da una distribuzione weblogic a Jboss. Quindi, se c'è qualcosa che dovrebbe funzionare, ma non lo fa, potrebbe essere un problema con alcune delle configurazione di codice / progetto. Purtroppo, non sono al punto in cui ancora posso dire se un problema correlato JBoss, o un problema con il progetto.
Soluzione
Il tag <library-directory>
in application.xml
è una caratteristica JavaEE5, e non credo che JBoss 4.3 è completamente JavaEE5-compliant (si può fare EJB3, sì, ma è solo un supporto parziale).
Quindi è necessario tornare ad usare i file JAR esplicitamente dichiarate:
<module>
<java>lib/core.jar</java>
</module>
Per quanto riguarda i file proprietà, è necessario aggiungere la directory che sono in come modulo Java, quindi per il tuo esempio:
<module>
<java>lib/classes</java>
</module>