2013-09-24 27 views
0

我正在使用Netbeans開發我的項目,我最近發現一個jar文件中的類遮蓋了另一個具有相同名稱的文件,如何解決這個問題?如何解決被jar文件蓋過的類的問題?

我有一個名爲DB_Tools_Panel項目,它具有以下結構:

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

所以裏面的src目錄有一個文件:DB_Tools_Panel.java,並在src目錄有一個叫做效用目錄,在Utility裏面有一個名爲Tools_Lib.java的文件。

我包裝這個項目到一個JAR文件:DB_Tools_Panel.jar

然後我創建了一個第二項目飛度,它具有以下結構:

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只運行Tools_Lib.java從包DB_Tools_Panel.jar中,它不會在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中的Tools可能更高級,有時候我測試DB_Tools_Panel並確保它正常工作並將其打包到jar文件中,並在其他項目中使用它,Utility/Tools_Lib.java用於稍後的項目中,並且需要改進,但我不一定要總是返回到DB_Tools_Panel.jar並更新其中的Tools_Lib.java。

所以我的問題是:

[1]在此情況下,纔有可能有2個不同的Tools_Lib.java文件在信託基金項目,之一,飛度/ src目錄/工具/,另外在飛度/ 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?

如何讓2個Tools_Lib.java不同,並且仍然可以在 Fit/src/Utility中改變它,並在Fit項目中使用它,就好像DB_Tools_Panel.jar中的那個不一樣存在嗎?

+2

你爲什麼給他們同名?爲這兩個類使用適當的包,可能會有大量的Tool_Lib。更好的是:給他們更有意義的名字! –

+0

搜索順序決定搜索順序。一個jar永遠不會在搜索順序中與包含類文件的目錄位於同一個槽中 - 一個必須先於另一個。找出您的搜索順序。但是請注意,不能使用單獨的類加載器同時加載兩個同名的類(並且很難同時引用這兩個類)。 –

回答

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.ToolsLibFit.java將有com.frank.fit.utility.ToolsLib

3
  1. 使用不同的名稱。
  2. 如果您不能使用不同的名稱,請將這兩個類放入兩個不同的包中。
  3. 如果您不能將它們放到兩個不同的包中,因爲您需要在同一個項目中使用同一個庫的兩個不同版本,那麼您有兩種可能性來避免衝突:a)使用兩個不同的類加載器 b)使用陰影將一個類移動到另一個包(在編譯時有一個maven插件)