2011-01-27 101 views
18

我有一种情况,我希望依赖运行时类路径,但不是测试类路径。有问题的依赖是Logback,一个SLF4J实现。在运行时,我希望我的代码(可选)依赖于logback,以便它具有可用的日志记录基础结构。然而,在测试时间,我想使用slf4j-nop实现黑洞日志输出。将logback作为运行时依赖项,将slf4j-nop作为测试依赖项,在运行我的测试时,SLF4J会收到多个实现警告。我没有看到从测试类路径中排除logback的方法。如何在运行时类路径上拥有Maven依赖关系,但不是测试类路径?

如果可以避免的话,我不想将测试拆分为单独的包。

想法?

回答

18

我终于找到了一个真正的解决方案。从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> 
0

它会在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> 
+0

我试过这个,但`exclude`只排除有问题的软件包的传递依赖关系;不幸的是,它似乎不能用于排除从其他类路径传播的任意依赖关系。 – 2011-01-28 16:19:00

2

如果禁用日志输出是你想要的,一个的logback配置文件添加到src/test/resources其丢弃所有输出。

如果您需要对同一反应器内的多个模块执行此操作,请考虑使用maven remote resources plugin

该插件用于从远程存储库中检索JAR资源,处理这些资源并将它们合并到您使用Maven构建的JAR中。一个非常常见的用例是需要在组织中以一致的方式打包某些资源。

+0

我可能不得不这样做;不幸的是,它还需要进一步的项目重组(这是一个多模块项目,所以我必须确保配置文件在所有这些项目中都可用)。 – 2011-01-28 16:25:44

+0

@Michael:请参阅我的更新 – 2011-01-29 17:32:40

1

就我所知,您不必从测试类路径中排除它。 Maven应该在类路径中保留依赖关系的顺序。如果将依赖关系放在依赖关系中的运行时依赖关系之前,那么它应该首先放在类路径中,而当两个依赖关系包含相同的类时,ClassLoader应该先找到测试依赖关系中的类。因此,slf4j会找到slf4j-nop的静态绑定,而不是logback绑定。

+0

是的,然而,SLF4J然后打印关于多个类路径的警告。我试图避免这个警告。 – 2011-01-28 16:19:43

相关问题