簡體   English   中英

正確加載打包在.war文件中的文件

[英]Properly load file packaged inside .war file

我有Java Web應用程序與工作jFuzzyLogic它使用庫rules.fcl它位於文件WEB-INF/rules/rules.fcl

在我的本地服務器上,一切似乎都正常,但是當我向Heroku部署戰爭時,出現以下錯誤:

java.lang.NullPointerException
java.io.FileInputStream.<init>(FileInputStream.java:133)
java.io.FileInputStream.<init>(FileInputStream.java:96)
java.io.FileReader.<init>(FileReader.java:58)
net.sourceforge.jFuzzyLogic.FIS.load(FIS.java:143)
net.sourceforge.jFuzzyLogic.FIS.load(FIS.java:130)
com.vukstankovic.professionalorientation.Results.calculation(Results.java:119)

在第119行的“ Results ,我試圖像這樣加載rules.fcl

FIS fis = FIS.load(ctx.getRealPath("WEB-INF/rules/rules.fcl"));

在此方法的開頭,我具有以下注釋:

@Context ServletContext ctx;

我究竟做錯了什么?

您應該使用ServletContext#getResourceAsStream它將根據war包的根級別使用設計的路徑加載文件:

InputStream inputStream = ctx.getResourceAsStream("/WEB-INF/rules/rules.fcl");

然后,由您決定使用該流並將其鏈接以加載文件內容。 如果有一個FIS#load方法接受InputStream作為參數,則應該像下面這樣:

boolean verbose = true; //Just choose your suitable value (verbose mode or not)
FIS fis = FIS.load(inputStream, verbose);

剛剛從該svn repo中捕獲了方法簽名。

傳遞給ServletContext.getRealPath()路徑應以'/'字符開頭:

FIS fis = FIS.load(ctx.getRealPath("/WEB-INF/rules/rules.fcl"));

並根據javadoc

如果servlet容器由於某種原因(例如,當從.war歸檔中提供內容時)無法將虛擬路徑轉換為真實路徑,則此方法返回null

因此,如果未提取.war存檔,則此方法將不起作用。 確保已部署的.war文件解壓縮。

暫無
暫無

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

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