我的Java Web应用程序适用于jFuzzyLogic
库,该库使用位于rules.fcl
的{{1}}文件。
在我的本地服务器上,一切似乎都有效,但是当我向Heroku部署war时,我收到了这个错误:
WEB-INF/rules/rules.fcl
在我的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"));
我做错了什么?
答案 0 :(得分:1)
你应该使用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抓住了方法签名。
答案 1 :(得分:0)
传递给ServletContext.getRealPath()
的路径应以'/'
字符开头:
FIS fis = FIS.load(ctx.getRealPath("/WEB-INF/rules/rules.fcl"));
还根据javadoc:
如果servlet容器由于任何原因(例如,当
null
存档中提供内容时)无法将虚拟路径转换为实际路径,则此方法返回.war
。
因此,如果未提取.war
存档,则此方法无效。确保已部署的.war
文件已解压缩。