如何在运行时类路径上拥有Maven依赖关系,但不是测试类路径?
我有一种情况,我希望依赖运行时类路径,但不是测试类路径。有问题的依赖是Logback,一个SLF4J实现。在运行时,我希望我的代码(可选)依赖于logback,以便它具有可用的日志记录基础结构。然而,在测试时间,我想使用slf4j-nop
实现黑洞日志输出。将logback
作为运行时依赖项,将slf4j-nop
作为测试依赖项,在运行我的测试时,SLF4J会收到多个实现警告。我没有看到从测试类路径中排除logback
的方法。如何在运行时类路径上拥有Maven依赖关系,但不是测试类路径?
如果可以避免的话,我不想将测试拆分为单独的包。
想法?
我终于找到了一个真正的解决方案。从Maven Surefire插件的2.6版开始,现在有一个classpathDependencyExcludes配置元素,它允许从类路径中排除特定的依赖关系。因此,这工作:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.8</version>
<configuration>
<classpathDependencyExcludes>
<classpathDependencyExclude>ch.qos.logback:logback-classic</classpathDependencyExclude>
</classpathDependencyExcludes>
</configuration>
</plugin>
它会在slf4j-nop测试作用域依赖关系的logback上添加依赖项排除吗?喜欢的东西
<dependency>
<groupId>foo</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.0</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>foo</groupId>
<artifactId>logback</artifactId>
</exclusion>
</exclusions>
</dependency>
如果禁用日志输出是你想要的,一个的logback配置文件添加到src/test/resources
其丢弃所有输出。
如果您需要对同一反应器内的多个模块执行此操作,请考虑使用maven remote resources plugin。
该插件用于从远程存储库中检索JAR资源,处理这些资源并将它们合并到您使用Maven构建的JAR中。一个非常常见的用例是需要在组织中以一致的方式打包某些资源。
我可能不得不这样做;不幸的是,它还需要进一步的项目重组(这是一个多模块项目,所以我必须确保配置文件在所有这些项目中都可用)。 – 2011-01-28 16:25:44
@Michael:请参阅我的更新 – 2011-01-29 17:32:40
就我所知,您不必从测试类路径中排除它。 Maven应该在类路径中保留依赖关系的顺序。如果将依赖关系放在依赖关系中的运行时依赖关系之前,那么它应该首先放在类路径中,而当两个依赖关系包含相同的类时,ClassLoader应该先找到测试依赖关系中的类。因此,slf4j会找到slf4j-nop的静态绑定,而不是logback绑定。
是的,然而,SLF4J然后打印关于多个类路径的警告。我试图避免这个警告。 – 2011-01-28 16:19:43
我试过这个,但`exclude`只排除有问题的软件包的传递依赖关系;不幸的是,它似乎不能用于排除从其他类路径传播的任意依赖关系。 – 2011-01-28 16:19:00