1

概要

给定以下(删节的)代码,它位于 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是项目文件夹中 jar 中的一个类,war/WEB-INF/lib已作为外部库添加到 GWT 项目中。

问题

testCaseGenerator.generateTestCase()被执行时,它无法用于dataFile创建 a new LineNumberReader(new FileReader(dataFile));, aFileNotFoundException被抛出。

我已经验证了 的StringdataFilePath是正确的,并且包含我需要读取的服务器上文件的正确真实路径,dataFile也不是null. 我还验证了TestCaseGenerator在此 GWT 应用程序之外从命令行调用时运行良好。

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

提前感谢您的任何见解。

4

1 回答 1

0

解决了

我愚蠢地忽略了将 包含dir/dataFile.txt在我build.xmlwar目标中,因此实际上该文件并未包含在war包中,因此从未放置在 Tomcat 容器中。

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

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

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

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

于 2013-01-16T19:24:11.073 回答