【问题标题】:How Does WebSphere Choose the Classloading Order in a Folder (WEB-INF/lib)WebSphere 如何选择文件夹中的类加载顺序(WEB-INF/lib)
【发布时间】:2017-03-18 09:25:44
【问题描述】:

我目前面临一个有趣的问题,即由于类加载问题,我们的应用程序无法在 3/4 节点上启动。

问题似乎是 WAS 在 a.jar 之前加载 b.jar。经过更多故障排除后,我发现所有节点都以不同的顺序加载 jars(通过控制台中的 Classpath 查看器),并且工作节点可能只是侥幸。

WebSphere 如何确定已安装应用程序 WEB-INF/lib 文件夹中的类加载顺序?

【问题讨论】:

  • 在启动过程中您是否遇到类未找到异常?
  • 不完全......我遇到了另一个错误,当与开发人员讨论时,他说这是因为它正在加载我们订购的某个罐子。他们打算在 jarname.jar 之前加载一个 0-jarname.jar,但是在 3/4 节点上,它在 0-jarname.jar 之前加载 jarname.jar。我试图了解它是如何加载顺序的,因为在 websphere 类路径查看器中它似乎没有任何有意义的顺序。
  • 0-jarname.jar 和 jarname.jar 有什么原因不能简单地组合成一个 jar 吗?
  • 您说“应用程序无法启动”您可以发布错误吗?为什么先加载 b.jar 或 a.jar 会有所不同?

标签: java class websphere classloader


【解决方案1】:

有 2 种方法可以在 Websphere 中配置类加载器,PARENT_FIRST(默认)或 PARENT_LAST。 Websphere 中的类加载器是分层的,你可以把它想象成一棵树,你有: Java 类加载器 -> ext 类加载器 -> App 模块类加载器 -> Web 模块类加载器

PARENT_FIRST 将从 Java 类加载器开始从“自上而下”加载类,而 PARENT_LAST 将从 Web 模块类加载器开始从“自下而上”加载类。如果您使用的开源库与 WAS 提供的库冲突,我建议您使用 PARENT_LAST。

查看这些资源以获取更多信息:

【讨论】:

  • 感谢您的反馈,但不是我所要求的。我最后使用的是 parent,因为我首先想要 web 模块类,但是在 web 模块 WEB-INF/lib 文件夹中,我想弄清楚这些类是如何加载到该文件夹​​中的(这似乎没有记录)。
【解决方案2】:

加载 jar 的顺序在 websphere 中未定义。为了解决您的问题,我建议您使用以下选项之一。

通过按照您希望它们的加载方式提及 jar 名称来使用清单类路径设置。

您可以从 a.jar 中提取类并将其放在 WEB-INF/classes 目录中。然后从 lib 文件夹中删除 a.jar。因为classes目录会在lib目录之前加载。

【讨论】:

  • 谢谢。我将很快尝试第一个选项,如果需要,我可能会要求开发人员提供选项 2 的帮助。
  • 好的。祝你好运:)
  • 实际上是一个问题.. 设置类路径时:在清单文件中.. 如果我想查看 installedApps/[appname]/WEB-INF/lib/jarname.jar ,相对路径是什么? WEB-INF/lib/jarname.jar 就足够了吗?
  • 通常我们会引用global\a.jarglobal 是一个在耳朵中可用但在战争中不可用的目录。我不确定在 WEB-INF\lib 中引用 jar。
  • 不可能使用 Class-Path 来控制 WEB-INF/lib 的顺序(所以这在某种程度上是一个不可选项)。
猜你喜欢
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-10
  • 2018-03-06
  • 2010-12-01
  • 1970-01-01
相关资源
最近更新 更多