正确加载.war文件中打包的文件

时间:2014-08-28 10:05:15

标签: java heroku

我的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"));

我做错了什么?

2 个答案:

答案 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文件已解压缩。