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替代