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

uemypmqf  于 2022-11-07  发布在  其他
关注(0)|答案(5)|浏览(138)

我有两个jar发生冲突。它们都包含一个包名和类名相同的类。由于相同的原因,我不能删除它们中的任何一个。
那么,有没有办法解决这个问题呢?理想情况下,我希望有一种方法可以让我决定在运行时调用哪个类的jar。
我很感激任何人的帮助。

yfwxisqw

yfwxisqw1#

你可以在你的项目文件夹中创建一个包结构(和你冲突的jar中的包结构一样),用一个 * 不同的名字 * &从任何jar中复制各自的内容。使用jar中的一个包和你项目中的另一个包(你刚刚创建的新包)我最近做过这个,它很有效。
祝您好运!

nwsw7zdq

nwsw7zdq2#

在这种情况下,您的选项是。
1.(最佳方式)修改应用程序代码以使用最新版本的jar。如果您的程序依赖于另一个依赖于过时的jar文件的插件,请检查插件的最新版本。
1.使用OSGi
1.使用两个类加载器。需要学习一点理论,有时会导致意想不到的错误。
现在我不打算把例子,因为有大量的信息和例子在下面的链接,以帮助您
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

vsikbqxv

vsikbqxv3#

任何动态链接的东西都必须有某种方法来区分运行时链接的对象。这就是包层次结构的全部意义,将代码划分开来。你可以绕过相同类名的问题,但是一旦包是相同的,我不知道有什么方法可以强制JVM链接到一个包上。

bvhaajcl

bvhaajcl4#

您可以使用不同的类加载器,并在不同的沙箱中运行冲突的组件。
如果两个jar都在类路径上,并且您使用的是系统类加载机制,则无法动态选择要使用的jar。

wd2eg0qa

wd2eg0qa5#

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

相关问题