2013-10-16 135 views
0

我有幾個罐子包含完全相同的類。相同的類是在多個罐子

可以說例如,A.jar和B.jar具有相同的類Hello.class。 ; B.jar com.testing.testcode

我的問題是,它是否將運行與否

的java -classpath a.jar文件:如果我運行下面會發生什麼?從我理解的類加載器將掃描類路徑,它將返回首先找到的任何Hello.class。

我知道我可以避免這個問題,如果我使用OSGi加載一個特定的類。

但我的問題是 - 這是否會運行?或者,java -classpath A.jar; B.jar com.testing.testcode將由於具有相同類的兩個版本而分解。

+0

運行它時發生了什麼?結果是否令人困惑? –

+0

只要您不使用衝突類,編譯器就會保持沉默,只要您使用,就需要使用package.classname格式。其他代碼不會編譯。 –

+0

那麼,當你嘗試時發生了什麼? – scottb

回答

3

這會工作,並在類路徑中的第一個Hello類將在這種情況下使用,因此,從a.jar文件

+1

*通常*會起作用,類路徑中的第一個類將是使用的類。但是,在某些情況下,引用問題類的類可能會在引用類的jar中爲該版本「表示偏好」。這可能會導致「相同」類被加載兩次,這並不總是一個問題,但可以。 –

+0

Thx爲澄清 –

+1

如何可能出現一種情況,即它將如何表達偏好「的引用類的jar中的版本? – Exploring

0

類路徑之一是「路徑」。第一場比賽是採取的。

有一個引導類路徑首先被檢查,這包括JRE中的JAR。順便說一句,你可以預先設置這些並覆蓋系統類,但你不應該在許可協議中被允許。

0

無論何時將jar包括到類路徑中,啓動時/應用程序類都會加載到容器中。

現在你的代碼是否將工作或沒有將取決於罐子被第一次加載在你的容器,因此,如果你是幸運的,然後在您的當前設置,將工作否則你可能得到一些錯誤,指出method1 doesn't accept Type1 it should accept Type2

+0

或者你可能會得到一個類將TheClass轉換爲TheClass,如果TheClass被加載兩次。 –

相關問題