2011-06-21 140 views
9

假设我有一个java项目myProject,并使用外部库jar(someJar.jar),它具有com.somepackage.Class1.class类。如何避免Java中的“重复类”

现在我找到了更新版本的Class1.java,它修复了原始jar中的错误。

我包括我的源代码的新Class1.java下包com.somepackage

当我生成项目(例如,使用NetBeans),有一个dist\myProject.jar含有类com.somepackage.Class1.classdist\lib\someJar.jar其中还包含有一类同名。

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

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

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

  3. 在Proguard中,当我尝试压缩我的代码时,出现duplicate class错误。我如何消除这种情况?

回答

4
  1. Java根据类路径的顺序决定使用哪一个。列出你的第一个,你会没事的。

  2. “正确”的方法是修复原始来源,但有时候并不总是一种选择。

  3. 我还没有使用过ProGuard,但在重复类之前,我重新打开了库。我的解决方案是告诉Ant忽略重复的类。我认为ProGuard也会有这种支持。

6

你不能创建一个包含错误修复的更新的jar文件吗?如果你没有相同的完全合格课程的两个版本,它会让事情变得更简单。

+0

我可以那样做。但是,如果将来某人用升级版本(没有错误修正)替换该jar,则更改将会丢失。我更愿意将java源代码保留在项目中,以确保bug修复不会丢失。是否有可能在构建工具中完成?注意:错误修复不是库的官方版本的一部分,也可能不是下一个版本的一部分。 – Jus12

+0

@ Jus12:当然,您可以创建一个更新的jar文件作为构建过程的一部分,创建一个jar文件的副本,然后更新该类。但是,我会说你仍然有问题 - 这个类可能*已经在新版本的jar文件中更新,所以使用独立的bug-fix类文件会导致问题。是否有任何理由为什么bug修复*不会成为新版本jar的一部分? –

+0

我正在讨论'smack' xmpp库,并且bug-fix是对'BOSH'的额外支持。截至目前,smack不支持BOSH,这种攻击是必不可少的。不知道他们为什么不支持它。 – Jus12

1

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

2)使用不同的类名称。是否有理由,为什么你想使用相同的类名和相同的包装?我认为没有理由。

3)创建一个包装/代理类,封装了所有的罐子的电话,用户可以决定调用修复了这个bug这个新类(提供有不同的名称和包装)

+3

如果这个类(包含它的bug)被第三方代码实例化,你可以只是提供一个新的,独特的课程。 –

+0

是的,这就是我必须保持同一个名字的原因。 – Jus12