【问题标题】:dealing with path in Eclipse and maven在 Eclipse 和 maven 中处理路径
【发布时间】:2014-10-20 19:57:13
【问题描述】:

我有一个多模块 maven 项目(ModuleA、ModuleB、ModuleC)

我在 ModuleA 中有一个测试

@ContextConfiguration(locations = 
           { "file:../ModuleB/src/test/resources/application-context-test.xml",
             "classpath:/mvc-dispatcher-servlet-test.xml"
           })

从 ModuleB 中的文件加载上下文。

当我在 Eclipse 中运行测试时,它可以工作。但不是当测试由 maven 运行时。

在 Eclipse 中,当前路径设置为 ModuleA,但在 maven 中,它设置在父文件夹中。

所以我应该写:

文件:./ModuleB/src/test/resources/application-context-test.xml

文件:../ModuleB/src/test/resources/application-context-test.xml

让它在 maven 中工作(但它会破坏 eclipse)

谢谢!

如何告诉 maven(或 surefire 插件)运行相对于模块路径而不是父级的单元测试?

【问题讨论】:

  • 为什么不使用classpath 而不是file
  • 我试过了:"classpath:/application-context-test.xml" 但似乎这个文件不在类路径中。也许如果我将它从 ModuleB/src/main/resources/ 移到它会在类路径中......
  • Aggh... 错过了它位于测试文件夹中。
  • 无论如何,让测试依赖于另一个模块测试不是一个好主意

标签: spring maven spring-test maven-surefire-plugin


【解决方案1】:

放在${project.basedir}/src/test/resources 中的文件被复制到${project.build.testOutputDirectory},默认为'target/test-classes'。作为generate-testResources 阶段的一部分,Maven 会自动执行此操作。

因此,您不想在 /src/test/resources 目录中查找文件,因为它不在类路径中。如果你在 ModuleB 中有一个测试来寻找文件,你会这样写:

@ContextConfiguration(locations = 
       { "classpath:/application-context-test.xml",
         "classpath:/mvc-dispatcher-servlet-test.xml"
       })

您遇到的困难是您想要的文件存在于另一个项目中。所以你要解决的问题是,我如何从另一个项目中获取资源到这个项目的类路径中?您可以采取以下两种方式之一来解决此问题:

一:在ModuleB中执行maven jar plugin's test-jar goal。这将获取 ModuleB 的 target/test-classes 目录中的所有类和资源,并将其打包到一个 jar 中。然后,您可以将测试 jar 作为依赖项添加到模块 A 的 POM 中,如下所示:

 <dependency>
     <groupId>com.mycompany.theGroupId</groupId>
     <artifactId>moduleB</artifactId>
     <version>yourVersion</version>
     <type>test-jar</type>
    <scope>test</scope>
 </dependency>

二:您可以将模块 B 的测试资源移动到一个单独的项目中(在目录 newProject/src/main/resources 中),让 Maven 像往常一样构建 jar,并让 ModuleA 和 ModuleB 都添加 newProject 作为范围 test 的依赖项。

【讨论】:

    【解决方案2】:

    添加这个而不是正斜杠 - "classpath:application-context-test.xml"

    Maven 会自动从资源中拉取它

    【讨论】:

    • 我没有在 maven 中尝试,但在 eclipse 中找不到它,我需要一个适用于两者的解决方案
    【解决方案3】:

    无论是什么解决方案,这都不是最佳实践。

    请执行以下操作:

    首先,确定模块 A 是否依赖模块 B? (我猜是的)

    如果是,请使用classpath:/application-context-test.xml,然后,使用父目录下的mvn install 将模块B 打包并安装。然后,您可以运行测试用例,它应该可以工作。

    如果没有,请将 application-context-test.xml 复制到模块 A 中,但我认为这很奇怪。通常,如果你想使用其他模块的文件,那是因为这个模块依赖它。

    【讨论】:

    • 是的,复制文件是我将要结束的工作。但最后希望我做到了:将surefire插件从2.16更新到2.17并删除 0 以获得默认值,现在它似乎可以工作了:|
    猜你喜欢
    • 1970-01-01
    • 2011-02-21
    • 2011-08-04
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多