如何处理Junits中Maven和Intellij之间的相对路径
我有一个带有模块的 Maven 项目
/myProject
pom.xml
/myModule
pom.xml
/foo
bar.txt
考虑 myModule 中的 Junit 需要打开 bar.txt,对于 maven,basedir 是模块目录。
因此,要打开文件 bar.txt :
new File("foo/bar.txt")
当您执行 mvn test
BUT 时,当您在 intellij 中启动相同的 junit 时,效果很好,它失败,因为Intellij在项目目录中设置basedir,而不是模块目录。
Intellij 尝试打开 myProject/foo/bar.txt 而不是 myProject/myModule/foo/bar.txt
有没有办法解决这个问题?
I have a maven project with a module
/myProject
pom.xml
/myModule
pom.xml
/foo
bar.txt
Consider a Junit in myModule which needs to open bar.txt, with maven the basedir is the module directory.
So to open the file bar.txt :
new File("foo/bar.txt")
This works well when you execute mvn test
BUT when you launch the same junit in intellij, it fails because Intellij sets the basedir in the project directory, not the module directory.
Intellij tries to open myProject/foo/bar.txt
instead of myProject/myModule/foo/bar.txt
Is there a way to deal with that ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
在
Run->Edit configuration->Defaults->JUnit->Working Directory
中设置值$MODULE_DIR$
并且 Intellij 将设置所有 junit 中的相对路径就像 Maven 一样。In
Run->Edit configuration->Defaults->JUnit->Working directory
set the value$MODULE_DIR$
and Intellij will set the relative path in all junits just like Maven.如果您想保留代码,可以尝试更改运行/调试配置中的工作目录(组合框中的第一个条目可以访问您想要运行的内容)
将其设置为您的模块根目录。
但更喜欢其他建议的方法:
或者我的首选:
或
路径中的前导“/”表示项目的工作目录,而没有“/”则表示当前类的相对目录。
我在测试中使用最后一个解决方案:我将测试数据资源放在与测试源相同的包级别,或者放在子目录中以避免包太混乱。
这样我就可以进行简单的调用,无需复杂的路径,也无需处理工作目录:
我可以通过这种方式获取文件:
If you want to keep your code, you can try to change the working directory in the run/debug configuration (first entry in the combo box giving access to what you want to run)
Set this to your module root.
But prefer the other suggested approach:
Or my preferred:
or
A leading '/' in path indicates the working dir of your project, while no '/' indicates a relative dir to current class.
I use this last solution for my tests: I put my test data resources at the same package level as the test source, or in a subdir to avoid too messy package.
This way I can do a simple call without complicated path and without having to deal with working directory:
I can get the files this way:
a) 不要使用文件,使用输入流。 获取您的
InputStream
通过大多数处理文件的 API
也对 InputStreams 感到满意。 b) 不要使用 foo 目录,使用 maven 和你的 IDE 都知道的目录(即将它们放在 src/main/resources 或 src/test/ 中)资源,因此它们位于类路径上)
c) 如果您有一个绝对需要
File
而不是InputStream
的 API,您仍然可以这样做a) Don't use Files, use InputStreams. get your
InputStream
viaMost APIs that deal with Files are happy with InputStreams as well.
b) Don't use
foo
directories, use directories both maven and your IDE know about (i.e. put them insrc/main/resources
orsrc/test/resources
, so they are on the Class Path)c) If you have an API that absolutely needs a
File
, not anInputStream
, you can still do您可以在“运行/调试配置”窗口中指定测试运行程序的工作目录:
You can specify the working directory for the test runner in the Run/Debug Configurations window:
如果您将项目文件(.idea)保存在与源代码相同的目录中,@tbruyelle 的解决方案就可以工作。如果您在其他位置选择将项目文件保留在...,则 $MODULE_DIR$ 会尝试在工作区目录中查找,但找不到路径。这看起来像是 IntelliJ 上的一个错误,希望他们尽快修复。
解决方法:
您可以在工作目录中指定 Maven 模块的绝对/相对路径。
对于多模块 Maven 项目,您没有选择,您需要有一个指向该模块的不同运行配置。我希望有另一个变量只指向 $MAVEN_MODULE$ ($MODULE_DIR$/../master/$MAVEN_MODULE$),这样我们就可以对所有模块使用此配置。对于上面的示例,$MAVEN_MODULE$ 将替换为 mavenmodule1
Solution from @tbruyelle works if you keep your project files(.idea) in the same directory as the source code. If you choose Keep Project files in ... in a different location, then $MODULE_DIR$ is trying to look up in the workspace directory and the paths cannot be found. This looks like a bug on IntelliJ, hope they fix it soon.
Workaround:
You can specify absolute / relative path of the maven module in working directory
For multi module maven project you don't have a choice, you need to have a different run configurations pointing to that module. I wish there is another variable that points just to the $MAVEN_MODULE$ ($MODULE_DIR$/../master/$MAVEN_MODULE$) so we can use this configuration for all modules. For the above example, $MAVEN_MODULE$ will be substituted with mavenmodule1