[英]How to exclude a maven dependency if in the parent project exists a newer version of it
[英]How to exclude a dependency from parent's project in Maven?
例如,我有 2 個 Maven 項目。 一種是“項目父母”。 另一個是“項目孩子”。 顯然,“project-child”是“project-parent”的子項目。
“project-parent”具有 log4j 的依賴關系。 但我想將它從“項目子”中排除。 有辦法嗎?
你可能會說我應該將 log4j 從“project-parent”移動到“project-child”。 這是完全正確的。 但假設是我不能修改“project-parent”的 POM。
提前致謝。
我認為在 Maven2 中沒有辦法實現這一點,因為這就是 POM 繼承的用途。 但是,我能想到一個技巧:
假設您有權將工件上傳到您的內部工件存儲庫。 您可以創建一個空 JAR,將其部署為 log4j:log4j,具有明顯異常的版本(例如 log4j:log4j:9999 )。 在您的項目子項中添加此類依賴項。 然后它將覆蓋父項的依賴項,使其依賴於一個實際上為空的 JAR。
我不知道實際上排除依賴項的方法,但是您可以將其從目標分發中排除,但這有點小技巧。 您需要將依賴項的范圍更改為可以在最終分發中排除的內容。
所以,假設我的父母依賴於 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>
我遇到了和你一樣的問題。 在我的項目中,讓調用父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>
並在子 pom 中顯式添加 slf4j 和 log4j2 的依賴項
<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 dependency:tree顯示依賴列表,仍然可以看到 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>
然后再次運行該命令以檢查依賴項列表。 好的! 清楚~
希望能幫到你:>
實現此目的的一種巧妙方法是在 project-child 中指定依賴項,但使用“測試”范圍(或任何可用的最輕量范圍)。 這將“隱藏”在 project-parent 中指定的范圍,以便它僅可用於測試代碼,並且在編譯和運行時對非測試代碼不可用。
我主要是錯誤地遇到了這個錯誤功能。 在我的例子中,我的 project-child 有一個具有“compile”范圍依賴的項目兄弟,而 project-parent 具有指定的相同依賴項(實際上是從祖父母繼承的)具有“provided”范圍。 project-child 是一個可執行文件,但是它依賴於 project-sibling,因此在運行時從 project-sibling 拋出了 NoClassDefFoundError,因為正在使用 project-child 的運行時類路徑,它不包括“提供的”依賴項。 我通過將“編譯”依賴項從項目兄弟移動到項目父項來解決此問題,以便“編譯”將“隱藏”“提供”。
我已經設法從父 pom.xml 中排除了一個臨時依賴項。 通過在<dependencymanagement>
中重新導入它,然后將排除項設置為我想要的依賴項。 像這樣例如:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring-boot.version}</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
如果我理解了這個問題,那么您需要的是以下內容。 它引入一個依賴項並將該依賴項從添加到其依賴項列表中排除。 如果您想注入更新版本的包而不是另一個包中引用的包,通常會使用此方法。
<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>
嗎?
mvn 依賴:樹
分析此輸出並找出您不需要的依賴項的實際基本包
<dependency>
<groupId>base group id</groupId>
<artifactId>base artifact id</artifactId>
<version>version</version>
<exclusions>
<exclusion>
<groupId>your unwanted dependency group id</groupId>
<artifactId>your unwanted dependency artifact id</artifactId>
</exclusion>
</exclusions>
</dependency>
mvn 依賴:樹
應該刪除不需要的依賴項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.