2017-05-11 96 views
0

如何確定動態加載我的罐子的罐子的名稱?可能嗎?我嘗試了許多使用ClassLoader的變體,但沒有成功。確定動態加載的罐子的加載器罐子

在此先感謝。

讓我解釋一下爲什麼我需要「loader jar」的名字。在我們的容器,我們有下面幾行:

URLClassLoader classLoader = new URLClassLoader(new URL[] { artifact.getFile().toURI().toURL() }); 
Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); 
method.setAccessible(true); 
method.invoke(classLoader, artifact.getArtifact().getFile().toURI().toURL()); 
Class<?> processorClass = classLoader.loadClass(className); 
Object processorClassInstance = processorClass.newInstance(); 

當加載的類實例化時,上面的newInstance,它的屬性文件是外部類所在的罐子。配置文件位於一個以包含執行上面代碼行的類的容器jar命名的目錄中。因此,如果部署的容器jar名爲RedcapTDP.jar,則配置文件位於「C:... \ RedcapTDP」中。當部署RedcapTDP.jar時,它會動態加載配置的Maven工件,然後它將從RedcapTDP目錄讀取它的配置文件。

我希望說清楚!

+0

'class processorClass = classLoader.loadClass(className);'這樣這個行返回的類,在instatiated需要從一個依賴於上面知道的'artifact'的名稱的目錄加載配置嗎? – Strelok

+0

它將根據包含執行該代碼行的類的jar名稱從目錄加載配置。 – user481779

回答

1

如何確定動態加載我的jar的jar名稱?可能嗎?

從字面上看,不,它顯然是不可能的。事實上,它甚至沒有意義。 Java根本不會「加載」Jars,儘管它可能會加載一個或多個包含在jar中的類。當它這樣做時,它是VM加載類,而不是任何jar加載它。

解釋你更寬鬆一點,也許你問:「我如何確定其依賴於我的jar中的一個類導致我的類被加載,以及如何確定從哪個jar其他課程被加載的文件?「除非你的控件超出了jar中的類,否則這是不可能的。

加載是類初始化之前的一個單獨的步驟,類初始化是有任何機會執行任何代碼包含在您的類中的第一個點。因此,當你的課堂第一次有機會詢問任何事情時,課堂加載不再是持續的。此外,班級並不一定是從罐子裝載的,無論如何,他們都不會提供關於他們裝載來源的信息。

我或許可以走到更遠的地方,猜測你可能會問什麼,但我看不出有什麼解釋的問題提供了不同於「不,這是不可能的」的答案。

+0

請參閱上文。我編輯帖子來描述爲什麼我需要容器jar的名字。 – user481779

+0

沒關係*爲什麼*你想要它,@ user481779。滾石對你有一些話:你不能總是得到你想要的。 –

+0

謝謝你的明確答案。我想我們會找到另一種方式。再次感謝你的回覆。 – user481779

0

JAR不加載JAR。一個jar文件只是一個無意義的容器,有助於將類文件和其他資源放在一起。類由類加載器從提供給jvm的類路徑加載。你想要做的是不可能的。也許你可以解釋你想要達到的目標,也許有更好的方法去實現它。

+0

見上文。我編輯帖子來描述爲什麼我需要容器jar的名字。 – user481779