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