包含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的主要内容,如果未能解决你的问题,请参考以下文章