Могу ли я сделать WAR зависеть от записи JNDI в JBoss 5.1? - PullRequest
4 голосов
/ 25 марта 2010

В рамках обновления с JBoss 4.0.4 до 5.1 я пытаюсь получить WAR для развертывания после успешного развертывания EAR. JBoss 5.x не поддерживает PrefixDeploymentSorter , как 4.x, что означает, что я должен использовать в WAR-файле jboss-web.xml.

Кажется, я не могу зависеть от самого EAR , поэтому я выбираю последний развернутый EJB. Этот EJB предоставляет запись JNDI, которая нужна WAR.

Вот EJB, который развертывается, когда WAR отсутствует в каталоге развертывания:

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

А вот зависимый фрагмент из jboss-web.xml:

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

Моя проблема: WAR начинает развертываться сразу после «STARTED EJB:», то есть до того, как MyFacadeBean привязан к JNDI, что приводит к сбою развертывания бина:

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)

После того, как WAR завершил развертывание, MyFacade счастливо (насмешливо?) Продолжает развертывание и связывает записи JNDI.

Если я развернул WAR-файл после развертывания EAR, все будет работать так, как задумано.

Я даже думал о зависимости от фиктивного EJB-компонента в EAR и использовании strict </ module-order> в jboss-app.xml, чтобы заставить его загружаться как последний модуль. Но, увы, JBoss 5.x также не поддерживает . Doh!

Есть ли способ зависеть от самой записи JNDI? Есть ли другие способы решения этой проблемы?

1 Ответ

2 голосов
/ 06 декабря 2012

Вот как вы можете добиться этого на JBoss 5.1.x.

Сначала добавьте файл с именем aliases.txt в каталог META-INF вашего EAR. Этот файл должен содержать только одну строку с произвольным именем / идентификатором для вашего EAR. Например, если у вас есть my-ear.ear, ваш META-INF/aliases.txt файл может содержать «my-ear». Это просто должно быть то, что не будет конфликтовать с другими псевдонимами, объявленными другими приложениями, развернутыми на том же сервере.

Далее, добавьте файл jboss-dependency.xml в каталог META-INF вашей WAR, содержащий следующее (заменяя «my-ear» для псевдонима, который вы создали выше):

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

Это обеспечит развертывание EAR до начала WAR.

Кроме того, если вы попытаетесь развернуть WAR без присутствия EAR, JBoss запишет ясное сообщение об ошибке развертывания, сообщающее о отсутствующей зависимости.

...