【问题标题】:How class loader works where jvm has jars having same names but different versions, which one would be loaded at runtime or both will?类加载器如何在 jvm 具有相同名称但不同版本的 jar 的情况下工作,哪个将在运行时加载或两者都将加载?
【发布时间】:2021-10-10 19:47:24
【问题描述】:

在应用程序中使用了两个具有相同名称但用于不同目的的 jar。 例如,jar 的名称是“A1.jar”,具有不同的版本并用于 if else 条件。

if this:
 then A1-10.2.3jar.create()
else:
 then A1-8.18.0jar.create()

它们又具有不同的 create 方法实现。

问题是当应用程序被加载时,哪个 jar 会在类加载期间被实例化?或者根据条件加载相应的jar?我们如何确保每次都拿起正确的罐子。

问题进一步转移到应用服务器场景,其中两个库都位于 jboss/wildfly 上的 WEB-INF/lib 文件夹中。类加载器会在那里表现如何?

这发生在 wildfly 的一个案例中,其中有相同名称的 jar,但它选择了错误的 jar 并产生了问题。但同样的情况在另一个环境中运行良好。. 是否有任何顺序/优先级?

更新

类在被调用时是不同的: 说 A2 和 A3 类,然后调用 A1 jar,这些 jar 作为 A2 和 A3 类的依赖项,名称相同但版本不同。

所以,情况就是这样:

 if this:
     then A2.create()-> calls A1-10.2.3jar.respone()
    else:
     then A3.create()->calls A1-8.18.0jar.respone()

如果是这种情况,类加载器可以同时加载两个类还是随机加载?

【问题讨论】:

  • 如果您正在谈论具有相同名称的类,那是不可能的。一个类加载器只加载一个类一次。
  • 如果您的答案仍然成立,请查看更新后的问题。可能有办法解决这个问题。

标签: java jboss wildfly classpath classloader


【解决方案1】:

据我所知,对于 jee 应用程序服务器,他们在这种情况下必须使用哪个版本没有规范。因此,使用哪个 jar 是一种(确定性)随机性。

这确实应该避免,例如在 maven 文件中排除部署或类似的 gradle。

【讨论】:

  • 请查看更新后的问题。我可以避免对具有相应依赖关系的一个类使用 maven,但是它将如何解决该类从其依赖关系中需要的方法?
  • 看起来没有答案。虽然,我同意这不应该发生,但如果这是不可避免的情况怎么办?像上面的情况一样?
  • 如果你真的、真的、真的需要这两个 jar 并且你不能在构建过程中排除其中一个,也许你可以下载源代码(如果它是开源的)并更改构建 jar 的“名称”并将该 jar 导入您的应用程序。但我什至不知道,在开源许可下这是否可能。
猜你喜欢
  • 2018-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多