1

我无法启动 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.ejb3.interceptors.direct.IndirectContainer".equals(classname)org.jboss.mx.loading.ClassLoadingTask 的构造函数上创建了一个条件断点 ()。当断点被击中时,我回到堆栈中找到最早提到的IndirectContainer

最早提到 IndirectContainer

在左侧,您可以看到(我希望 - 在我的小屏幕上看起来不是很清楚)调用下面UnifiedClassloader3.classLoadInternal()是一个本地调用(我看不到它的任何值),然后有一个调用UnifiedClassloader3.defineClass()

jboss-ejb3-core-client.jar

在此调用中,您可以看到突出显示(蓝色,右下角)jboss-ejb3-core-client.jar- 我不经常使用 Classloaders,但我假设实例化 ClassLoadingTask 的决定IndirectContainer是因为这个 .jar 文件的内容。

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

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

4

1 回答 1

1

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

我们的应用服务器的类路径包含jboss-ejb3-core-client.jar在 JBoss 5.1.0.GA 中,因此它可以与暴露在 JBoss5.1.0 应用服务器上的 EJB 通信。jboss-ejb3-client.jar在我们的类路径中也有。两者都包含类org.jboss.ejb3.EJBContainer,但只有第一个 .jar 中的类 implements org.jboss.ejb3.interceptors.direct.IndirectContainer,我们的类路径中没有。

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

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

...这显然是错误的。

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

于 2011-05-19T11:35:48.077 回答