排除 Maven 插件中的依賴項
一、概述
在 Maven 中排除依賴是一個常見的操作。但是,在處理 Maven 插件時會變得更加困難。
2.什麼是依賴排除
Maven 管理依賴關係的傳遞性。這意味著Maven 可以通過我們添加的依賴自動添加所有需要的依賴。在某些情況下,這種傳遞性會迅速增加依賴項的數量,因為它增加了級聯依賴項。
例如,如果我們有 A → B → C → D 這樣的依賴關係,那麼 A 將依賴於 B、C 和 D。如果 A 只使用 B 的一小部分,不需要 C,那麼可以告訴 Maven 忽略 A 中的 B → C 依賴。
因此,A 將只依賴於 B 而不再依賴於 C 和 D。這稱為依賴排除。
3.排除傳遞依賴
我們可以使用<exclusions>
元素排除子依賴項,該元素包含一組對特定依賴項的排除項。簡而言之,我們只需要在 POM 文件的<dependency>
元素中添加一個<exclusions>
元素。
例如,讓我們考慮commons-text
依賴的例子,並假設我們的項目只使用來自commons-text,
不需要commons-lang
子依賴。
我們將能夠從我們項目的commons-text
傳遞鏈中排除commons-lang
依賴,只需在我們項目的POM
文件中的commons-text
依賴聲明中添加一個<exclusions>
部分,如下所示:
<project>
...
<dependencies>
...
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.1</version>
<exclusions>
<exclusion>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
...
</project>
因此,如果我們用上面的POM
重建一個項目,我們會看到commons-tex
庫被集成到我們的項目中,而不是commons-lang
庫。
4. 從插件中排除傳遞依賴
到目前為止,Maven 不支持從插件中排除直接依賴項,並且已經公開了包含此新功能的問題。在本章中,我們將討論一種解決方法,通過用虛擬對象覆蓋它來排除 Maven 插件的直接依賴。
假設我們必須排除 Maven Surefire 插件的 JUnit 4.7 依賴項。
首先,我們必須創建一個虛擬模塊,它必須是我們項目根POM
的一部分。該模塊將僅包含一個如下所示的POM
文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>dummy</version>
</project>
接下來,我們需要在我們希望停用依賴項的地方調整我們的子POM
。為此,我們必須將虛擬版本的依賴項添加到 Maven Surefire 插件聲明中:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${surefire-version}</version>
<configuration>
<runOrder>alphabetical</runOrder>
<threadCount>1</threadCount>
<properties>
<property>
<name>junit</name>
<value>false</value>
</property>
</properties>
</configuration>
<dependencies>
<dependency>
<!-- Deactivate JUnit 4.7 engine by overriding it with an empty dummy -->
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>dummy</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
最後,一旦我們構建了我們的項目,我們將看到 Maven Surefire 插件的 JUnit 4.7 依賴項沒有包含在項目中並且排除效果很好。
5.結論
在本快速教程中,我們解釋了依賴排除以及如何使用<exclusions>
元素排除傳遞依賴。此外,我們公開了一種解決方法,通過用虛擬對象覆蓋插件來排除插件中的直接依賴項。
與往常一樣,代碼在 GitHub 上可用。