0

我在 Websphere Server v.6 上安装了两个应用程序。1. SGOApplication 2. ReportingWeb

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

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

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

在那之后,我尝试了一些事情,但没有一个起作用。

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

我在尝试运行 webapplication时收到ClassDefNotFoundException: com.statestreet.framework.logging.SLEEventLogger ,并且控制到达了我使用 SLEEventLogger 的特定类。

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

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

4

3 回答 3

1

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

  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 类加载器层次结构的漂亮图表。

于 2011-01-06T07:11:29.243 回答
0

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

于 2011-01-06T08:37:14.597 回答
0

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

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

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

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

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

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

于 2011-01-06T06:52:14.637 回答