簡體   English   中英

如何在運行時類路徑上具有Maven依賴性而不是測試類路徑?

[英]How can I have a Maven dependency on the runtime classpath but not the test classpath?

我有一個案例,我希望依賴於運行時類路徑而不是測試類路徑。 有問題的依賴是Logback,一個SLF4J實現。 在運行時,我希望我的代碼(可選)依賴於logback,以便它具有可用的日志記錄基礎結構。 但是,在測試時,我想使用slf4j-nop實現來slf4j-nop日志輸出。 使用logback作為運行時依賴項並將slf4j-nop作為測試依賴項,我在運行測試時從SLF4J獲得多個實現警告。 我沒有看到從測試類路徑中排除logback的方法。

如果可以避免,我不想將我的測試分成單獨的包。

想法?

我終於找到了一個真正的解決方案。 從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>

如果禁用日志輸出是你想要的,那么將一個logback配置文件添加到src/test/resources ,它會丟棄所有輸出。

如果需要在同一個反應堆構建中為多個模塊執行此操作,請考慮使用maven遠程資源插件

此插件用於從遠程存儲庫檢索JAR資源,處理這些資源,並將它們合並到使用Maven構建的JAR中。 一個非常常見的用例是需要在整個組織中以一致的方式打包某些資源。

據我所知,您不必將其從測試類路徑中排除。 Maven應該保持類路徑中的依賴順序。 如果將測試依賴項放在依賴項中的運行時依賴項之前,它也應該首先在類路徑中,並且當2個依賴項包含相同的類時,ClassLoader應首先在測試依賴項中找到類。 那么slf4j會找到slf4j-nop的靜態綁定而不是logback綁定。

是否可以在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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM