2010-03-25 21 views
4

Dans le cadre d'une mise à niveau de JBoss 4.0.4 vers la version 5.1, j'essaie de déployer un fichier WAR après le déploiement réussi d'un fichier EAR. JBoss 5.x ne supporte pas PrefixDeploymentSorter comme 4.x fait, ce qui signifie que je dois utiliser < dépend de > dans le fichier jboss-web.xml du WAR.Puis-je faire dépendre une WAR d'une entrée JNDI dans JBoss 5.1?

Il semble que je suis lui-même cannot depend on the EAR, donc je choisis le dernier EJB déployé à la place. Cet EJB fournit une entrée JNDI dont le WAR a besoin.

est ici l'EJB qu'il déploie lorsque la guerre est absente du répertoire deploy:

2010-03-25 10:47:30,348 INFO [org.jboss.ejb3.session.SessionSpecContainer] (main) Starting jboss.j2ee:ear=my-ear.ear,jar=mypackage-ejb.jar,name=MyFacadeBean,service=EJB3 
2010-03-25 10:47:30,350 INFO [org.jboss.ejb3.EJBContainer] (main) STARTED EJB: my.package.MyFacadeBean ejbName: MyFacadeBean 
2010-03-25 10:47:30,371 INFO [org.jboss.ejb3.proxy.impl.jndiregistrar.JndiSessionRegistrarBase] (main) Binding the following Entries in Global JNDI: 

     my/MyFacade/local - EJB3.x Default Local Business Interface 
     my-ear/MyFacadeBean/local-my.package.MyFacade - EJB3.x Local Business Interface 

Et voici l'dépend extrait de jboss-web.xml:

<depends>jboss.j2ee:ear=my-ear.ear,jar=mypackage-ejb.jar,name=MyFacadeBean,service=EJB3</depends> 

Mon problème est: Le WAR commence à se déployer immédiatement après "STARTED EJB:", c'est-à-dire avant que MyFacadeBean soit lié à JNDI, ce qui provoque l'échec des déploiements de beans:

2010-03-25 10:47:39,068 ERROR [my.facade.FacadeFactory] (main) MyFacade not bound 
2010-03-25 10:47:39,069 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[my.host.no].[/]] (main) StandardWrapper.Throwable 
java.lang.ExceptionInInitializerError 
     at java.lang.Class.forName0(Native Method) 
     at java.lang.Class.forName(Class.java:164) 
     at my.freemarker.servlet.FreemarkerController.setupPojoServiceFactory(FreemarkerController.java:621) 
[...] 
Caused by: java.lang.RuntimeException: javax.naming.NameNotFoundException: MyFacade not bound 
     at my.facade.FacadeFactory.getFacade(FacadeFactory.java:61) 

Une fois que le déploiement du déploiement de la guerre est terminé, MyFacade continue (avec moquerie?) À poursuivre son déploiement et à lier les entrées JNDI.

Si je déploie à chaud le fichier WAR après le déploiement du fichier EAR, tout fonctionne comme prévu.

J'ai même pensé en fonction d'un EJB factice dans l'oreille, et en utilisant le module <ordre> strict </module de commande > dans jboss-app.xml pour le forcer à charger que le dernier module. Mais hélas, JBoss 5.x does not support that soit. Doh!

Existe-t-il un moyen de dépendre de l'entrée JNDI elle-même? Existe-t-il d'autres moyens de résoudre ce problème?

Répondre

2

Voici comment vous pouvez réaliser ceci sur JBoss 5.1.x.

D'abord, ajoutez un fichier appelé aliases.txt dans le répertoire META-INF de votre fichier EAR. Ce fichier ne devrait contenir qu'une seule ligne avec un nom/identifiant arbitraire pour votre EAR. Par exemple, si vous avez my-ear.ear, votre fichier META-INF/aliases.txt peut contenir 'my-ear'. Il doit juste être quelque chose qui ne sera pas incompatible avec d'autres alias déclarés par d'autres applications déployées sur le même serveur.

Ensuite, ajoutez un fichier jboss-dependency.xml dans le répertoire META-INF de votre WAR, contenant les éléments suivants (subsituting « my-oreille » pour l'alias créé ci-dessus):

<dependency xmlns="urn:jboss:dependency:1.0"> 
    <item whenRequired="Real" dependentState="Create">my-ear</item> 
</dependency> 

Cela permettra d'assurer l'AER est déployé Avant la guerre. En outre, si vous essayez de déployer le fichier WAR sans le fichier EAR, JBoss consignera un message d'erreur de déploiement clair indiquant la dépendance manquante.

+0

Génial, merci! La plupart de nos clients sont passés à AS7/EAP6 maintenant, mais c'était néanmoins bon à savoir. – neu242