一尘不染

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

java

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

有办法解决吗?


阅读 346

收藏
2020-12-03

共1个答案

一尘不染

如果要保留代码,可以尝试在运行/调试配置中更改工作目录(组合框中的第一个条目,可以访问要运行的内容),将其设置为模块根目录。但更喜欢其他建议的方法:

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");
2020-12-03