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

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

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

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

我不能使用依赖关系,因为我不希望该依赖关系以传递方式继承(例如,下游依赖关系可以使用log4j等)。我尝试使用 ,但这会导致相同的警告。runtimeruntimeoptional=true

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


答案 1

这里没有一个范围可以完全按照您的要求; 是可用的最佳选项。test

之前已请求过作用域(Re:是否需要测试运行时作用域?),建议的解决方法正是您已经发现的配置。test-runtimeignoreNonCompile

dependency:analyze已经有一些限制(“有些情况没有被检测到(常量,仅源代码保留的注释,javadoc中的链接)”)。您可能必须接受它警告的任何 -scope 依赖项都是误报。test

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


答案 2

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


推荐