1

我正在使用Netbeans开发我的项目,我最近发现一个jar文件中的一个类覆盖了另一个同名文件,如何解决这个问题?

我有一个名为 DB_Tools_Panel 的项目,它具有以下结构:

src/ : DB_Tools_Panel.java
       Utility/ : Tools_Lib.java

所以在 src 目录里面有一个文件:DB_Tools_Panel.java,在 src 目录里面有一个叫做 Utility 的目录,在 Utility 里面有一个叫做 Tools_Lib.java 的文件。

我把这个项目打包成一个jar文件:DB_Tools_Panel.jar

然后我创建了第二个项目 Fit,它具有以下结构:

src/ : Fit.java
       Utility/ : Tools_Lib.java
lib/ : DB_Tools_Panel.jar

它使用 DB_Tools_Panel.jar,所以 DB_Tools_Panel.jar 在 Fit 的 lib 目录中,但是现在当我在 Fit/src/Utility 中更改 Tools_Lib.java 并运行它时,什么都不会发生,就好像它从未改变过一样,现在我知道为什么了, 因为JVM只运行DB_Tools_Panel.jar包中的Tools_Lib.java,所以在Fit/src/Utility中是看不到Tools_Lib.java的在 DB_Tools_Panel.jar 中将掩盖 Fit/src/Utility 中的 Tools_Lib.java。

两个地方的 Tools_Lib.java 是同一个文件,但是 Fit/src/Utility 中的那个可能更高级,有时我会测试 DB_Tools_Panel 并确保它工作正常并将其打包成一个 jar 文件并使用它在其他项目中,而Utility/Tools_Lib.java在以后的项目中使用,需要改进,但我不一定想总是回到DB_Tools_Panel.jar并更新其中的Tools_Lib.java。

所以我的问题是:

[1] 在这种情况下,Fit 项目中是否有可能有 2 个不同的 Tools_Lib.java 文件,一个在 Fit/src/Utility/ 中,另一个在 Fit/lib/DB_Tools_Panel.jar 中并且不会导致冲突,我的意思是也就是说:当 Fit 调用 Tools_Lib.java 时,将使用它的 src/Utility/ 中的一个,当 Fit 中的某些方法调用 DB_Tools_Panel 时,DB_Tools_Panel 的 Tools_Lib.java 将在 DB_Tools_Panel 的方法中使用。

[2] 为什么 DB_Tools_Panel.jar 中的 Tools_Lib.java 会遮盖 Fit/src/Utility 中的 Tools_Lib.java?

[3] 如何让 2 个 Tools_Lib.java 不同,并且仍然能够更改 Fit/src/Utility 中的一个并在 Fit 项目中使用它,就好像 DB_Tools_Panel.jar 中的那个不存在一样?

4

2 回答 2

3
  1. 使用不同的名称。
  2. 如果您不能使用不同的名称,请将这两个类放入两个不同的包中。
  3. 如果你不能把它们放到两个不同的包中,因为你需要在同一个项目中使用同一个库的两个不同版本,那么你有两种可能来避免冲突:
    a)使用两个不同的ClassLoader
    b)使用shading来将一个类移动到另一个包(在编译时有一个 Maven 插件用于执行此操作)
于 2013-09-24T19:10:33.743 回答
1

您应该使用包来更轻松地识别您的项目/文件。此外,如果可能,请使用更具描述性的名称而不是重复名称。

对于您的班级名称,您不应该使用_. 它违反了代码约定

有了这一切,你可以让你的项目看起来像这样:

src/ : com/frank/db/tools/DBToolsPanel.java
       com/frank/db/tools/utility/ : ToolsLib.java

和这个:

src/ : com/frank/fit/Fit.java
       com/frank/fit/utility/ : ToolsLib.java
lib/ : DBToolsPanel.jar

DBToolsPanel.java您的导入中,这种方式将是com.frank.db.tools.utility.ToolsLib并且Fit.java将会有com.frank.fit.utility.ToolsLib.

于 2013-09-24T19:19:21.840 回答