2012-10-01 70 views
0

我想加載一個名字在屬性文件中指定的類。這是相同的代碼。Java getResourceAsStream無法加載資源

try { 
    Properties properties = new Properties(); 
    InputStream in = MyAbstractFactory.class.getResourceAsStream("/some.properties"); 
    properties.load(in); 
    String impl = properties.getProperty("key"); 
    MyAbstractFactory factories = (MyAbstractFactory) Class.forName(impl).newInstance(); 
    return factories; 
} catch (Exception e) { 
    return new DefaultFactoriesImpl(); 
} 

此代碼是jar文件的一部分。屬性文件就在jar外面。它無法加載屬性文件,而是加載DefaultFactoriesImpl。我知道這發生在MyAbstractFactory.class.getResourceAsStream找不到類路徑中的資源時,但這似乎並不是這種情況。

導演結構: -

  • COM
  • myjar.jar
  • some.properties

命令我正在執行的是 「Java的罐子myjar.jar」

任何有關爲什麼這可能會發生的反饋。這可能與Clasloaders有關嗎?我想補充一點,當我從eclipse中運行這個代碼時,它似乎拿起some.properties就好了。

回答

0

從您傳遞給參數getResourceAsStream()的參數中刪除主斜槓。

執行JAR時,將JAR外部的文件夾放入CLASSPATH中。我不知道清單CLASSPATH是否會覆蓋您可能使用-cp傳遞的清單。玩吧;其中一個將工作。

找不到.properties文件,因爲它不在JVM CLASSPATH中。當你做得很好時,JVM會找到它。

+0

感謝您的回答。刪除前導斜槓將附加當前包名,這似乎不是正確的做法。當我嘗試解壓縮jar文件並運行它時,我在其中一個類文件中實現了一些「java.lang.ClassFormatError:代碼段在類文件中的長度錯誤」。不知道這些是相關的問題! –

+0

無論如何,我現在面對的似乎是一個不同的問題。所以是的,使用java -classpath運行它; myjar.jar com.fullyqualified.MainClass似乎正確地獲取屬性文件。 –