仅将Maven依赖声明为测试运行时

时间:2014-12-31 22:11:55

标签: java maven maven-3 maven-dependency-plugin

将Maven依赖项声明为仅用于测试运行时(但不是测试编译)类路径的最佳方法是什么?

具体来说,我希望slf4j-api(日志记录外观)作为典型的编译范围依赖项,但我希望slf4j-simple(仅适用于单元测试的准系统实现)仅在测试运行时类路径上(测试编译不需要它)。我一直这样做:

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-simple</artifactId>
  <scope>test</scope>
</dependency>

然而,这方面的缺点是dependency:analyze报告slf4j-simple未使用,大概是因为编译不需要它:

[WARNING] Unused declared dependencies found:
[WARNING]    org.slf4j:slf4j-simple:jar:1.7.7:test

我不能使用runtime依赖项,因为我不希望传递依赖的传递依赖(例如,所以下游依赖项可以使用log4j等)。我使用runtime尝试optional=true,但这会产生相同的警告。

(请注意,我也可以为依赖插件设置ignoreNonCompile,但这似乎是一个非常生硬的工具,可以隐藏其他潜在的问题。)

4 个答案:

答案 0 :(得分:10)

没有范围可以完全符合您的要求; test是最好的选择。

之前已请求test-runtime范围(Re: Need for a test-runtime scope?),建议的解决方法正是您已发现的ignoreNonCompile配置。

dependency:analyze已经有一些限制("some cases are not detected (constants, annotations with source-only retention, links in javadoc)")。您可能必须接受它所警告的任何test范围依赖关系都是误报。

(你可以将测试的定义拆分为一个单独的模块,该模块没有slf4j实现依赖关系,然后在另一个模块中运行它们。我不认为这是值得的。)

答案 1 :(得分:4)

maven中没有测试运行时的概念。唯一真正的缺点是依赖性分析将这些运行时测试依赖性标识为未使用。但是,由于它们只是测试依赖项,因此非常温和,并且不会导致其他依赖于此项目的项目出现问题。

答案 2 :(得分:3)

自maven-dependency-plugin 2.10(revision 1649454,2015年1月)以来,您还可以在配置中添加ignoredDependenciesignoredUnusedDeclaredDependenciesignoredUsedUndeclaredDependencies的列表。< / p>

答案 3 :(得分:0)

作为一种解决方法,我建议使用依赖于主项目的测试用例创建一个单独的maven项目