【发布时间】: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:analyze 将 slf4j-simple 报告为未使用,大概是因为编译不需要它:
[WARNING] Unused declared dependencies found:
[WARNING] org.slf4j:slf4j-simple:jar:1.7.7:test
我不能使用 runtime 依赖项,因为我不希望该依赖项可传递地继承(例如,下游依赖项可以使用 log4j 等)。我尝试了runtime 和optional=true,但结果相同。
(请注意,我也可以为依赖插件设置ignoreNonCompile,但这似乎是一个非常生硬的工具,会隐藏其他潜在问题。)
【问题讨论】:
-
主源在运行时需要什么?它不会仍然抱怨
runtime范围依赖吗? -
一般来说,传递依赖不需要声明。对于可选的依赖项(通常像可以使用不同框架的日志记录),您的过程是正确的。也许您也可以添加范围测试。
-
它也确实抱怨(错误地,恕我直言)
runtime依赖项,所以似乎仅范围不是这里的答案。我真正想要的是一个范围,它是test和runtime(就类路径而言)的交集,并且依赖插件对“未使用”runtime依赖项的行为不那么愚蠢。 -
我现在遇到的另一个用例是当您希望在编译测试时避免在测试类路径中包含 JUnit 4,但您仍然需要它来运行测试,例如当使用 Testcontainers 的
RabbitMQContainer或ElasticsearchContainer时(由于某种原因,它们都实现了TestRule)(如果你有兴趣,Testcontainers’ issue)
标签: java maven maven-3 maven-dependency-plugin