如何处理Maven和Intellij之间Junits的相对路径

时间:2011-04-12 15:31:47

标签: java maven-2 junit intellij-idea

我有一个带模块的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

有没有办法解决这个问题?

5 个答案:

答案 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/resourcessrc/test/resources中,这样它们就在类路径上)

c)如果你的API绝对需要File,而不是InputStream,你仍然可以

new File(ClassLoader.getSystemResource("foo/bar.xml").toURI())

答案 3 :(得分:2)

您可以在“运行/调试配置”窗口中指定测试运行器的工作目录:

enter image description here

答案 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