Java 如何避免;“重复类”;在爪哇

Java 如何避免;“重复类”;在爪哇,java,Java,假设我有一个java项目myProject,并且正在使用一个外部库jar(someJar.jar),它有一个类com.somepackage.Class1.class 现在我找到了Class1.java的更新版本,它修复了原始jar中的一个bug 我将新的Class1.java包含在包com.somepackage 当我构建项目时(例如,使用Netbeans),有一个dist\myProject.jar包含类com.somepackage.Class1.class,还有一个dist\lib\so

假设我有一个java项目
myProject
,并且正在使用一个外部库jar(
someJar.jar
),它有一个类
com.somepackage.Class1.class

现在我找到了
Class1.java
的更新版本,它修复了原始jar中的一个bug

我将新的
Class1.java
包含在包
com.somepackage

当我构建项目时(例如,使用Netbeans),有一个
dist\myProject.jar
包含类
com.somepackage.Class1.class
,还有一个
dist\lib\someJar.jar
,它也包含一个同名的类

当我运行该文件时(例如,使用
java-jar dist\myProject.jar
),将使用
Class1.class
的新版本(如我所愿)

  • Java如何决定在这种重复情况下运行哪个类文件?有什么方法可以指定优先级吗

  • 有没有“正确”的方法来避免这种冲突

  • 在Proguard中,当我试图压缩我的代码时,我得到一个
    重复类
    错误。我如何消除这种情况


  • 你不能创建一个更新的jar文件,其中包含错误修复吗?如果没有相同完全限定类的两个版本,事情会简单得多。

    1)更新的Jar是一个更好的解决方案

    2) 使用不同的类名。是否有一个原因,为什么要使用相同的类名和相同的打包?我认为没有理由

    3) 创建一个包装器/代理类,它封装了对jar的所有调用,您可以决定调用这个修复bug的新类(前提是它有不同的名称和包装)

  • Java根据类路径的顺序决定使用哪一个。先把你的列出来,你就没事了

  • “正确”的方法是修复原始源,但有时这并不总是一个选项

  • 我没有使用过ProGuard,但我已经重新修改了库,库中有重复的类。我的解决方案是告诉Ant忽略重复的类。我想ProGuard也会得到这样的支持


  • 我能做到。但是,如果将来有人用升级版本(没有错误修复)替换jar,那么更改将丢失。我更喜欢将java源代码保留在项目中,以确保错误修复不会丢失。是否可以在构建工具中执行此操作?注意:错误修复不是库的正式版本的一部分,也可能不是下一版本的一部分。@Jus12:您当然可以在构建过程中创建一个更新的jar文件,创建jar文件的副本,然后只更新该类。但是,我要说的是,您仍然有问题-该类也可能在新版本的jar文件中进行了更新,因此使用独立的bug fix类文件将导致问题。有什么理由不让bug修复成为jar新版本的一部分吗?我说的是
    smack
    xmpp库,bug修复是对
    BOSH
    的额外支持。到目前为止,smack不支持BOSH,这是使其正常工作所必需的。不知道为什么他们还不支持它。时间和资源8-(你应该签出代码,安装补丁并构建自己的jar自定义版本。如果类(其中有bug)是由第三方代码实例化的,你不能只提供一个新的、不同的类。是的,这就是我必须保留相同名称的原因。