如何在运行时类路径上具有Maven依赖性而不是测试类路径?

时间:2011-01-27 21:47:56

标签: java maven-2 maven dependencies

我有一种情况,我希望依赖于运行时类路径但测试类路径。有问题的依赖是Logback,一个SLF4J实现。在运行时,我希望我的代码(可选)依赖于logback,以便它具有可用的日志记录基础结构。但是,在测试时,我想使用slf4j-nop实现来破坏日志输出。将logback作为运行时依赖项并将slf4j-nop作为测试依赖项,在运行测试时,我会从SLF4J获得多个实现警告。我没有看到从测试类路径中排除logback的方法。

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

想法?

4 个答案:

答案 0 :(得分: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>

答案 1 :(得分:2)

如果您想要禁用日志输出,请将注销配置文件添加到src/test/resources,这会丢弃所有输出。

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

  

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

答案 2 :(得分:1)

据我所知,您不必将其从测试类路径中排除。 Maven应该保持类路径中的依赖顺序。如果将测试依赖项放在依赖项中的运行时依赖项之前,它也应该首先在类路径中,并且当2个依赖项包含相同的类时,ClassLoader应首先在测试依赖项中找到类。所以slf4j会找到slf4j-nop的静态绑定而不是logback绑定。

答案 3 :(得分: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>