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



我在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运行测试的输出:

2013-01-10 09:50:51,737 [main] INFO  - File Info:
2013-01-10 09:50:51,737 [main] INFO  - targettest-classestesttest.img doesn't exist
2013-01-10 09:50:51,737 [main] INFO  - C:UsersmecodeHEADmodulesprojecttargettest-classestesttest.img exists
2013-01-10 09:50:51,737 [main] INFO  - . exists
2013-01-10 09:50:51,737 [main] INFO  - C:UsersmecodeHEADmodulesproject. exists

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

我在Windows 7, 64位;使用JDK 1.6_38 32位

我从未在测试中实际使用过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和我选择的IDE IntelliJ IDEA中工作。

关于上面代码的详细解释,请参阅这篇博文

经过一段时间后,我确定问题是可靠测试过程的分叉。maven构建在如下命令下运行测试:

cmd.exe /X /C ""C:Program Files (x86)Javajdk1.6.0_38jrebinjava" -Djava.library.path=target/test-classes -jar C:UsersmeAppDataLocalTempsurefirebooter6580985433891892701.jar C:UsersmeAppDataLocalTempsurefire8381564625923782274tmp C:UsersmeAppDataLocalTempsurefire2578536694398675625tmp"

我可以用这些确切的参数(引号内)从命令行运行java,一切正常,但是一旦我将它们fork到另一个命令窗口(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位计算机没有这个问题,但是关闭分叉似乎是一个解决方案。

相关内容

  • 没有找到相关文章

最新更新