我有一个带模块的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,因此失败了不是模块目录。
Intellij尝试打开myProject/foo/bar.txt
而不是myProject/myModule/foo/bar.txt
有没有办法解决这个问题?
答案 0 :(得分:84)
受Guillaume启发的解决方案:
在Run->Edit configuration->Defaults->JUnit->Working directory
中设置值$MODULE_DIR$
,Intellij将像Maven一样设置所有junits中的相对路径。
答案 1 :(得分:25)
如果要保留代码,可以尝试更改运行/调试配置中的工作目录(组合框中的第一个条目可以访问您要运行的内容) 将其设置为模块根目录。 但更喜欢其他建议的方法:
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");
答案 2 :(得分:12)
a)不要使用Files,请使用InputStreams。通过
获取InputStream
ClassLoader.getSystemResourceAsStream("foo/bar.xml")
大多数处理文件的API也对InputStreams感到满意。
b)不要使用foo
目录,使用maven和IDE知道的目录(即将它们放在src/main/resources
或src/test/resources
中,这样它们就在类路径上)
c)如果你的API绝对需要File
,而不是InputStream
,你仍然可以
new File(ClassLoader.getSystemResource("foo/bar.xml").toURI())
答案 3 :(得分:2)
答案 4 :(得分:0)
如果您将项目文件(.idea)保存在与源代码相同的目录中,@ pbruyelle的解决方案就有效。如果您在另一个位置选择将项目文件保存在... ,则$ MODULE_DIR $会尝试在工作区目录中查找并找不到路径。这看起来像是IntelliJ上的一个错误,希望他们能尽快修复它。
解决方法: 您可以在工作目录
中指定maven模块的绝对/相对路径$MODULE_DIR$/../master/mavenmodule1
$MODULE_DIR$: points to workspace directory
../: relative path to source code
master: root directory of your source code
mavenmodule1: maven module name / directory name of the child module.
对于多模块maven项目,您无法选择,您需要具有指向该模块的不同运行配置。我希望有另一个变量只指向$ MAVEN_MODULE $($ MODULE_DIR $ / .. / master / $ MAVEN_MODULE $),因此我们可以将此配置用于所有模块。对于上面的示例,$ MAVEN_MODULE $将替换为mavenmodule1