2012-02-28 102 views
1

以下情形加載外部屬性文件在同級目錄

./ 
config/ 
    application.properties 
lib/ 
    properties-loader-0.0.1-SNAPSHOT.jar 
acme.sh 

properties-loader-0.0.1-SNAPSHOT.jar是一個可執行的JAR一個清單文件。 瓶子內有一個包裝com.acme.lab,只包含類別 ,全稱爲com.acme.lab.PropertiesLoader

腳本acme.sh執行以下命令:

java -cp etc/application.properties:./lib/properties-loader-0.0.1-SNAPSHOT.jar com.acme.lab.PropertiesLoader 

我試圖訪問屬性從PropertiesLoader類文件。我讀了文章Smartly load your properties,但仍然有問題訪問屬性文件

所有這些電話無法加載該文件。

我只知道錯誤與類路徑有關,但似乎無法找到它。我在github上創建了一個重現問題的示例項目項目。

+0

@drhirsch我認爲在這種情況下,標籤'maven-assembly-plugin'標籤可能比'assemblies'更合適。 – oschrenk 2012-02-28 18:48:11

+0

當然,把它改成你認爲合適的東西 - 但是像以前一樣,「組裝」是錯誤的。事實上,正是這個標籤,是我帶來的 - 它是關於機器碼的。每個標籤都有一個描述 - 如果您不確定,請閱讀它。 – hirschhornsalz 2012-02-28 18:52:31

+0

忘記我可以自己改變它。謝謝你的提示。 – oschrenk 2012-02-28 18:56:54

回答

4

資源從它們的類路徑根進行解釋。而你的情況,當你運行你的程序是這樣的:

java -cp etc/application.properties:./lib/properties-loader-0.0.1-SNAPSHOT.jar 

根是

  • ./etc/application.properties
  • ./lib/properties-loader-0.0.1-SNAPSHOT.jar

均未包含您application.properties文件(如一個子資源)。如果修改您的命令是這樣的:

​​

然後你可以看你的財產在你的程序文件如:

Thread.currentThread().getContextClassLoader().getResourceAsStream("application.properties"); 

作爲一個側面說明,它總是最好使用在classpath完全合格的路徑設置。


*編輯*

這是一個工作的例子,應該說明資源加載:

mkdir props; cd props 
mkdir etc; touch etc/application.properties 
mkdir test; vi test/PropLoader.java 

該內容到編輯器中粘貼然後保存:

package test; 

import java.io.InputStream; 

public class PropLoader { 
    public static void main(String[] args) { 
     try { 
     final String path; 
     if(args.length == 1) path = args[0].trim(); 
     else path = "etc/application.properties"; 

     final InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(path); 
     if(is == null) throw new RuntimeException("Failed to load " + path + " as a resource"); 
     else System.out.printf("Loaded resource from path: %s\n", path); 
     } catch(Exception e) { 
     e.printStackTrace(); 
     } 
    } 
} 

並測試:

javac test/PropLoader.java 
java -cp . test.PropLoader 

產量是Loaded resource from path: etc/application.properties

+0

我正確地理解classpath參數應該只包含路徑和jar,以便可以從那裏加載子資源?另外我[嘗試](https://github.com/oschrenk/properties-loader/compare/stackoverflow)解決方案,但它仍然返回null作爲InputStream。 – oschrenk 2012-02-28 18:32:29

+0

是的,你的classpath只能包含'paths'和archives(jars)。我編輯了我的答案,其中包含一個應該能夠正確執行的例子。 – Perception 2012-02-28 19:09:10

+0

我可以按照你的例子。感謝澄清。 – oschrenk 2012-02-28 19:31:58