簡體   English   中英

如何從 Maven 中的父項目中排除依賴項?

[英]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>嗎?

  1. 找出你不需要的依賴的實際基礎包

mvn 依賴:樹

分析此輸出並找出您不需要的依賴項的實際基本包

  1. 現在在子 pom 中再次添加基本包的依賴項並使用排除標記
<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>
  1. 再檢查一遍

mvn 依賴:樹

應該刪除不需要的依賴項。

暫無
暫無

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

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