【问题标题】:ClassDefNotFoundException even though the class is loaded by the classloaders (Multiple Applications are installed on the Server)ClassDefNotFoundException 即使类是由类加载器加载的(在服务器上安装了多个应用程序)
【发布时间】:2011-06-04 11:49:18
【问题描述】:

我在 Websphere Server v.6 上安装了两个应用程序。 1. SGO申请 2. 报告网

SGOApplication 有一个映射到应用程序级别的共享库,即 SGOAPPSHLIB

这个库有一个日志框架 jar(logsrv.jar)。 在 logsrv.jar 中有一个名为 SLEEventLogger 的类,它将消息记录到一个文件中,并使用了一些其他第三方类,这些类都捆绑在 logsrv.jar 中

我想将 logsrv.jar 用于 ReportingWeb 应用程序。 我从 ReportingWeb 中的另一个类调用了 SLEEventLogger 类。 我能够构建 ear 并将其部署为 logsrv.jar 在构建路径中。

之后,我尝试了以下操作,但都没有奏效。

  1. 在 ReportingWeb 应用程序的应用程序级别上映射 SGOAPPSHLIB。使用应用程序类加载器优先策略。
  2. 创建了一个新的共享库 REPSHLIB 并将 logsrv.jar 放入其中。将此库映射到应用程序。使用应用程序类加载器优先策略。
  3. 在服务器级别映射 REPSHLIB。这适用于 REPORTINGWEB 应用程序,但其他应用程序 SGOApplication 现在无法找到该类。

我在尝试运行 web 应用程序时遇到 ClassDefNotFoundException: com.statestreet.framework.logging.SLEEventLogger,并且控件到达了我使用 SLEEventLogger 的特定类。

我尝试在 websphere 控制台的疑难解答>类加载器中搜索 SLEEventLogger 类。 我发现模块类加载器正在加载 SLEEventLogger 类。

如何解决这个问题?我在服务器配置上尝试了很多排列和组合,但没有运气。我完全搞砸了。

【问题讨论】:

  • 当您说“在服务器级别映射 REPSHLIB”时,您的意思是您将它放在 WebSphere 类加载器中,即使用 ws.ext.dirs 属性?

标签: java web-applications jakarta-ee websphere websphere-6.1


【解决方案1】:

我建议启用 DEBUG 日志记录,以便更清楚地了解应用程序中发生的情况。

当然,您提到您的 logsrv.jar 文件位于您的构建路径中。值得注意的是,build path 和您的应用程序的 classpath 实际上可能并不相同。

根据 NoClassDefFoundError 异常的文档,当一个类“在当前执行的类被编译时存在,但无法再找到定义时抛出。”

换句话说,SLEEventLogger 类在您的构建路径中,允许您的应用程序编译,但异常表明包含此类的 JAR 文件很可能不在您的类路径中。

当您尝试运行应用程序时,在知道 SLEEventLogger 存在的情况下编译的类无法再找到它;结果,抛出 NoClassDefFoundError 异常。

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/NoClassDefFoundError.html

【讨论】:

    【解决方案2】:

    要完成这项工作,您应该:

    1. 使用 ws.ext.dirs 属性将 logsrv.jar 添加到 WebSphere 类加载器
    2. 从应用程序和模块类加载器中删除 logsrv.jar(即包括从 WEB-INF/lib 中删除它)

    我认为您可能在第三次尝试中完成了第 (1) 部分,即当您在服务器级别映射 REPSHLIB 时。这就是它适用于 ReportingWeb 的原因。我猜它在 SGOApplication 中中断的原因是因为 SGOApplication 可能已经有一个 logsrv.jar 的副本——这个额外的副本可能与 WebSphere 类加载器加载的那个冲突。关键是确保在任何类加载器中只有一个 JAR 副本。

    请参阅http://www.ibm.com/developerworks/websphere/library/techarticles/0112_deboer/deboer.html#N100F8 以获取 WebSphere 类加载器层次结构的精美图表。

    【讨论】:

      【解决方案3】:

      这个异常意味着找不到 com.statestreet.framework.logging.SLEEventLogger 依赖的某个类。含义:找到类 com.statestreet.framework.logging.SLEEventLogger。但这取决于无法找到的东西,因此无法加载。如果您有资源,您可以轻松找到 com.statestreet.framework.logging.SLEEventLogger 使用的所有类(仅查看导入)。 否则,你可以尝试反编译。

      【讨论】:

      • 我从文档中的理解是,这意味着依赖 SLEEventLogger 的某些类找不到SLEEventLogger 的定义。我的猜测是,完整的堆栈跟踪可能会识别出导致依赖于这个缺失库的类的线索。 download.oracle.com/javase/1.4.2/docs/api/java/lang/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 2021-02-11
      • 1970-01-01
      • 2014-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多