سؤال

كجزء من ترقية من JBOSS 4.0.4 إلى 5.1 ، أحاول الحصول على حرب للنشر بعد نشر الأذن بنجاح. JBoss 5.x لا يدعم prefixDeploymentorter مثل 4.x ، مما يعني أنه يجب علي استخدامu003Cdepends> في الحرب jboss-web.xml.

يبدو أنا لا يمكن الاعتماد على الأذن نفسها ، لذلك اخترت آخر EJB تم نشره بدلاً من ذلك. يوفر هذا EJB إدخال JNDI الذي تحتاجه الحرب.

إليك EJB أثناء نشرها عندما تكون الحرب غائبة عن دليل النشر:

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>

مشكلتي هي: تبدأ الحرب في النشر مباشرة بعد "بدء 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)

بعد انتهاء الحرب من نشرها ، تواصل MyFacade بسعادة (بسخرية؟) نشرها ويربط إدخالات JNDI.

إذا قمت بنشر الحرب بعد نشر الأذن ، فكل شيء يعمل على النحو المقصود.

حتى أنني فكرت في الاعتماد على EJB وهمية في الأذن ، واستخدامu003Cmodule-order> حازمu003C/module-order> في jboss-app.xml لإجباره على التحميل كوحدة نمطية الأخيرة. لكن للأسف ، JBoss 5.x لا يدعم ذلك أيضاً. دوه!

هل هناك طريقة للاعتماد على إدخال JNDI نفسه؟ هل هناك طرق أخرى لحل هذا؟

هل كانت مفيدة؟

المحلول

إليك كيف يمكنك تحقيق ذلك على JBoss 5.1.x.

أولاً ، أضف ملفًا يسمى aliases.txt داخل ال META-INF دليل أذنك. يجب أن يحتوي هذا الملف فقط على سطر واحد له اسم / معرف تعسفي لأذنك. على سبيل المثال ، إذا كان لديك my-ear.ear META-INF/aliases.txt يمكن أن يحتوي الملف على "الأذن". يجب أن يكون شيئًا لا يصطدم به أي أسماء مستعارة أخرى معلنة من قبل التطبيقات الأخرى التي تم نشرها على نفس الخادم.

بعد ذلك ، أضف أ jboss-dependency.xml ملف إلى META-INF دليل حربك ، التي تحتوي على ما يلي (التغلب على "الأذن" للاسم المستعار الذي أنشأته أعلاه):

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

سيضمن هذا أن يتم نشر الأذن قبل الحرب.

أيضًا ، إذا حاولت نشر الحرب دون وجود الأذن ، فسيقوم JBOSS بتسجيل رسالة خطأ في النشر واضحة تخبرك عن التبعية المفقودة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top