簡體   English   中英

如果設置到任何目錄,如何從類路徑加載資源?

[英]can I load resource from classpath if set to any directory?

我想以此加載資源:

InputStream iStream = Config.class.getResourceAsStream("autopublisherpath.cfg");

因此,我設置了CLASSPATH使其起作用。 這是我的目錄層次結構:

- autopublisher
     .classes
     .lib
     .resources

如果我將%AUTOPUBLISHER_HOME%\\ resources \\ config添加到我的類路徑中,則無法獲取資源。 否則,如果將.cfg文件放在類中並添加%AUTOPUBLISHER_HOME%\\ classes,則資源將正確加載。 類dir除了autopublisherpath.cfg外不包含其他任何內容。

最終我想打電話給:

java com.test.Something

什么地方正在加載資源。 問題是我希望用戶修改此配置文件,因此我不將其包含在jar包裝中。

我不能正確理解CLASSPATH嗎?

謝謝

使用getResourceAsStream時要注意的一件事是要檢索的資源名稱的格式。 默認情況下,如果未指定路徑,例如“ autopublisherpath.cfg”,則類加載器將期望所指定的資源與在其上執行getResourcesAsStream方法的Class處於同一包中。 可以在JVM文檔中找到getResourceAsStream的原因是

  • 如果名稱以'/'('\\ u002f')開頭,則資源的絕對名稱是名稱中'/'之后的部分。
  • 否則,絕對名稱的格式如下: modified_package_name/name

在您的特定示例中,如果Config類位於com.test.config包中,則“ autopublisherpath.cfg”資源名稱將轉換為“ /com/test/config/autopublisherpath.cfg”(包中的句點)替換為'/'字符)。 因此,與原始項目層次結構保持一致,您需要將文件放入以下位置:

autopublisher/resources/config/com/test/config 

在其中將autopublisher/resources/config添加為應用程序執行類路徑的一部分。

如果要在類路徑中添加特定的配置目錄,並希望文件位於該目錄的根目錄中,則需要在文件名前加上'/'字符,以指定資源在類路徑的根包中。

InputStream iStream = Config.class.getResourceAsStream("/autopublisherpath.cfg");

使用此代碼,您應該能夠將resource/config目錄添加到類路徑並按預期讀取文件。

附帶說明一下, getResourceAsStream方法使用執行資源的類的類加載器(在本例中為Config)加載資源。 除非您的應用程序使用多個類加載器,否則您可以使用this.getClass().getResourceAsStream(...)從任何類實例中執行相同的功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM