如何在运行时解决jar冲突?

问题描述 投票:3回答:4

我有两个罐子有冲突。它们都包含一个具有相同包名和类名的类。由于同样的原因,我无法删除其中任何一个。

那么,有什么方法可以解决这个问题吗?理想情况下,我希望有一种方法可以让我决定在运行时应该调用jar的类。

我非常感谢任何人的帮助。

java jar jvm
4个回答
7
投票

您可以使用不同的名称在项目文件夹中创建包结构(与冲突的jar中的包结构相同),并从任何jar中复制相应的内容。使用jar中的一个包和你项目中的另一个包(你刚刚创建的新包)我最近做了这个并且它有效。

祝好运!


3
投票

在这种情况下你的选择是。

1.(最佳方式)修改应用程序代码以使用最新版本的jar。如果您的程序依赖于另一个依赖于过时jar文件的插件,请检查最新版本的插件。

  1. 使用OSGi
  2. 使用两个类加载器。需要研究一点理论,有时可能会导致意外错误。

现在我不打算举例,因为下面的链接中有大量信息和示例可以帮助您

Java, Classpath, Classloading => Multiple Versions of the same jar/project

Jar hell: how to use a classloader to replace one jar library version with another at runtime

http://java.dzone.com/articles/java-classloader-handling

http://javarevisited.blogspot.in/2012/12/how-classloader-works-in-java.html


1
投票

任何动态链接的东西都必须有一些方法来区分运行时链接的内容。这是包层次结构的全部要点,以划分代码。您可以解决相同类名的问题,但是一旦包相同,我就不知道强制JVM链接到另一个的方法。


1
投票

您可以使用不同的类加载器并在不同的沙箱中运行冲突的组件。

如果两个jar都在类路径上,并且您正在使用系统类加载机制,则无法动态选择要使用的jar。 Java类加载会选择第一个类文件。


0
投票

这是一个古老的主题,但有一个JAR冲突的解决方案,但它只适用于JAVA 8.您可以将冲突的JAR移动到两个单独的文件夹中,然后在“java.endorsed.dirs”属性中以正确的顺序提及它们。这将强制您的应用程序按指定的顺序预加载已批准的JAR及其类,从而强制在调用后使用所需的类。我为我的应用程序做了这个,它在JBoss上运行并且有2个JAR,它们具有完全相同的类和包。复杂性是我最终支持23个JAR而不是2个,因为存在依赖关系,但最终解决方法工作 - 真正的问题得到了解决。不幸的是,从Java8开始删除了对java.endorsed.dirs的支持。如果有人知道如何为最新的Java做类似的技巧,请分享。

© www.soinside.com 2019 - 2024. All rights reserved.