Скомпилированный EAR Java 8, содержащий EJB, вызывает java.lang.NoClassDefFoundError в Payara - PullRequest
0 голосов
/ 06 апреля 2019

Я работаю над проектом Maven Java EE, который существует уже довольно давно (10 лет и более) и в настоящее время включен в Java 7 - он работает на Glassfish 3.1.2 в настоящее время, и я работаю черезIntelliJ через EAR-файл, содержащий несколько jar-файлов, включая jar-файл EJB.

Я пробовал несколько путей миграции, которые, можно надеяться, приведут проект в поддерживаемую версию Java (в 8, но, надеюсь, и далее, черезнесколько детских шагов).До сих пор я пробовал и Glassfish, и Payara 4.1.

Проект успешно скомпилируется в Java 8 (JDK1.8.0_181), но при попытке развертывания на работающем сервере я получаю несколькоошибки разбивки - все они относятся к классам EJB по одному и тому же шаблону:

 Error in annotation processing: {0}.
java.lang.NoClassDefFoundError: my/module/class/ejb/path/SomeClass
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at com.sun.enterprise.loader.ASURLClassLoader.findClass(ASURLClassLoader.java:807)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at com.sun.enterprise.loader.CurrentBeforeParentClassLoader.loadClass(CurrentBeforeParentClassLoader.java:83)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at com.sun.enterprise.loader.ASURLClassLoader.findClass(ASURLClassLoader.java:807)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at com.sun.enterprise.loader.CurrentBeforeParentClassLoader.loadClass(CurrentBeforeParentClassLoader.java:83)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at com.sun.enterprise.deployment.annotation.impl.ModuleScanner.getElements(ModuleScanner.java:295)
    at com.sun.enterprise.deployment.archivist.Archivist.processAnnotations(Archivist.java:592)
    at com.sun.enterprise.deployment.archivist.Archivist.readAnnotations(Archivist.java:461)
    at com.sun.enterprise.deployment.archivist.Archivist.readAnnotations(Archivist.java:445)
    at com.sun.enterprise.deployment.archivist.Archivist.readRestDeploymentDescriptors(Archivist.java:417)
    at com.sun.enterprise.deployment.archivist.Archivist.openWith(Archivist.java:290)
    at com.sun.enterprise.deployment.archivist.ApplicationFactory.openWith(ApplicationFactory.java:232)
    at org.glassfish.javaee.core.deployment.DolProvider.processDOL(DolProvider.java:189)
    at org.glassfish.javaee.core.deployment.DolProvider.load(DolProvider.java:223)
    at org.glassfish.javaee.core.deployment.DolProvider.load(DolProvider.java:91)
    at com.sun.enterprise.v3.server.ApplicationLifecycle.loadDeployer(ApplicationLifecycle.java:882)

Я пробовал несколько разных вещей, суммируемых как:

  • Все отлично работает на Glassfish 3.1.2 с JDK 1.7_080, но есть некоторые «предупреждения», подобные приведенным выше, но они не влияют на развертывание

  • Ни то, ни другоеPayara 4.1.2 или Glassfish 4.1.1 будут загружаться при использовании JDK 1.7_080

  • Я пытался скомпилировать с maven-ejb-plugin 3.1 и без него, используя addClassPath, вручную проверяя EJBmanifest.mf на наличие пути к классам (с и без).

  • Я проверил содержимое развертывания приложения домена на наличие перечисленных классов - они существуют, находятся в JAR-файлахв EAR (взорвался и в противном случае) и находятся в правильном направлениикатион.

  • Я пытался быть более явным в зависимостях для модуля EJB, устанавливая версии, на всякий случай.

У меня почти закончились идеис этим.

Я признаю, что EJB и Maven - не мой предмет специалиста, но каждый ресурс до сих пор приводил меня к решениям, которые не являются причиной - есть ли что-то еще, что я должен попробовать?

Редактировать / обновить

Некоторые дополнительные отладки в ClassLoader позволяют предположить, что пути к классам разрешаются, например, glassfish/domains/mydomain/applications/lib/commons-net.jar.

Нет *Каталог 1048 * в приложениях, только мой каталог My-Application-1.0-SNAPSHOT, содержащий META-INF и каталог базового пакета (uk).Однако каталог lib присутствует в каталоге target моего проекта (вместе с файлами META-INF и файлами war / jar).

1 Ответ

0 голосов
/ 07 апреля 2019

Довольно просто, оказалось, что родительский EAR не строился правильно перед развертыванием - ключ был в последнем бите, где содержимое папки приложения в папке 'domain' Payara / Glassfish не выглядело как представитель EAR.

В конце концов я обнаружил это путем отладки, а не просто поиска в Google, что оказалось вполне разумной ошибкой, поэтому, вероятно, есть урок.

Исправлен EAR, развернуто и все работало.

...