gpt4 book ai didi

java - ClassDefNotFoundException 即使类是由类加载器加载的(服务器上安装了多个应用程序)

转载 作者:行者123 更新时间:2023-12-01 15:58:12 25 4
gpt4 key购买 nike

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

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放入其中。将此库与 application 映射。使用应用程序类加载器优先策略。
  3. 在服务器级别映射 REPSHLIB。这适用于 REPORTINGWEB 应用程序,但其他应用程序 SGOApplication 现在无法找到该类。

当尝试运行 Web 应用程序并且控制到达我使用 SLEEventLogger 的特定类时,我收到 ClassDefNotFoundException: com.statestreet.framework.logging.SLEEventLogger

我尝试从 websphere 控制台中的“故障排除”>“类加载器”中搜索 SLEEventLogger 类。我发现 SLEEventLogger 类正在由模块类加载器加载。

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

最佳答案

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

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

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

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

关于java - ClassDefNotFoundException 即使类是由类加载器加载的(服务器上安装了多个应用程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4612500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com