我有一个带有模块的Maven项目
/myProject pom.xml /myModule pom.xml /foo bar.txt
考虑一下 myModule 中的Junit,它需要打开 bar.txt ,其中maven的basedir是模块目录。
因此,打开文件 bar.txt :
new File("foo/bar.txt")
当您在 intellij中* 启动相同的junit 时执行mvn test BUT 时,此方法效果很好,但会失败,因为Intellij在项目目录而不是模块目录中设置了basedir。 *
mvn test
Intellij尝试打开myProject/foo/bar.txt而不是myProject/myModule/foo/bar.txt
myProject/foo/bar.txt
myProject/myModule/foo/bar.txt
有办法解决吗?
如果要保留代码,可以尝试在运行/调试配置中更改工作目录(组合框中的第一个条目,可以访问要运行的内容),将其设置为模块根目录。但更喜欢其他建议的方法:
ClassLoader.getSystemResourceAsStream(youPath)
还是我的首选:
getClass.getResource(youPath)
要么
getClass.getResourceAsStream(youPath)
路径中的前导“ /”表示项目的工作目录,而没有“ /”表示当前类的相对目录。
我将最后一种解决方案用于测试:将测试数据资源放在与测试源相同的程序包级别,或放在子目录中,以避免程序包太乱。
这样,我可以进行简单的调用而无需复杂的路径,而不必处理工作目录:
project-root - module A - src - test - rootfile.txt - my-complicated-package-naming-root - mypackage - Test.java - testResource.xml
我可以这样获取文件:
final URL rootfile= Test.class.getResource("/rootfile.txt"); final URL testResource= Test.class.getResource("testResource.xml");