У меня есть приложение, которое должно работать как на JBoss EAP 6.4, так и на 7.0. Приложение использует объектные компоненты EJB, которые больше не поддерживаются в JBoss EAP 7, поэтому объектные компоненты переносятся на использование объектов JPA, как описано в руководстве по миграции JBoss. Приложение развертывается и работает нормально в версии 6.4, но не может развернуться из-за ошибки «Отсутствуют зависимости» в версии 7.0. Я видел множество проблем, когда отсутствующая зависимость была источником данных, но, похоже, здесь это не так. Источник данных вообще не упоминается в ошибке недостающих зависимостей. Я вижу в журналах, что файл persistence.xml анализируется и привязки jndi добавляются для сессионных компонентов до того, как развертывание завершится неудачей.
У меня есть файл EAR, содержащий несколько файлов jar war и ejb. Приложение, с которым у меня возникла проблема, состоит из файла ejbModule.jar, который содержит файл persistence.xml и классы сущностей, и файла webModule.war с классами taglib, которые ссылаются на классы сущностей, содержащиеся в ejbModule.jar.
Структура файла EAR представлена ниже:
MyEAR.ear
- ejbJar.jar
- webApp1.war
- webApp2.war
- ejbModule.jar (содержит persistence.xml и классы сущностей)
- META-INF / persistence .xml
- webModule.jar (классы taglib зависят от классов сущностей из ejbModule.jar)
- META-INF
persistence.xml: (заменены имена классов, имя источника данных, имя единицы сохранения состояния)
<persistence version="2.0" xmlns:per="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="myPU">
<class>org.MyEntity1</class>
<class>org.MyEntity2</class>
<jta-data-source>java:/MyDataSource</jta-data-source>
<properties>
<property name="jboss.entity.manager.jndi.name" value="java:/myPU"/>
<property name="jboss.entity.manager.factory.jndi.name" value="java:/myPU"/>
</properties>
</persistence-unit>
It's difficult to post the error message as it's got hundreds of lines of "missing dependencies" for class names and application names that I can't share and by the time I replace them all I don't feel it would be of much use. But there are entries like:
"jboss.naming.context.java.comp.MyEAR.ejbModule.MyEntity1.InAppClientContainer отсутствует [jboss.naming.context.java.comp.MyEAR.ejbModule.MyEntity1]",
Однако есть и такие записи, как:
"jboss.deployment.subunit. \" MyEAR.ear \ ". \" webApp1.war \ ". component. \" org.taglib.MyTagLibClass \ ". START отсутствует [jboss.persistenceunit. \" MyEAT. ухо / ejbModule.jar # myPU \ "]"
Из журнала DEBUG для org.jboss.as.jpa я вижу, что JBoss, похоже, добавляет зависимости от блока сохранения состояния для всех классов taglib во все файлы войны в ухе. Только webModule.war должен использовать блок сохранения состояния.
2017-12-07 15: 37: 13,808 DEBUG [org.jboss.as.jpa] (поток службы MSC 1-2) Добавление зависимости от службы службы PU jboss.persistenceunit. "MyEAR.ear # myPU" для компонента org.taglib.MyTagLibClass
Когда я перемещаю файл persistence.xml в каталог META-INF EAR, приложение развертывается и отлично работает на JBoss EAP 7.0. Однако это не идеальное решение, поскольку файл EAR создается динамически и может содержать пользовательские приложения, над которыми у меня нет контроля. Я пробовал различные другие структуры, чтобы попытаться заставить это работать, но не нашел ничего другого, что работает.
Есть идеи, как заставить это работать на JBoss EAP 7.0?