【问题标题】:How to change order of Jars loaded from WEB-INF/lib?如何更改从 WEB-INF/lib 加载的罐子的顺序?
【发布时间】:2012-04-18 18:33:02
【问题描述】:

我正在 WAS 7.0 中配置一个 Java Web 模块。我的所有模块 JAR 都在 WEB-INF/lib 目录中,它们都在加载。我的问题是它们加载的顺序。我有 2 个罐子:someJar.jaraPatchForSomeJar.jar,它们都位于 WEB-INF/lib 中。 aPatchForSomeJar.jar 修补了someJar.jar 中的一些类。问题是模块类路径上的someJar.jar 高于补丁。这会导致原始 jar 中的类被用于修补 jar 中的修补版本。

在我的开发环境(win XP 上的 RAD 7.5)中,模块类路径按字母顺序加载(这导致 aPatchForSomeJar.jarsomeJar.jar 之前加载)。但是,当部署到测试环境(GNU/Linux 上的 WAS 7.0)时,模块类路径似乎是以随机顺序加载的(至少绝对不是字母顺序),其中补丁是在原始 Jar 之后加载的。

有人知道我如何更改模块加载 WEB-INF/lib jar 的顺序吗?

【问题讨论】:

  • 我还不能确认,但有传言说 7.0 的模块类加载器是一个“惰性加载器”......所以它会根据需要加载每个 jar。这将解释类路径看似随机的顺序。如果我能找到一些文件或对此的确认,我会更新我的问题。

标签: websphere websphere-7


【解决方案1】:

据我所知,没有按字母顺序加载 jar 文件的概念。

您的打包模型需要重新审视——同时打包 patch.jar 和 original.jar 会让您感到痛苦。

patch.jar 包含固定的jar,为什么还需要原来的jar?

即使你想保留 original.jar 和 patch.jar(我假设它是完整的),你也可以尝试使用类加载器层次结构来确保 patch.jar 与 original.jar 相比总是先加载.

例如,您可以使用 parent_last 的类加载策略将 original.jar 打包到共享库级别,并将 patch.jar 保存在您的 WEB-INF/lib 中。

虽然我建议将其作为替代方案,但您应该考虑将 orginal.jar 替换为 patch.jar 或让补丁包含所有更改的文件(并将它们从 original.jar 中删除)

HTH

芒露

【讨论】:

  • 我们需要两个 jar,因为这两个 jar 都不包含整个画面...... someJar.jar 中有一些类不在 aPatchForSomeJar.jar 中,反之亦然。我同意最好的解决方案是将两个 jar 合并为一个,以便我们在路径上有一个最新版本。不过,我仍然对类路径排序感到好奇。
  • Manglu的第一句话是正确的:WEB-INF/lib/的内容没有办法排序。
  • 不管怎样,在多个 jar 文件中存在相同的类在某些时候是有问题的,你永远不知道实际加载的是哪一个。我会说如果从 jar 文件中删除重复的类真的很重要,假设它们是开源的而不是专有的。
猜你喜欢
  • 1970-01-01
  • 2017-03-18
  • 2011-09-10
  • 2010-12-01
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
  • 2014-08-10
相关资源
最近更新 更多