解决由jar文件掩盖的类

时间:2013-09-24 18:57:17

标签: java jar

我正在使用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项目中之后, DB_Tools_Panel.jar中的Tools_Lib.java将掩盖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中的那个不存在一样?

2 个答案:

答案 0 :(得分:3)

  1. 使用不同的名称。
  2. 如果您不能使用不同的名称,请将这两个类放入两个不同的包中。
  3. 如果您不能将它们放入两个不同的包中,因为您需要在同一个项目中使用同一个库的两个不同版本,那么您有两种方法可以避免冲突:
    a)使用两种不同的ClassLoaders
    b)使用着色将一个类移动到另一个包(有一个maven插件,用于在编译时执行此操作)

答案 1 :(得分:1)

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

对于您的班级名称,您不应该使用_。它反对Code Conventions

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

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.javacom.frank.fit.utility.ToolsLib {{1}} {{1}}。