例如,我有2個Maven項目。一個是「項目 - 父母」。另一個是「項目孩子」。顯然,「項目 - 子女」是「項目 - 父母」的子項目。如何在Maven中從父項目中排除依賴項?
「project-parent」具有log4j的依賴性。但我想把它從「項目孩子」中排除出去。有沒有辦法?
你可能會說我應該將log4j從「project-parent」移動到「project-child」。這是完全正確的。 但假設是我不能修改「project-parent」的POM。
在此先感謝。
例如,我有2個Maven項目。一個是「項目 - 父母」。另一個是「項目孩子」。顯然,「項目 - 子女」是「項目 - 父母」的子項目。如何在Maven中從父項目中排除依賴項?
「project-parent」具有log4j的依賴性。但我想把它從「項目孩子」中排除出去。有沒有辦法?
你可能會說我應該將log4j從「project-parent」移動到「project-child」。這是完全正確的。 但假設是我不能修改「project-parent」的POM。
在此先感謝。
我覺得在Maven2中沒有辦法實現這個,因爲這是POM繼承的 。然而,我可以想到一個技巧:
假設您有權將工件上傳到您的內部工件存儲庫。您可以創建一個空的JAR,將其部署爲log4j:log4j,顯然具有異常版本(例如log4j:log4j:9999)。在您的項目子項中添加這樣的依賴項。然後它將覆蓋父對象的依賴關係取決於事實上爲空的JAR。
如果我明白了這個問題,你需要的是類似下面的東西。它引入一個依賴項,並排除該依賴項添加到其依賴項列表中。如果你想注入一個更新版本的包而不是其他包中引用的包,通常會使用它。
<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>
?
我的意思是父項目的繼承依賴項,而不是直接依賴項的傳遞依賴項。無論如何,非常感謝。 :) – Smartmarkey
是的,我不知道你是否可以做到這一點。你看到這個問題:http://stackoverflow.com/questions/2681759/is-there-anyway-to-exclude-artifacts-inherited-from-a-parent-pom – Gray
感謝您的鏈接。我讀過它。看起來Maven正式沒有辦法。我必須做一種解決方法。 – Smartmarkey
我不知道實際排除依賴關係的方法,但可以將它從目標分佈中排除,但這有些破綻。您需要將依賴項的範圍更改爲您可以在最終分配中排除的內容。
所以說,我的父母對的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>
謝謝。我已經從發行包中排除了不需要的依賴關係,但是我在Maven Assembly插件的assembly.xml中使用了
一個哈克的方式要完成這個工作就是在project-child中指定依賴項,但是在'test'範圍內(或任何最輕量級的可用範圍)。這將「隱藏」project-parent中指定的作用域,以便它僅在測試代碼時可用,在編譯和運行時都不可用於非測試代碼。
我偶然發現了這個bug功能。就我而言,我的項目子項目具有「編譯」範圍依賴關係的項目兄弟,而項目父項具有與「提供」範圍指定的相同的依賴關係(實際上是從祖父母繼承的)。 project-child是一個可執行文件,但是依賴於項目兄弟,因此在運行時從project-sibling引發了NoClassDefFoundError,因爲正在使用project-child的運行時類路徑,它不包括「提供的」依賴項。我通過將'compile'依賴從project-sibling移動到project-parent來解決這個問題,這樣'compile'將「隱藏」'provided'。
我遇到了和你一樣的問題。 在我的項目中,讓我們稱父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>
然後再次運行該命令以檢查依賴關係列表。好!明確〜
希望可以幫助您:>
一個側面說明:有人在做類似的事情,並提供了這樣那樣的「空」神器公共倉庫(http://version99.qos.ch/) 。他們使用'99-empty'作爲版本。人們認爲我提出的方法可能會將此用作慣例。 –