2012-03-19 31 views
2

所以我看到已經有一個帖子非常類似於這個問題,但是我處於一種情況,我沒有權力指定這個文件在我的jar中的位置,所以我希望有人知道解決方案來解決這個問題。ClassLoader加載文件的錯誤實例

所以我目前使用下面的代碼片段來獲取一個文件作爲輸入流,文件'plugin.xml'位於jar的根目錄,我不能改變這個位置作爲另一個軟件(dynatrace)創建這個文件並確定它的位置。

標準片段:

InputStream is = JmxPlugin.class.getResourceAsStream("/plugin.xml");

現在我知道,問題是ClassLoader是拿起沿着類路徑的名稱相匹配「的plugin.xml」(第一個文件其中一個ISN在我的罐子裏,耶)。

任何人都可以想到一種方法來確保我拿起正確的文件,而不必移動它?我的類在jar中的相對路徑是com/something/jmx/JmxPlugin.class。

(Id而不必將jar打開到內存中)。

非常感謝任何捐款,

+0

我很困惑你的措辭。如果您的文件位於路徑根目錄下的jar文件中,並使用「plugin.xml」,那麼這是您在調用中需要使用的路徑。如果它在foo包中,那麼你需要「foo/plugin.xml」 - 那麼問題是什麼?如果你知道在你的jar文件中你想要的文件的位置,那麼只需傳入文件的位置。 – Jon 2012-03-19 16:41:37

+0

我看不到我的措辭不清楚:S基本上發生了什麼是:ClassLoader找到另一個文件,也稱爲' plugin.xml'放在另一個jar中,它位於classpath之前的jar中,所以當它首先發現它基本上是這樣說的時候,「哦,我找到了'plugin.xml',這是一個!而不是...... – buymypies 2012-03-19 16:49:33

+0

你忘了提及有多個罐子參與。通過閱讀你的問題,這聽起來像你在一個罐子裏談論重複的文件。無論如何,假設這兩個jar文件中的兩個文件都有完全相同的路徑,那麼您可以使用ClassLoader.getResources(「path/in/both/jars」),它將返回表示與該路徑匹配的東西的資源的Enumeration。然後你必須確定哪個是正確的。否則,你將不得不實現你自己的ClassLoader來解決這個問題。 – Jon 2012-03-19 17:09:39

回答

0

我沒有絕對的把握,但好像Thread.currentThread().getContextClassLoader().getResourceAsStream("/plugin.xml")可以解決您的問題。如果沒有,你必須創建你自己的ClassLoader並解決那裏的問題。

+0

謝謝,但我已經試過這個沒有運氣:( – buymypies 2012-03-19 16:23:06

0

的simplies辦法是將你的罐子在classpath中是第一個包含plugin.xml中, 另一種方法是使用getResource()方法來查找您的jar文件:

URL myJar=JmxPlugin.class.getResource("/"+JmxPlugin.class.getName().replace(".","/")+".class"); 

然後使用這個網址打開jar文件並提取Plugin.xml。