包含EJB的Java 8 Compiled EAR导致Payara中的java.lang.NoClassDefFoundError

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了包含EJB的Java 8 Compiled EAR导致Payara中的java.lang.NoClassDefFoundError相关的知识,希望对你有一定的参考价值。

我正在开发一个Maven Java EE项目,该项目已经存在了很长时间(10年以上),目前由Java 7封装 - 它目前在Glassfish 3.1.2上运行,我正在通过IntelliJ运行包含多个jar的EAR文件,包括EJB jar。

我一直在尝试一些迁移路径,这些路径可以将项目引入支持的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)

我尝试了一些不同的东西,总结如下:

  • 所有在使用JDK 1.7_080的Glassfish 3.1.2上运行都很好,但有一些类似于上面的“警告”,但它们不会影响部署
  • 当设置为使用JDK 1.7_080时,Payara 4.1.2和Glassfish 4.1.1都不会加载
  • 我尝试使用maven-ejb-plugin 3.1使用和不使用addClassPath进行编译,手动检查EJB manifest.mf是否存在类路径(有和没有)。
  • 我检查了域的应用程序部署内容是否存在列出的类 - 它们存在,在JAR中,在EAR中(爆炸和其他)并且位于正确的位置。
  • 我试图通过设置版本在EJB模块的依赖项中更明确,以防万一。

我已经完成了很多想法。

我承认EJB和Maven不是我的专业主题,但到目前为止,每一种资源都让我找到了不是原因的解决方案 - 我还有什么需要尝试的吗?

编辑/更新

ClassLoader中的一些额外调试表明Classpath正在解析,例如glassfish/domains/mydomain/applications/lib/commons-net.jar

应用程序中没有/lib/目录,只有我的My-Application-1.0-SNAPSHOT目录,包含META-INF和基本包dir(uk)。然而,lib目录存在于我项目的target目录中(与META-INF目录和war / jar文件一起)。

答案

相当简单,事实证明,在部署之前,父EAR没有正确构建 - 线索是最后一点,Payara / Glassfish的'domain'文件夹中的应用程序文件夹的内容看起来并不代表EAR。

我最终通过调试发现了这一点,而不是仅仅通过谷歌搜索一个完全合理的错误,因此可能会有一个教训。

修复了EAR,已部署且全部工作。

以上是关于包含EJB的Java 8 Compiled EAR导致Payara中的java.lang.NoClassDefFoundError的主要内容,如果未能解决你的问题,请参考以下文章

雷林鹏分享:EJB封装应用

几个 EAR、JPA 和接口

无效的ejb jar:它包含零ejb。

在 JavaEE 6 WAR 与 EAR 中打包 EJB

使用 CDI 将 Logger 注入 Ejb

Java EE 7:如何将 EJB 注入 WebSocket ServerEndpoint?