JBoss 4.2启动抛出NoClassDefFoundError

时间:2011-05-18 10:42:22

标签: jboss classloader noclassdeffounderror jboss-4.2.x

我无法启动JBoss 4.2.2服务器 - 它产生以下错误消息(来自org.jboss.kernel.plugins.dependency.AbstractKernelController):

Error installing to Described: name=WSDeployerHook_JAXWS_EJB3 state=Not Installed mode=Manual requiredState=Create
java.lang.NoClassDefFoundError: org/jboss/ejb3/interceptors/direct/IndirectContainer

通过JBoss源代码,我已经为某些类打开了TRACE级别的日志记录,尽管它告诉我它找不到IndirectContainer(这些行都来自org.jboss.mx.loading.LoadMgr3 }):

Begin beginLoadTask, task=org.jboss.mx.loading.ClassLoadingTask@c8aeb3{classname: org.jboss.ejb3.interceptors.direct.IndirectContainer, requestingThread: Thread[main,5,jboss], requestingClassLoader: org.jboss.mx.loading.UnifiedClassLoader3@16925b0{ url=null ,addedOrder=2}, loadedClass: nullnull, loadOrder: 2147483647, loadException: null, threadTaskCount: 0, state: 0, #CCE: 0}
End beginLoadTask, ClassNotFoundException
Run failed with exception, loadTask=org.jboss.mx.loading.ClassLoadingTask@10e468f{classname: org.jboss.ejb3.EJBContainer, requestingThread: Thread[main,5,jboss], requestingClassLoader: org.jboss.mx.loading.UnifiedClassLoader3@16925b0{ url=null ,addedOrder=2}, loadedClass: nullnull, loadOrder: 2147483647, loadException: java.lang.NoClassDefFoundError: org/jboss/ejb3/interceptors/direct/IndirectContainer, threadTaskCount: 0, state: 1, #CCE: 1}
Notifying task of thread completion, loadTask:org.jboss.mx.loading.ClassLoadingTask@10e468f{classname: org.jboss.ejb3.EJBContainer, requestingThread: Thread[main,5,jboss], requestingClassLoader: org.jboss.mx.loading.UnifiedClassLoader3@16925b0{ url=null ,addedOrder=2}, loadedClass: nullnull, loadOrder: 2147483647, loadException: java.lang.NoClassDefFoundError: org/jboss/ejb3/interceptors/direct/IndirectContainer, threadTaskCount: 0, state: 1, #CCE: 1}
End nextTask(0), loadTask=org.jboss.mx.loading.ClassLoadingTask@10e468f{classname: org.jboss.ejb3.EJBContainer, requestingThread: Thread[main,5,jboss], requestingClassLoader: org.jboss.mx.loading.UnifiedClassLoader3@16925b0{ url=null ,addedOrder=2}, loadedClass: nullnull, loadOrder: 2147483647, loadException: java.lang.NoClassDefFoundError: org/jboss/ejb3/interceptors/direct/IndirectContainer, threadTaskCount: 0, state: 4, #CCE: 1}
Begin endLoadTask, task=org.jboss.mx.loading.ClassLoadingTask@10e468f{classname: org.jboss.ejb3.EJBContainer, requestingThread: Thread[main,5,jboss], requestingClassLoader: org.jboss.mx.loading.UnifiedClassLoader3@16925b0{ url=null ,addedOrder=2}, loadedClass: nullnull, loadOrder: 2147483647, loadException: java.lang.NoClassDefFoundError: org/jboss/ejb3/interceptors/direct/IndirectContainer, threadTaskCount: 0, state: 4, #CCE: 1}
registerLoaderThread, ucl=org.jboss.mx.loading.UnifiedClassLoader3@56182f{ url=file:/var/data/applications/jboss/server/jbossgpa1/deploy/jboss-bean.deployer/ ,addedOrder=5}, t=Thread[main,5,jboss], prevT=null
Begin beginLoadTask, task=org.jboss.mx.loading.ClassLoadingTask@159d10{classname: org.jboss.util.JBossStringBuilder, requestingThread: Thread[main,5,jboss], requestingClassLoader: org.jboss.mx.loading.UnifiedClassLoader3@56182f{ url=file:/var/data/applications/jboss/server/jbossgpa1/deploy/jboss-bean.deployer/ ,addedOrder=5}, loadedClass: nullnull, loadOrder: 2147483647, loadException: null, threadTaskCount: 0, state: 0, #CCE: 0}
scheduleTask(1), created subtask: {t=Thread[main,5,jboss], ucl=org.jboss.mx.loading.UnifiedClassLoader3@56182f{ url=file:/var/data/applications/jboss/server/jbossgpa1/deploy/jboss-bean.deployer/ ,addedOrder=5}, name=org.jboss.util.JBossStringBuilder, requestingThread=Thread[main,5,jboss], order=5, releaseInNextTask=false}

我使用TextPad搜索整个文件夹结构,包括.jars等,并且在日志文件之外没有提到IndirectContainer

我猜测库的依赖性并不令人满意,但我不确定下一步应该是什么来诊断这个问题。有什么想法/建议吗?

(在RHEL4上运行)

我正在运行JBoss (MX MicroKernel) [4.2.2.GA (build: SVNTag=JBoss_4_2_2_GA date=200710221139)]

我开始有点绝望了,所以我连接了调试器并在org.jboss.mx.loading.ClassLoadingTask的构造函数上创建了一个条件断点("org.jboss.ejb3.interceptors.direct.IndirectContainer".equals(classname))。当断点被击中时,我回到堆栈中找到最早提到的IndirectContainer

earliest mention of IndirectContainer

在左侧你可以看到(我希望 - 在我的小屏幕上看起来不是很清楚)在UnifiedClassloader3.classLoadInternal()的调用之下是本机调用(我看不到任何值) ,然后打电话给UnifiedClassloader3.defineClass()

jboss-ejb3-core-client.jar

在这个调用中,你可以看到突出显示的(蓝色,右下角)jboss-ejb3-core-client.jar - 我不太喜欢使用类加载器,但我假设决定为IndirectContainer实例化ClassLoadingTask因为.jar文件的内容而被删除。

据我所知,在这个.jar中没有提到IndirectContainer

希望有足够的细节让别人认识到这个问题。

1 个答案:

答案 0 :(得分:1)

经过大量调试和源代码检查后,我找到了解决方案。

我们的appserver的类路径包含来自JBoss 5.1.0.GA的jboss-ejb3-core-client.jar,因此它可以与JBoss5.1.0应用服务器上公开的EJB进行通信。我们的类路径中还有jboss-ejb3-client.jar。两者都包含类org.jboss.ejb3.EJBContainer,但只有第一个.jar中的类实现org.jboss.ejb3.interceptors.direct.IndirectContainer,这是我们在类路径中没有的。

在我原来的问题中,我写道:

  

据我所知,没有   在这提到IndirectContainer   的.jar。

......这显然是错误的。

因此,我写了another question,询问是否有任何工具可以更快地识别出来。如果没有,我会写一个。