【问题标题】:Declare Maven dependency as test runtime only仅将 Maven 依赖项声明为测试运行时
【发布时间】:2014-12-31 22:11:54
【问题描述】:

将 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:analyzeslf4j-simple 报告为未使用,大概是因为编译不需要它:

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

我不能使用 runtime 依赖项,因为我不希望该依赖项可传递地继承(例如,下游依赖项可以使用 log4j 等)。我尝试了runtimeoptional=true,但结果相同。

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

【问题讨论】:

  • 主源在运行时需要什么?它不会仍然抱怨runtime 范围依赖吗?
  • 一般来说,传递依赖不需要声明。对于可选的依赖项(通常像可以使用不同框架的日志记录),您的过程是正确的。也许您也可以添加范围测试。
  • 它也确实抱怨(错误地,恕我直言)runtime 依赖项,所以似乎仅范围不是这里的答案。我真正想要的是一个范围,它是testruntime(就类路径而言)的交集,并且依赖插件对“未使用”runtime 依赖项的行为不那么愚蠢。
  • 我现在遇到的另一个用例是当您希望在编译测试时避免在测试类路径中包含 JUnit 4,但您仍然需要它来运行测试,例如当使用 Testcontainers 的 RabbitMQContainerElasticsearchContainer 时(由于某种原因,它们都实现了 TestRule)(如果你有兴趣,Testcontainers’ issue

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


【解决方案1】:

这里没有完全符合您要求的范围; 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-scope 依赖项都是误报。

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

【讨论】:

  • 对于 javadoc 问题,我采用了链接到完全限定的类名并将基本链接 url 添加到 javadoc 插件而不声明对项目的依赖关系。这样可以避免导入语句和其他潜在的负面问题,即列出实际上不需要的依赖项。
  • 问题介绍here.
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    从 maven-dependency-plugin 2.10(revision 1649454,2015 年 1 月)开始,您还可以将 ignoredDependenciesignoredUnusedDeclaredDependenciesignoredUsedUndeclaredDependencies 的列表添加到配置中。

    【讨论】:

    • 你能再解释一下吗?
    • 这些选项是在我提出问题后添加的,我认为它们与已接受的答案一起是处理此问题的最佳方法。
    【解决方案4】:

    作为一种解决方法,我建议有一个单独的 maven 项目,其中包含依赖于主项目的测试用例

    【讨论】:

      猜你喜欢
      • 2014-10-20
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      • 2014-01-18
      • 1970-01-01
      • 2023-02-13
      • 1970-01-01
      相关资源
      最近更新 更多