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

发布于 2024-11-01 07:40:51 字数 543 浏览 0 评论 0原文

我有一个带有模块的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

明媚殇 2024-11-08 07:40:51

受纪尧姆启发的解决方案:

Run->Edit configuration->Defaults->JUnit->Working Directory 中设置值 $MODULE_DIR$ 并且 Intellij 将设置所有 junit 中的相对路径就像 Maven 一样。

Solution inspired by Guillaume :

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.

我的痛♀有谁懂 2024-11-08 07:40:51

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

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");

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:

ClassLoader.getSystemResourceAsStream(youPath) 

Or my preferred:

getClass.getResource(youPath)

or

getClass.getResourceAsStream(youPath)

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:

project-root  
  - module A  
    - src  
      - test
        - rootfile.txt  
        - my-complicated-package-naming-root
          - mypackage
            - Test.java
            - testResource.xml  

I can get the files this way:

final URL rootfile= Test.class.getResource("/rootfile.txt");
final URL testResource= Test.class.getResource("testResource.xml");
怎樣才叫好 2024-11-08 07:40:51

a) 不要使用文件,使用输入流。 获取您的 InputStream

ClassLoader.getSystemResourceAsStream("foo/bar.xml")

通过大多数处理文件的 API

也对 InputStreams 感到满意。 b) 不要使用 foo 目录,使用 maven 和你的 IDE 都知道的目录(即将它们放在 src/main/resources 或 src/test/ 中)资源,因此它们位于类路径上)

c) 如果您有一个绝对需要 File 而不是 InputStream 的 API,您仍然可以这样做

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

a) Don't use Files, use InputStreams. get your InputStream via

ClassLoader.getSystemResourceAsStream("foo/bar.xml")

Most 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 in src/main/resources or src/test/resources, so they are on the Class Path)

c) If you have an API that absolutely needs a File, not an InputStream, you can still do

new File(ClassLoader.getSystemResource("foo/bar.xml").toURI())
心碎的声音 2024-11-08 07:40:51

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

在此处输入图像描述

You can specify the working directory for the test runner in the Run/Debug Configurations window:

enter image description here

凉风有信 2024-11-08 07:40:51

如果您将项目文件(.idea)保存在与源代码相同的目录中,@tbruyelle 的解决方案就可以工作。如果您在其他位置选择将项目文件保留在...,则 $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

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

$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.

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文