给定以下(简化的)代码,该代码位于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
war/WEB-INF/lib
如果testCaseGenerator.generateTestCase()得到执行,这是无法用dataFile创建new LineNumberReader(new FileReader(dataFile));,一个FileNotFoundException被抛出。
testCaseGenerator.generateTestCase()
dataFile
new LineNumberReader(new FileReader(dataFile));
FileNotFoundException
我已经验证的String值dataFilePath正确,并且包含我需要读取的服务器上文件的正确实际路径,以及那dataFile不是null。我还验证了TestCaseGenerator在此GWT应用程序外部从命令行调用时该命令运行正常。
String
dataFilePath
null
考虑到我将其传递给文件的真实文件路径,我不确定为什么TestCaseGenerator不能使用File我传递的对象。我可以提出一些替代解决方案来解决此问题,但是现在我真的很好奇为什么它找不到该文件。
File
预先感谢您的任何见解。
我傻傻的忘了包括dir/dataFile.txt我build.xml的war目标,所以实际上没有被包含在文件war包,因此从来没有放置在Tomcat的容器内。
dir/dataFile.txt
build.xml
war
<include name="dir/**" />
而且我也误解了context.getRealPath("/WEB- INF/dir/dataFile.txt");实际的回报;从ServletContext javadoc
context.getRealPath("/WEB- INF/dir/dataFile.txt");
获取与给定虚拟路径相对应的真实路径。例如,如果path等于/index.html,则此方法将返回服务器文件系统上的绝对文件路径,该文件的格式为http://://index.html的请求将映射到该文件,该位置对应于此ServletContext的上下文路径。
因此,即使getRealPath返回路径值,也不一定意味着文件位于该实际路径。
getRealPath