Maven与Intellij之间如何处理Junit中的相对path
我有一个模块的Maven项目
/myProject pom.xml /myModule pom.xml /foo bar.txt
考虑在myModule中需要打开bar.txt的Junit,maven的basedir是模块目录。
所以打开文件bar.txt :
new File("foo/bar.txt")
当你在intellij中启动相同的junit的时候 ,当你执行mvn test
时候这个效果很好,但是因为Intellij在工程目录中设置了basedir而不是在module目录中,所以失败了。
Intellij尝试打开myProject/foo/bar.txt
而不是myProject/myModule/foo/bar.txt
有办法处理吗?
如果你想保留你的代码,你可以尝试改变运行/debuggingconfiguration中的工作目录(combobox中的第一个条目,提供你想要运行的内容)。将其设置为你的模块根目录。 但更喜欢其他build议的方法:
ClassLoader.getSystemResourceAsStream(youPath)
或者我的首选:
getClass.getResource(youPath)
要么
getClass.getResourceAsStream(youPath)
path中的前导“/”表示项目的工作目录,而不是“/”表示当前类的相对目录。
我使用最后一个解决scheme进行testing:我将testing数据资源放在与testing源相同的包级别,或者放在子目录中,以避免太杂乱的包装。
这样我可以做一个简单的调用没有复杂的path,而不必处理工作目录:
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");
Guillaume启发的解决scheme:
在Run->Edit configuration->Defaults->JUnit->Working directory
设置值$MODULE_DIR$
,Intellij将像Maven一样在所有的junit中设置相对path。
a)不要使用文件,使用InputStreams。 通过获取您的InputStream
ClassLoader.getSystemResourceAsStream("foo/bar.xml")
大多数处理文件的API都对InputStreams很满意。
b)不要使用foo
目录,同时使用maven和你的IDE知道的目录(即把它们放在src/main/resources
或者src/test/resources
,这样它们就在Class Path中)
c)如果你有一个API,绝对需要一个File
,而不是一个InputStream
,你仍然可以
new File(ClassLoader.getSystemResource("foo/bar.xml").toURI())
您可以在“运行/debuggingconfiguration”窗口中指定testing运行器的工作目录:
如果您将项目文件(.idea)保存在与源代码相同的目录中,则@tbruyelle的解决scheme将起作用。 如果您select将项目文件保存在…中的不同位置,则$ MODULE_DIR $正试图在工作区目录中查找,并且找不到path。 这看起来像IntelliJ上的错误,希望他们尽快修复。
解决方法:您可以在工作目录中指定maven模块的绝对/相对path
$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项目你没有select,你需要有一个不同的运行configuration指向该模块。 我希望有另外一个variables指向$ MAVEN_MODULE $($ MODULE_DIR $ / .. / master / $ MAVEN_MODULE $),所以我们可以在所有模块中使用这个configuration。 对于上面的例子,$ MAVEN_MODULE $将被mavenmodule1替代
- Scala中的_root_包是什么?
- 从Eclipse切换到适用于Android开发的IntelliJ IDEA的好处
- 在Android Studio中支持@SuppressWarnings值
- IntelliJ IDEA:如何重命名一个项目(在“最近的项目”列表)?
- 在Android Studio中打开最后closures的标签
- 无法删除真正存在的文件 – fatal:pathspec …没有匹配任何文件
- JavaLaunchHelper类是在两个地方实现的
- 如何使用WebStorm进行Chrome扩展程序开发?
- configurationIntelliJ IDEA,以便在git中检测到源,但检测到未注册的VCS根目录