JBoss 5.1.0 EAP.随机生成java.lang.NoClassDefFoundError

sus*_*tta 7 java jboss noclassdeffounderror ejb-3.0

在我们的EJB 3.0应用程序中,我们发生了随机发生的java.lang.NoClassDefFoundError.

它恰好发生在IDE中.

建立:

OS: Windows 7 32 Bit
Java JDK: 1.6.0_24 (32 Bit)?
IDE: IntelliJ 11.1?
App-Server: JBoss 5.1.0 EAP
EAR-Building with „maven-ear-plugin“?
WAR-Building with Maven „<packaging>war</packaging>“?
EJB-Building with Maven „<packaging>ejb</packaging>“ und „maven-ejb-?plugin“?
Run Code Online (Sandbox Code Playgroud)

EAR看起来像这样:

xxx.ear
?   |___ META-INF
?   |    |___ application.xml (Information about EAR, EJB und WEB-Modul ?configured)?
?   |?
?   |___ xxxEJB.jar?
?   |    |?
?   |    |___ META-INF
?   |    |    |___ persistance.xml (JPA 1.0 configuration)?
?   |    |    |___ jboss.xml (JBoss-Config)?
?   |    |    |___ ejb-jar.xml (EJB 3.0 definition)?
?   |    |?
?   |    |___ country/yyy/xxx/.. (our own compiled classes)
?   |    |___ report/.. (JasperReport-Tamplates)
?   |    |___ quickfix/.. (QuickFixJ-configuration)
?   |    |___ all dependent libraries for our EJB 3.0 project, (74-jar-files)
?   | ?
?   |___ xxxWAR.war?
?        |?
?        |___ META-INF
?        |___ WEB-INF
?             |?
?             |___ lib?
?             |    |___ all dependent libraries for the Servlet-?project, (2-jar-files)
?             |___ classes?
?             |    |___ country/yyy/xxx/.. (our own compiled classes)
?             |___ web.xml (Servlet-configuration)?
Run Code Online (Sandbox Code Playgroud)

Stacktrace看起来像这样:

JVM已使用选项:-verbose:class启动,以查看所有类加载操作.

--- SNIP JBoss-Log ---?

?[Loaded country.yyy.xxx.service.issue.util.IssueUtil from file:/C:/Workarea/Projects/xxx-?trunk/xxx/target/classes/]?
?[Loaded org.joda.time.DateTimeZone from jar:file:/C:/Workarea/Projects/xxx-trunk/xxx-?ear/target/xxx.ear!/xxxEJB.jar]?
?[Loaded org.joda.time.Chronology from jar:file:/C:/Workarea/Projects/xxx-trunk/xxx-?ear/target/xxx.ear!/xxxEJB.jar]?
?[Loaded org.joda.time.chrono.BaseChronology from jar:file:/C:/Workarea/Projects/xxx-trunk/xxx-?ear/target/xxx.ear!/xxxEJB.jar]?
?[Loaded org.joda.time.DateTimeZone$1 from jar:file:/C:/Workarea/Projects/xxx-trunk/xxx-?ear/target/xxx.ear!/xxxEJB.jar]?
?[Loaded org.joda.time.tz.NameProvider from jar:file:/C:/Workarea/Projects/xxx-trunk/xxx-?ear/target/xxx.ear!/xxxEJB.jar]?
?[Loaded org.joda.time.JodaTimePermission from jar:file:/C:/Workarea/Projects/xxx-trunk/xxx-?ear/target/xxx.ear!/xxxEJB.jar]?
?[Loaded org.joda.time.tz.Provider from jar:file:/C:/Workarea/Projects/xxx-trunk/xxx-?ear/target/xxx.ear!/xxxEJB.jar]?
?[Loaded org.joda.time.tz.FixedDateTimeZone from jar:file:/C:/Workarea/Projects/xxx-trunk/xxx-?ear/target/xxx.ear!/xxxEJB.jar]?
?[Loaded org.joda.time.tz.ZoneInfoProvider from jar:file:/C:/Workarea/Projects/xxx-trunk/xxx-?ear/target/xxx.ear!/xxxEJB.jar]?
ERROR - javax.ejb.EJBTransactionRolledbackException: Unexpected Error
java.lang.NoClassDefFoundError: org/joda/time/tz/DefaultNameProvider
at org.joda.time.DateTimeZone.getDefaultNameProvider(DateTimeZone.java:545)?
at org.joda.time.DateTimeZone.setNameProvider0(DateTimeZone.java:515)?
at org.joda.time.DateTimeZone.<clinit>(DateTimeZone.java:116)?
at ?country.yyy.xxx.service.issue.util.InitialFixingDateTimeUtil.getHedgingTimestampsForIssue(InitialFixingDateTimeUtil.java:83)?
at ?country.yyy.xxx.service.issue.util.InitialFixingDateTimeUtil.getFirstHedgingTimestampForIssue(InitialFixingDateTimeUtil.java:43)?
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)?
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)?
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)?
at java.lang.reflect.Method.invoke(Unknown Source)?

?--- SNAP JBoss-Log ---?
Run Code Online (Sandbox Code Playgroud)

文件"org/joda/time/tz/DefaultNameProvider"肯定在jar文件jar:file:/ C:/ Workarea/Projects/xxx-trunk/xxx-ear/target/xxx.ear!/xxxEJB.jar

建议:

我们感觉Quarz与它有关.因此,当安排了某些事情时,EJB 3.0远程无状态服务.有时会发生错误.

Quartz-Scheduler最初是在Servlet-Context中创建的,但大部分工作正常.

有人有同样的问题吗?

JBoss部署是通过IntelliJ JBoss插件完成的:

是不是,问题是因为我们使用的部署机制?我们使用intelliJ JBoss插件部署应用程序,因此JBoss说:

09:39:21,614 INFO  [MainDeployer] deploy, url=file:/C:/Workarea/Projects/xxx-trunk/xxx-ear/target/xxx.ear
09:39:33,613 INFO  [Ejb3DependenciesDeployer] Encountered deployment AbstractVFSDeploymentContext@2726974{vfszip:/C:/Workarea/Projects/xxx-trunk/xxx-ear/target/xxx.ear/xxxEJB.jar/}
Run Code Online (Sandbox Code Playgroud)

sus*_*tta 0

当我们使用 IntelliJ IDEA JBoss-Run-Configuration 进行部署时,问题就会发生。

感谢 user1516873 的提示,通过 ANT/Maven 手动部署。

我们已经尝试过了。

我们引入了一个 ANT-Task,将 artefact xxx.ear 复制到 JBoss-Deploy-Folder 中。从那时起它工作正常,我们还没有得到 java.lang.NoClassDefFoundError 。

build.xml 看起来像这样:

<project name="xxx-deploy">
    <!-- Copy Artifact to JBoss-Deploy-Folder -->
    <target name="xxx-ear-deploy">
        <copy file="C:/Workarea/Projects/xxx-trunk/xxx-ear/target/xxx.ear"
              todir="C:/Workarea/_tools/jboss-eap-5.1.0-xxx/jboss-as/server/default/deploy"/>
    </target>
</project>
Run Code Online (Sandbox Code Playgroud)