2011-10-26 10548 views
23

例如,我有2個Maven項目。一個是「項目 - 父母」。另一個是「項目孩子」。顯然,「項目 - 子女」是「項目 - 父母」的子項目。如何在Maven中從父項目中排除依賴項?

「project-parent」具有log4j的依賴性。但我想把它從「項目孩子」中排除出去。有沒有辦法?

你可能會說我應該將log4j從「project-parent」移動到「project-child」。這是完全正確的。 但假設是我不能修改「project-parent」的POM。

在此先感謝。

回答

9

我覺得在Maven2中沒有辦法實現這個,因爲這是POM繼承的 。然而,我可以想到一個技巧:

假設您有權將工件上傳到您的內部工件存儲庫。您可以創建一個空的JAR,將其部署爲log4j:log4j,顯然具有異常版本(例如log4j:log4j:9999)。在您的項目子項中添加這樣的依賴項。然後它將覆蓋父對象的依賴關係取決於事實上爲空的JAR。

+1

一個側面說明:有人在做類似的事情,並提供了這樣那樣的「空」神器公共倉庫(http://version99.qos.ch/) 。他們使用'99-empty'作爲版本。人們認爲我提出的方法可能會將此用作慣例。 –

1

如果我明白了這個問題,你需要的是類似下面的東西。它引入一個依賴項,並排除該依賴項添加到其依賴項列表中。如果你想注入一個更新版本的包而不是其他包中引用的包,通常會使用它。

<dependency> 
    <groupId>log4j</groupId> 
    <artifactId>log4j</artifactId> 
    <version>1.2.15</version> 
    <exclusions> 
     <exclusion> 
      <groupId>com.sun.jmx</groupId> 
      <artifactId>jmxri</artifactId> 
     </exclusion> 
     ... 
    </exclusions> 
    ... 

如果您是不是在談論一個<parent>關係,然後我不知道是有辦法做到這一點。你能否從<parent>切換到<dependency>

+0

我的意思是父項目的繼承依賴項,而不是直接依賴項的傳遞依賴項。無論如何,非常感謝。 :) – Smartmarkey

+0

是的,我不知道你是否可以做到這一點。你看到這個問題:http://stackoverflow.com/questions/2681759/is-there-anyway-to-exclude-artifacts-inherited-from-a-parent-pom – Gray

+0

感謝您的鏈接。我讀過它。看起來Maven正式沒有辦法。我必須做一種解決方法。 – Smartmarkey

9

我不知道實際排除依賴關係的方法,但可以將它從目標分佈中排除,但這有些破綻。您需要將依賴項的範圍更改爲您可以在最終分配中排除的內容。

所以說,我的父母對的JUnit 4.8的依賴關係,在我的POM你說:

<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>4.8</version> 
    <scope>provided</scope> 
</dependency> 

所以,我們正在改變的範圍提供。有關這是如何工作的解釋,請參閱我對NoClassDefFoundError: org/junit/AfterClass during annotation processing的回答。不幸的是,這並不影響身材,但是當你複製的依賴關係爲最終分配,你可以使用excludeScope配置元素的依賴性不復制到最後分配:

<plugin> 
<artifactId>maven-dependency-plugin</artifactId> 

<executions> 
    <execution> 
     <id>copy-libs</id> 
     <phase>package</phase> 
     <goals> 
      <goal>copy-dependencies</goal> 
     </goals> 
     <configuration> 
      <outputDirectory>${project.build.directory}/lib</outputDirectory> 
      <excludeScope>provided</excludeScope> 
     </configuration> 
    </execution> 
+0

謝謝。我已經從發行包中排除了不需要的依賴關係,但是我在Maven Assembly插件的assembly.xml中使用了。我正在尋求一種從dev環境中排除不需要的依賴關係的方法,如Eclipse。 :) – Smartmarkey

0

一個哈克的方式要完成這個工作就是在project-child中指定依賴項,但是在'test'範圍內(或任何最輕量級的可用範圍)。這將「隱藏」project-parent中指定的作用域,以便它僅在測試代碼時可用,在編譯和運行時都不可用於非測試代碼。

我偶然發現了這個bug功能。就我而言,我的項目子項目具有「編譯」範圍依賴關係的項目兄弟,而項目父項具有與「提供」範圍指定的相同的依賴關係(實際上是從祖父母繼承的)。 project-child是一個可執行文件,但是依賴於項目兄弟,因此在運行時從project-sibling引發了NoClassDefFoundError,因爲正在使用project-child的運行時類路徑,它不包括「提供的」依賴項。我通過將'compile'依賴從project-sibling移動到project-parent來解決這個問題,這樣'compile'將「隱藏」'provided'。

1

我遇到了和你一樣的問題。 在我的項目中,讓我們稱父pom爲parent.pom。 parent定義了log4j,slf4j是這樣的:

 <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-api</artifactId> 
      <version>${slf4j-api.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>log4j</groupId> 
      <artifactId>log4j</artifactId> 
      <version>${log4j.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>jcl-over-slf4j</artifactId> 
      <version>${slf4j-api.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-log4j12</artifactId> 
      <version>${slf4j-log4j12.version}</version> 
     </dependency> 

子項目在child.pom中調用一些依賴項。但我不希望log4j-1.2.x依賴,並想增加slf4j的版本。

所以。我想補充母公司的依賴

<dependency> 
     <groupId>parent</groupId> 
     <artifactId>myartifactId</artifactId> 
     <version>${my parent version}</version> 
</dependency> 

,並使用排除刪除log4j的

<dependency> 
     <groupId>parent</groupId> 
     <artifactId>myartifactId</artifactId> 
     <version>${my parent version}</version> 
     <exclusions> 
      <exclusion> 
       <groupId>log4j</groupId> 
       <artifactId>log4j</artifactId> 
      </exclusion> 
     </exclusions> 
</dependency> 

,並明確添加SLF4J和log4j2的兒童pom的依賴

<dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>1.7.6</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-slf4j-impl</artifactId> 
     <version>2.8.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-api</artifactId> 
     <version>2.8.2</version> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-core</artifactId> 
     <version>2.8.2</version> 
    </dependency> 

    <dependency> 
     <groupId>com.lmax</groupId> 
     <artifactId>disruptor</artifactId> 
     <version>3.3.4</version> 
    </dependency> 

然後使用mvn依賴:樹到顯示依賴關係列表中,仍然可以看到log4j的

[INFO] +- org.apache.kafka:kafka_2.10:jar:0.8.2.0:compile 
[INFO] | +- com.yammer.metrics:metrics-core:jar:2.2.0:compile 
[INFO] | +- org.scala-lang:scala-library:jar:2.10.4:compile 
[INFO] | +- org.apache.zookeeper:zookeeper:jar:3.4.6:compile 
[INFO] | | +- org.slf4j:slf4j-log4j12:jar:1.7.5:compile 
[INFO] | | +- log4j:log4j:jar:1.2.17:compile 

好了,讓我們添加的排除上的依賴......除去這個傢伙。

<dependency> 
     <groupId>org.apache.kafka</groupId> 
     <artifactId>kafka-clients</artifactId> 
     <version>0.10.1.1</version> 
     <exclusions> 
      <exclusion> 
       <groupId>log4j</groupId> 
       <artifactId>log4j</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 

然後再次運行該命令以檢查依賴關係列表。好!明確〜

希望可以幫助您:>