ClassDefNotFoundException即使该类由类加载器加载(多个应用程序安装在服务器上)

时间:2011-01-06 06:45:49

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

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

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

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

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

之后,我尝试了一些事情,但都没有奏效。

  1. 在ReportingWeb应用程序的应用程序级别上映射SGOAPPSHLIB。使用的应用程序类加载器第一个策略。
  2. 创建了一个新的共享库REPSHLIB并将logsrv.jar放入其中。使用application.Used应用程序类加载器第一个策略映射此库。
  3. 在服务器级别映射REPSHLIB。这适用于REPORTINGWEB应用程序,但其他应用程序SGOApplication现在无法找到该类。
  4. 我在尝试运行webapplication时遇到 ClassDefNotFoundException:com.statestreet.framework.logging.SLEEventLogger ,并且控件到达了我使用SLEEventLogger的特定类。

    我尝试从websphere Console中的故障排除> Classloader中搜索SLEEventLogger类。 我能够发现模块类加载器正在加载SLEEventLogger类。

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

3 个答案:

答案 0 :(得分:1)

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

  1. 使用ws.ext.dirs属性
  2. 将logsrv.jar添加到WebSphere类加载器
  3. 从应用程序和模块类加载器中删除logsrv.jar(即包括从WEB-INF/lib删除它)
  4. 我认为您可能在第三次尝试中完成了第(1)部分,即在服务器级别映射REPSHLIB时。这就是为什么它适用于 ReportingWeb 。我想它在 SGOApplication 中出现的原因是因为 SGOApplication 可能已经有了logsrv.jar的副本 - 额外的副本可能与WebSphere类加载器加载的副本冲突。关键是要确保只有一个JAR副本在任何类加载器中。

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

答案 1 :(得分:0)

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

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

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

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

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

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

答案 2 :(得分:0)

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