我有两个罐子有冲突。它们都包含一个具有相同包名和类名的类。由于同样的原因,我无法删除其中任何一个。
那么,有什么方法可以解决这个问题吗?理想情况下,我希望有一种方法可以让我决定在运行时应该调用jar的类。
我非常感谢任何人的帮助。
答案 0 :(得分:6)
您可以使用其他名称创建一个包结构(与冲突的jar中的包结构相同)。从任何罐子中复制相应的内容。使用jar中的一个包和项目中的另一个包(刚刚创建的新包) 我最近这样做了,它起作用了。
祝你好运!
答案 1 :(得分:3)
在这种情况下你的选择是。
1.(最佳方式)修改应用程序代码以使用最新版本的jar。如果您的程序依赖于另一个依赖于过时jar文件的插件,请检查最新版本的插件。
使用OSGi
使用两个类加载器。需要研究一点理论,有时会导致意外错误。
现在我不打算举例,因为下面的链接中有很多信息和示例可以帮助你
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
答案 2 :(得分:1)
动态链接的任何内容都必须有一些方法来区分运行时链接的内容。这是包层次结构的全部要点,以划分代码。您可以解决相同类名的问题,但是一旦包相同,我就不知道强制JVM链接到另一个的方法。
答案 3 :(得分:1)
您可以使用不同的类加载器并在不同的沙箱中运行冲突的组件。
如果两个jar都在类路径上,并且您正在使用系统类加载机制,则无法动态选择要使用的jar。 Java类加载会选择第一个类文件。
答案 4 :(得分:0)
这是一个老话题,但是有一个解决JAR冲突的方法,但是它只能在JAVA 8之前起作用。您可以将有冲突的JAR移到两个单独的文件夹中,然后以正确的顺序在“ java.endorsed”中提及它们。 dirs”属性。这将迫使您的应用程序以指定的顺序预加载认可的JAR及其类,从而迫使所需的类在以后被调用时使用。我为在JBoss上运行的应用程序做到了这一点,并拥有2个JAR,它们具有完全相同的类和包。复杂性是我最终认可了23个JAR,而不是2个,因为存在依赖关系,但最终解决方法起作用了-实际问题已解决。不幸的是,从Java8开始删除了对java.endorsed.dirs的支持。如果有人有想法如何为最新的Java做类似的技巧,请分享。