首页 > 解决方案 > 类加载器如何在 jvm 具有相同名称但不同版本的 jar 的情况下工作,哪个将在运行时加载或两者都将加载?

问题描述

应用程序中使用了两个具有相同名称但用于不同目的的 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 文件夹中。类加载器会在那里表现如何?

这发生在其中一个具有相同名称的罐子的野蝇案例中但它选择了错误的罐子并产生了问题。但是同样的情况在另一个环境中运行良好..这有什么顺序/优先级吗?

更新

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

因此,情况将是这样:

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

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

标签: javajbosswildflyclasspathclassloader

解决方案


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

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


推荐阅读