簡體   English   中英

在部署與開發期間從JAR文件加載

[英]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.

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