一尘不染

即使通过context.getRealPath获取路径,在servlet中也找不到文件?

tomcat

概要

给定以下(简化的)代码,该代码位于Servlet的服务器端(Tomcat为容器)。这是一个GWT应用程序,尽管应该无关紧要(我认为)。

ServletContext context = getServletContext();
String dataFilePath= context.getRealPath("/WEB-INF/dir/dataFile.txt");
File dataFile = new File(dataFilePath);

TestCaseGenerator testCaseGenerator = new TestCaseGenerator(dataFile);
testCaseGenerator.generateTestCase();

TestCaseGenerator是项目war/WEB-INF/lib文件夹中jar中的类,已作为外部库添加到GWT项目中。

问题

如果testCaseGenerator.generateTestCase()得到执行,这是无法用dataFile创建new LineNumberReader(new FileReader(dataFile));,一个FileNotFoundException被抛出。

我已经验证的StringdataFilePath正确,并且包含我需要读取的服务器上文件的正确实际路径,以及那dataFile不是null。我还验证了TestCaseGenerator在此GWT应用程序外部从命令行调用时该命令运行正常。

考虑到我将其传递给文件的真实文件路径,我不确定为什么TestCaseGenerator不能使用File我传递的对象。我可以提出一些替代解决方案来解决此问题,但是现在我真的很好奇为什么它找不到该文件。

预先感谢您的任何见解。


阅读 694

收藏
2020-06-16

共1个答案

一尘不染

解决了

我傻傻的忘了包括dir/dataFile.txtbuild.xmlwar目标,所以实际上没有被包含在文件war包,因此从来没有放置在Tomcat的容器内。

<include name="dir/**" />

而且我也误解了context.getRealPath("/WEB- INF/dir/dataFile.txt");实际的回报;从ServletContext
javadoc

获取与给定虚拟路径相对应的真实路径。例如,如果path等于/index.html,则此方法将返回服务器文件系统上的绝对文件路径,该文件的格式为http://://index.html的请求将映射到该文件,该位置对应于此ServletContext的上下文路径。

因此,即使getRealPath返回路径值,也不一定意味着文件位于该实际路径。

2020-06-16