【问题标题】:Class conflict: two jar files with the same classes类冲突:两个相同类的jar文件
【发布时间】:2015-10-25 21:52:02
【问题描述】:

我有两个 jar 文件,它们的 Util 类名相似,但方法签名不同。

在 jar1 中,我有一个 main 方法,它必须使用 jar1 中 Util 类中的方法。 JVM 正在链接到 jar2 中的 Util 类。

如何解决这个类冲突?

【问题讨论】:

  • 通常可以通过使用适当的包名来避免这种情况,这样它们就不同了
  • 你是如何导入这些类的?
  • 我正在使用这个解决方案。谢谢@AlexWien

标签: java jvm classpath packages


【解决方案1】:

如果两个 jar 文件都加载到同一个类加载器中,则无法确定将加载哪个类。处理此问题的唯一方法是隔离它们,以便只有其中一个加载到您正在使用的类加载器中。

你可以设置一个类加载器,只加载你想从中获取类的 jar,但确保类在你的路径上是唯一的可能要容易得多。

【讨论】:

    【解决方案2】:

    通常通过使用适当的包名称来避免这种情况,这样它们就不同了。

    在极端情况下,您无法选择更改 jar 文件, 有一个选项“bootclasspath”,您可以在其中指定首先加载的类。

    【讨论】:

    • 如果给定名称有多个候选者,是否可以编写引发异常的自定义类加载器?
    • 一切皆有可能。但这对于大多数应用程序来说似乎有点过头了。您还可以使用混淆器,如 ProGuard,在发现重复的类定义时发出警告。进一步可以设置“将警告视为错误”,因此如果 eobfuscator 是 ebuild 的一部分,那么即使构建也会失败
    • 这将强制选择名称在名称空间(在本例中为包)中唯一的良好模式。我在想那个......在这种情况下,如果一个类没有唯一的名称+包,您的应用程序将永远不会运行。我将尝试实施它。如果您有任何建议,我们将非常欢迎!
    • 类名的包应该是唯一的。而已。所以 com.company.app.MyClass。所谓的全限定名
    • 嗯,我不明白。原发帖人,我,你,在座的每一个人都时不时会遇到这个问题,因为缺乏想出新名字的想象力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多