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

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

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

  org.slf4j slf4j-api   org.slf4j slf4j-simple test  

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

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

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

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

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

之前已经请求了测试运行时范围 ( Re:需要测试运行时范围? ),建议的解决方法正是您已经发现的ignoreNonCompile配置。

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

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

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

自maven-dependency-plugin 2.10( 修订版1649454 ,2015年1月) 以来 ,您还可以向配置添加一个被忽略的 依赖项列表, ignoredUnusedDeclaredDependencies和ignoredUsedUndeclaredDependencies 。