Ошибка при развертывании уха на Glassfish - PullRequest
1 голос
/ 03 августа 2010

У нас есть EAR с 3 модулями EJB.Я пытаюсь выполнить развертывание на Glassfish, но у меня возникла ошибка, которую я не могу объяснить или определить, как лучше всего определить.

[#|2010-08-03T14:39:15.570+0100|INFO|glassfish3.0.1|javax.enterprise.system.tools.deployment.org.glassfish.deployment.common|_ThreadID=28;_ThreadName=Thread-1;|[AutoDeploy] Selecting file /export/home/myapp/apps/domains/myapp/autodeploy/App-ear.ear for autodeployment.|#]

[#|2010-08-03T14:39:18.654+0100|WARNING|glassfish3.0.1|javax.enterprise.system.tools.deployment.org.glassfish.deployment.common|_ThreadID=28;_ThreadName=Thread-1;|Error in annotation processing: java.lang.NoClassDefFoundError: com/company/app/controller/IMessagingProcessor|#]

[#|2010-08-03T14:39:20.470+0100|SEVERE|glassfish3.0.1|global|_ThreadID=28;_ThreadName=Thread-1;|Class [ Lcom/company/app/jms/IJmsSessionFactory; ] not found. Error while loading [ class com.company.app.eventprocessor.provider.EventProvider ]|#]

Я проверил классы, упомянутые в ClassNotFoundException, и они определенно находятся в Jarв ухе, и у меня нет проблем компиляции в Eclipse / Maven.

D:\Repository\App\AppEA\App-ear\target\App-ear.ear\CoreJms-1.0-SNAPSHOT.jar\com\company\app\controller\IMessagingProcessor.class

D:\Repository\App\AppEA\App-ear\target\App-ear.ear\EventProcessor-ejb-1.0-SNAPSHOT.jar\com\company\app\eventprocessor\provider\EventProvider.class

Любые указатели очень ценятся.

Джеймс

1 Ответ

4 голосов
/ 03 августа 2010

На самом деле, вы не получаете ClassNotFoundException, вы получаете NoClassDefFoundError, и я подозреваю, что некоторые зависимости отсутствуют, как предполагает:

Class [ Lcom/company/app/jms/IJmsSessionFactory; ] not found. Error while loading [ class com.company.app.eventprocessor.provider.EventProvider 

Где это com.company.app.jms.IJmsSessionFactory?


Теперь я сократил слух до одного модуля ejb и получаю NoClassDef для Lorg / apache / log4j / Logger, однако jar log4j также находится в ухе. Такое ощущение, что я, должно быть, здесь упускаю что-то фундаментальное?

Где именно log4j.jar точно? В /lib? Можете ли вы показать структуру вашего EAR? И, пожалуйста, также покажите MANIFEST.MF вашего EJB-JAR.

На всякий случай вот соответствующая цитата из Упаковка EJB 3 Applications :

Упаковка EJB-JAR

...

Файл EJB-JAR должен содержать интерфейсы и классы бинов. Это может также включите любые вспомогательные классы. При желании вспомогательные классы могут быть упакован в отдельный файл JAR в EAR файл. У вас есть два варианта:

  • JAR, содержащий вспомогательные классы, может быть упакован в каталог lib файла EAR. Используя этот подход, упакованные классы будут автоматически виден всем модулям в модуле EAR.
  • Если вы хотите ограничить видимость только определенным EJB-JAR или WAR модуль, вы можете создать запись в Manifest.mf файл модуля, который содержит атрибут Class-Path к JAR-файл.

Теперь, когда вы знаете структуру EJB-JAR и как его упаковать, давайте посмотрите на элементы ejb-jar.xml.


Судя по вашим комментариям, я понимаю, что понимаю мою проблему. Казалось бы, я неправильно упаковываю ухо, я не думаю, что на зависимости maven ссылаются правильно. Если я просто создаю свой ejb jar, он не включает ни одного из зависимых jar. Должен ли я указать что-то в помпе, чтобы включить jars ejb-jar? У меня есть плагин сборки <artifactId>maven-ejb-plugin</artifactId> и комплектация <packaging>ejb</packaging>.

Объединение зависимостей в EJB-JAR не поддерживается (см. MEJB-3 ), в основном потому, что jar-inside-jar не является частью JAR-спецификации (и может быть поддерживается всеми контейнерами EJB) и не соответствует рекомендациям Sun относительно упаковки J2EE в целом.

Таким образом, хотя вы можете игнорировать это правило (см. этот трюк или этот ), стандартным способом было бы упаковать EJB-JAR и все JAR-файлы, от которых он зависит, в ухо. Это моя рекомендация, и я думаю, что этот пост может помочь: Потому что я всегда забываю, как использовать maven-ear-plugin .

...