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