Java文件类在Windows 7中使用相对路径

时间:2013-01-10 16:00:34

标签: java file maven-2 relative-path

我在Maven2单元测试中遇到了一些令人困惑的行为。以下测试代码在Eclipse与Maven2中运行不同的结果:

File f = new File( JUnitConstants.TEST_FILE );
File root = new File( "." );
Log.info( "File Info:" );
Log.info( f.toString() + (f.exists() ? " exists" : " doesn't exist") );
Log.info( f.getAbsoluteFile().toString() + (f.getAbsoluteFile().exists() ? " exists" : " doesn't exist") );
Log.info( root.toString() + (root.exists() ? " exists" : " doesn't exist") );
Log.info( root.getAbsoluteFile().toString() + (root.getAbsoluteFile().exists() ? " exists" : " doesn't exist") );

在Eclipse中,一切都存在,单元测试运行正常。在maven中,f.exists()方法返回false;所以它认为文件不存在!以下是maven run test的输出:

2013-01-10 09:50:51,737 [main] INFO  - File Info:
2013-01-10 09:50:51,737 [main] INFO  - target\test-classes\test\test.img doesn't exist
2013-01-10 09:50:51,737 [main] INFO  - C:\Users\me\code\HEAD\modules\project\target\test-classes\test\test.img exists
2013-01-10 09:50:51,737 [main] INFO  - . exists
2013-01-10 09:50:51,737 [main] INFO  - C:\Users\me\code\HEAD\modules\project\. exists

因此,文件存在,根目录是我所期望的,但是为什么Java在使用相对路径时认为该文件不存在?

我使用的是Windows 7,64位;使用JDK 1.6_38 32位。

2 个答案:

答案 0 :(得分:1)

我从未在测试中实际使用new File(filepath)构造函数。我总是用......

String filepath = "test/test.img"; // relative to src/test/resources
InputStream inputStream = getClass().getClassLoader().getResourceAsStream(filepath);

或者,如果资源文件与使用它们的测试具有相同的包结构,则可以使用更简单的...

String filename = "test.img"; // relative to src/test/resources/package/where/tests/live
InputStream inputStream = getClass().getResourceAsStream(filepath);

这似乎总是适用于Maven和我的coice IDE,IntelliJ IDEA

有关上述代码的详细说明,请参阅this blog post

答案 1 :(得分:0)

过了一段时间,我已经确定问题是对万不可的测试过程的分析。 maven构建在类似于以下命令的情况下运行测试:

cmd.exe /X /C ""C:\Program Files (x86)\Java\jdk1.6.0_38\jre\bin\java" -Djava.library.path=target/test-classes -jar C:\Users\me\AppData\Local\Temp\surefirebooter6580985433891892701.jar C:\Users\me\AppData\Local\Temp\surefire8381564625923782274tmp C:\Users\me\AppData\Local\Temp\surefire2578536694398675625tmp"

我可以从命令行使用那些确切的参数(在引号内)运行java并且一切正常,但是一旦我将它们分叉到另一个命令窗口(cmd.exe / X / C),它就会失败方式。

我通过在pom.xml文件中禁用分叉来解决这个问题:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <argLine>-Djava.library.path=target/test-classes</argLine>
        <forkMode>never</forkMode>
    </configuration>
</plugin>

这仍然必须在我的系统配置中,因为其他Windows 7 64位计算机没有此问题,但关闭分叉似乎是一种解决方案。