【问题标题】:ClassNotFoundException, how to find where missing class is usedClassNotFoundException,如何找到使用缺失类的位置
【发布时间】:2017-08-09 11:15:03
【问题描述】:

我正在 Weblogic 12c 上部署 EAR 包,并获得 ClassNotFoundException。但是,似乎该项目没有对相关缺失类的任何引用(我搜索了类名,结果为零)。我知道当尝试通过反射实例化缺少的类时会引发此异常。我怀疑某些库可能依赖于这个类。

如何找出导致类实例化的配置或用户代码?服务器日志没有提供足够的详细信息,但在这里

<9.8.2017, 1:07:05,113 ip. EEST> <Error> <Console> <BEA-240003> <Administration Console encountered the following error: weblogic.application.ModuleException: java.lang.ClassNotFoundException: fi.foo.bar.service.FoobarWebServiceImpl
    at weblogic.application.internal.ExtensibleModuleWrapper.start(ExtensibleModuleWrapper.java:140)
    at weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:124)
    at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:233)
    at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:228)
    at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:45)
    at weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:78)
    at weblogic.application.internal.flow.StartModulesFlow.activate(StartModulesFlow.java:52)
    at weblogic.application.internal.BaseDeployment$2.next(BaseDeployment.java:750)
    at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:45)
    at weblogic.application.internal.BaseDeployment.activate(BaseDeployment.java:260)
    at weblogic.application.internal.EarDeployment.activate(EarDeployment.java:66)
    at weblogic.application.internal.DeploymentStateChecker.activate(DeploymentStateChecker.java:165)
    at weblogic.deploy.internal.targetserver.AppContainerInvoker.activate(AppContainerInvoker.java:90)
    at weblogic.deploy.internal.targetserver.operations.AbstractOperation.activate(AbstractOperation.java:627)
    at weblogic.deploy.internal.targetserver.operations.ActivateOperation.activateDeployment(ActivateOperation.java:171)
    at weblogic.deploy.internal.targetserver.operations.ActivateOperation.doCommit(ActivateOperation.java:121)
    at weblogic.deploy.internal.targetserver.operations.AbstractOperation.commit(AbstractOperation.java:347)
    at weblogic.deploy.internal.targetserver.DeploymentManager.handleDeploymentCommit(DeploymentManager.java:901)
    at weblogic.deploy.internal.targetserver.DeploymentManager.activateDeploymentList(DeploymentManager.java:1456)
    at weblogic.deploy.internal.targetserver.DeploymentManager.handleCommit(DeploymentManager.java:456)
    at weblogic.deploy.internal.targetserver.DeploymentServiceDispatcher.commit(DeploymentServiceDispatcher.java:181)
    at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer.doCommitCallback(DeploymentReceiverCallbackDeliverer.java:217)
    at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer.access$100(DeploymentReceiverCallbackDeliverer.java:14)
    at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer$2.run(DeploymentReceiverCallbackDeliverer.java:69)
    at weblogic.work.SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:666)
    at weblogic.invocation.ComponentInvocationContextManager._runAs(ComponentInvocationContextManager.java:348)
    at weblogic.invocation.ComponentInvocationContextManager.runAs(ComponentInvocationContextManager.java:333)
    at weblogic.work.LivePartitionUtility.doRunWorkUnderContext(LivePartitionUtility.java:54)
    at weblogic.work.PartitionUtility.runWorkUnderContext(PartitionUtility.java:41)
    at weblogic.work.SelfTuningWorkManagerImpl.runWorkUnderContext(SelfTuningWorkManagerImpl.java:640)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:406)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:346)
Caused by: java.lang.ClassNotFoundException: fi.foo.bar.service.FoobarWebServiceImpl
    at weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:1026)
    at weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:987)
    at weblogic.utils.classloaders.ChangeAwareClassLoader.findClass(ChangeAwareClassLoader.java:83)
    at weblogic.utils.classloaders.GenericClassLoader.doFindClass(GenericClassLoader.java:608)
    at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:540)
    at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:493)
    at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:470)
    at weblogic.utils.classloaders.ChangeAwareClassLoader.loadClass(ChangeAwareClassLoader.java:53)
    at weblogic.servlet.internal.WebAppServletContext.initContainerInitializer(WebAppServletContext.java:1414)
    at weblogic.servlet.internal.WebAppServletContext.initContainerInitializers(WebAppServletContext.java:1360)
    at weblogic.servlet.internal.WebAppServletContext.initContainerInitializers(WebAppServletContext.java:1341)
    at weblogic.servlet.internal.WebAppServletContext.preloadResources(WebAppServletContext.java:1907)
    at weblogic.servlet.internal.WebAppServletContext.start(WebAppServletContext.java:3091)
    at weblogic.servlet.internal.WebAppModule.startContexts(WebAppModule.java:1823)
    at weblogic.servlet.internal.WebAppModule.start(WebAppModule.java:882)
    at weblogic.application.internal.ExtensibleModuleWrapper$StartStateChange.next(ExtensibleModuleWrapper.java:360)
    at weblogic.application.internal.ExtensibleModuleWrapper$StartStateChange.next(ExtensibleModuleWrapper.java:356)
    at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:45)
    at weblogic.application.internal.ExtensibleModuleWrapper.start(ExtensibleModuleWrapper.java:138)

【问题讨论】:

  • 是在您的开发环境中发生还是仅在生产模式中发生?您可以在 IDE 中调试您的应用程序吗?如果是这样,您使用什么 IDE?
  • 好吧,在我从库中删除明显未使用的类之后,它发生在开发环境中。我必须知道哪里需要这个类,即使对它的引用为零。也许类名是在框架中的某个地方动态构建的,所以我无法搜索它,但我怎么知道哪个类试图加载这个类?为什么我在服务器日志中看不到?

标签: java deployment jar weblogic classnotfoundexception


【解决方案1】:

您的 Weblogic 无法加载管理控制台。也许使用 qustion 类的应用程序的早期部署失败。请尝试以下操作:

  1. 关闭该域下的所有集群

  2. 删除所有服务器上的tmpcache文件夹

  3. 删除待处理目录下的config.xml文件

  4. 删除/config和/domain文件夹下所有服务器上的*.lok文件

  5. 重新启动管理

  6. 重新启动所有托管服务器

  7. 现在部署 war/ear 文件,它应该可以正常工作了……

【讨论】:

  • 管理控制台加载正常(我通过管理控制台部署)。但是,我尝试了这个建议,仍然得到同样的错误。
【解决方案2】:

您可以在 IDE 中使用异常断点来捕获 ClassNotFoundException。当您添加此类断点时,一旦发生异常,执行将立即停止。然后您可以遍历堆栈,您可以在 IDE 中找到它,并通过选择堆栈行查看每个步骤中的数据,以找出您的代码尝试实例化该类型对象的位置。

【讨论】:

    【解决方案3】:

    您的应用程序未能加载位于 WebAppModule 的 WebAppServletContext 中的“fi.foo.bar.service.FoobarWebServiceImpl”。仔细检查 web.xml 或 weblogic.xml 中 'fi.foo.bar.service.FoobarWebServiceImpl' 的拼写错误的类名。

    【讨论】:

    • 这在 cmets 中会很好,而不是答案。
    猜你喜欢
    • 1970-01-01
    • 2021-10-29
    • 2020-07-03
    • 2022-01-11
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多