将 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
,但这似乎是一个非常生硬的工具,会隐藏其他潜在的问题。)
这里没有任何范围可以完全满足您的要求;
test
是最好的选择。
之前已请求过
test-runtime
范围(回复:需要测试运行时范围?),建议的解决方法正是您已经发现的ignoreNonCompile
配置。
dependency:analyze
已经有一些限制(“未检测到某些情况(常量、仅保留源的注释、javadoc中的链接)”)。您可能必须接受它警告的任何 test
范围依赖项都是误报。
(您可以将测试的定义拆分为一个单独的模块,该模块没有
slf4j
实现依赖项,然后在另一个模块中运行它们。我认为这不值得。)
maven 中没有测试运行时的概念。唯一真正的缺点是依赖关系分析将这些运行时测试依赖关系识别为未使用。然而,由于它们只是测试依赖项,因此这是非常良性的,不会给其他项目带来问题,从而传递依赖于该项目。
自 maven-dependency-plugin 2.10(修订版 1649454,2015 年 1 月)开始,您还可以向配置添加 ignoredDependency、ignoredUnusedDeclaredDependency 和 ignoredUsedUndeclaredDependency 的列表。
作为一种解决方法,我建议建立单独的 Maven 项目,其中包含依赖于主项目的测试用例
见下文。 来源:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>