WAR не может получить доступ к классам, определенным в EJB.jar (определен jboss-deploy-structure.xml)

В сети есть и другие подобные вопросы, но ни один из них не дает конкретного ответа на вопрос, почему классы определены в ejb-jar-1.jar не доступны из WAR. Итак, вот моя установка:

Проблема: невозможно получить доступ к классам в ejb-jar-1.jar от app-war.war, Ниже jboss-deployment-structure.xml и структура EAR у меня на месте.

Информация о развертывании

* JBOSS 7.1.1.FINAL
* Uses seam framework: jboss-seam-2.2.1.CR2.jar
* Uses Hibernate 3.4.0.GA

Основной-ear.ear

|__META-INF
|   |____jboss-deployment-structure.xml
|   |____application.xml
|   |____jboss-app.xml
|   |____MANIFEST.MF
|__lib
|   |____somejar.jar
|   |____somejar.jar
|__ejb-jar-1.jar
|__ejb-jar-2.jar
|__jboss-seam-2.2.1.CR2.jar
|__commons-lang-2.4.jar
|__commons-codec-1.1.jar
|__jasypt-1.6.jar
|__app-war.war

JBoss развертывания-structure.xml

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
    <ear-subdeployments-isolated>false</ear-subdeployments-isolated>
    <deployment>
        <exclusions>
            <module name="javax.faces.api" slot="1.2"/>
            <module name="com.sun.jsf-impl" slot="1.2"/>
            <module name="org.hibernate" slot="main"/>
            <module name="org.hibernate.validator" slot="main"/>
            <module name="org.apache.commons.lang"/>
            <module name="org.apache.commons.collections"/>
            <module name="org.apache.commons.codec"/>
            <module name="org.picketlink" slot="main"/>
            <module name="org.picketbox" slot="main"/>
            <module name="org.javassist" slot="main"/>
            <module name="org.dom4j" slot="main"/>
        </exclusions>
        <dependencies>
            <module name="javax.faces.api" slot="1.2" export="true"/>
            <module name="com.sun.jsf-impl" slot="1.2" export="true"/>
            <module name="org.javassist" slot="1" export="true"/>
            <module name="org.apache.commons.logging" export="true"/>
        </dependencies>
    </deployment>
    <sub-deployment name="app-war.war">
        <exclusions>
            <module name="javax.faces.api" slot="main"/>
            <module name="com.sun.jsf-impl" slot="main"/>
        </exclusions>
        <dependencies>
            <module name="javax.faces.api" slot="1.2"/>
            <module name="com.sun.jsf-impl" slot="1.2"/>
            <module name="deployment.main-ear.ear.ejb-jar-1.jar" />
            <module name="deployment.main-ear.ear.ejb-jar-2.jar" />
            <module name="deployment.main-ear.ear.jboss-seam-2.2.1.CR2.jar"/>
        </dependencies>
    </sub-deployment>
    <module name="deployment.main-ear.ear.jasypt-1.6.jar" />
    <module name="deployment.main-ear.ear.commons-codec-1.1.jar" />
    <module name="deployment.main-ear.ear.commons-lang-2.4.jar" />
</jboss-deployment-structure>

application.xml

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://java.sun.com/xml/ns/j2ee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/javaee/application_6.xsd"
             version="6">
    <description>myapp</description>
    <display-name>myapp</display-name>
    <initialize-in-order>true</initialize-in-order>
    <library-directory>lib</library-directory>
    <module>
        <ejb>ejb-jar-1.jar</ejb>
    </module>
    <module>
        <ejb>ejb-jar-2.jar</ejb>
    </module>
    <module>
        <ejb>jboss-seam-2.2.1.CR2.jar</ejb>
    </module>
    <module>
        <web>
            <web-uri>app-war.war</web-uri>
            <context-root>/app</context-root>
        </web>
    </module>
</application>

2 ответа

Решение

Выше является правильным jboss-deployment-structure.xml Проблема в моем случае заключается в сбое поиска JNDI.

В случае, если это поможет кому-то еще с подобной проблемой, jboss-deploy-structure.xml не работал для меня. Я все еще получал ту же ошибку:
"WFLYEJB0405: No EJB found with interface of type"

Затем я нашел ответ @DaveB на связанной странице выше, например, JNDI Переносимость в JEE6

Затем также нашел это описание в JBoss Enterprise Application Platform 6.3 Migration Guide

Java: глобальный
Имена в этом пространстве имен являются общими для всех приложений, развернутых в экземпляре сервера приложений. Используйте имена в этом пространстве имен, чтобы найти внешние архивы EJB, развернутые на том же сервере. Ниже приведен пример пространства имен java: global: java:global/jboss-seam-booking/jboss-seambooking-jar/HotelBookingAction

Java: модуль
Имена в этом пространстве имен совместно используются всеми компонентами в модуле, например, всеми корпоративными компонентами в одном модуле EJB или всеми компонентами в веб-модуле. Ниже приведен пример пространства имен java: module: java:module/HotelBookingAction! Org.jboss.seam.e xample.booking.HotelBooking

Java: приложение
Имена в этом пространстве имен являются общими для всех компонентов всех модулей в одном приложении. Например, WAR-файл и JAR-файл EJB в одном и том же EAR-файле будут иметь доступ к ресурсам в пространстве имен java: app. Ниже приведен пример пространства имен java: app: java:app/jboss-seam-bookingjar/HotelBookingAction

И аннотировал мои bean-компоненты в WAR тем, что отображалось в журналах JBoss EAP 7/Wildfly во время развертывания, например:

Java: глобальный /NEDtoBrsMigratorEAR/NEDtoBrsMigratorEJB/NEDCustomerBuilderBean net.cableone.brsupdater.engine.NEDCustomerBuilderBeanLocal Java: приложение / NEDtoBrsMigratorEJB / NEDCustomerBuilderBean net.mycompany.brsupdater.engine.NEDCustomerBuilderBeanLocal Java: модуль / NEDCustomerBuilderBean net.mycompany.brsupdater.engine.NEDCustomerBuilderBeanLocal java:global/NEDtoBrsMigratorEAR/NEDtoBrsMigratorEJB/NEDCustomerBuilderBean java:app/NEDtoBrsMigratorEJB/NEDCustomerBuilderBean java:module/NEDCustomeran

С моим наконец выглядело как:

  //@EJB(beanName="nedCustomerBuilderBean")
  //JAVA EE6 portability change
  @EJB(lookup="java:app/NEDtoBrsMigratorEJB/NEDCustomerBuilderBean")
  NEDCustomerBuilderBeanLocal nedCustomerBuilderBean;


Любой не стесняется комментировать, является ли это правильным или неправильным способом сделать это - это просто сработало для меня, и эти проекты в сжатые сроки, поэтому у меня не было времени, чтобы обязательно найти правильный способ сделать это.

Другие вопросы по тегам