[英]loading from JAR files during deployment vs development
當我將一些數據加載到我的java程序中時,我通常使用FileInputStream。 但是我將程序部署為jar文件和webstart,所以我必須使用getRessource()或getRessourceAsStream()直接從jar文件加載數據。
現在總是在開發和部署之間切換這段代碼很煩人嗎?
有這種方法嗎? 即有沒有辦法知道代碼是否從jar運行?
當我嘗試像這樣加載它時:
InputStream is = this.getClass().getResourceAsStream("file.txt");
返回的輸入流只是null,盡管該文件肯定在應用程序的根目錄中。
謝謝!
為什么在開發期間使用FileInputStream
? 為什么不從一開始就使用getResourceAsStream
? 只要將文件放在類路徑中的適當位置,就不會有任何問題。 它仍然可以是本地文件系統中的文件,而不是jar文件中的文件。
在考慮最終部署環境的情況下開發是有幫助的。
編輯:如果你想在類路徑的根目錄中有東西,你應該使用:
InputStream x = getClass().getResourceAsStream("/file.txt");
要么
InputStream x = getClass().getClassLoader().getResourceAsStream("file.txt");
基本上Class.getResourceAsStream
將解析包含該類的包的相對資源; ClassLoader.getResourceAsStream
解析相對於“root”包的所有內容。
您可以將您的數據始終作為資源閱讀。 您只需將數據所在的路徑添加到類路徑中。
如果您的數據保留在jar文件中的WEB-INF/somewhere/mydata.txt
,您將使用以下命令訪問它:
getClass().getResourceAsStream( "/WEB-INF/somewhere/mydata.txt" )
現在,如果您創建一個開發目錄/devel/WEB-INF/somewhere/mydata.txt
並將/devel
放入類路徑,那么您的代碼將在開發和生產中使用。
有問題的解釋后編輯:
在你的情況this.getClass().getResourceAsStream( "mydata.txt" )
的資源是從哪里的類文件的同一位置拍攝this
是取自。 如果你想保留它,那么你必須創建一個目錄/devel/<path of package>/mydata.txt
並再次添加/devel
到你的類路徑。
如何通過-D開關在開發環境中設置系統屬性? 例如java -D:mypropertyname = mypropertyvalue
您可以在開發環境中的ant腳本中設置屬性,其他環境不會獲取屬性:例如
public static boolean isDevEnvironment(){ return System.getProperty("mypropertyname")!=null;}
您可能會從現有的系統屬性中找到一種更好的方法來破解它
如果文件被認為是已部署應用程序的一部分(而不是安裝特定文件的一部分)並且可以通過類路徑定位,那么請考慮簡單地始終使用getResourceAsStream,因為無論實際部署方案如何,只要它在類路徑。
您可能還會發現JVM提供的相關信息(如果安全管理員允許):
// Get the location of this class
Class cls = this.getClass();
ProtectionDomain pDomain = cls.getProtectionDomain();
CodeSource cSource = pDomain.getCodeSource();
URL loc = cSource.getLocation(); // file:/c:/almanac14/examples/
http://www.exampledepot.com/egs/java.lang/ClassOrigin.html?l=rel
開發與部署,IHMO之間應該沒有任何區別。
Classloader.getResource或getResourceAsStream運行良好,您可以讀取資源甚至編寫它們。您可以編寫自己的協議句柄並將所有內容作為URL / URI訪問,這樣您就可以讀取和寫入資源,並且可以正確識別實際提供的人員資源。
唯一的問題是如果URLStreamHandlerFactory已經注冊(在J2EE應用程序中,容器可以安裝工廠而你沒有任何方法可以自行安裝)並且你無法在任何地方使用你的處理程序。
知道這一點,最好實現自己的“資源”。 那時我需要它,我找不到那樣的東西所以我必須實現自己的ResourceManager。 對我來說,訪問像這樣的資源看起來更直觀
Resource layout = ResourceManager.resolve("view://layout/main.jsp")
代替
URL layout = Classloader.getResource("some_package/view/layout/main.jsp")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.