1. 程式人生 > >Maven實戰-maven中的可選依賴(optional)

Maven實戰-maven中的可選依賴(optional)

在一些專案中,我們知道用exclusion排除一些依賴包,這屬於依賴排除(Dependency Exclusions),還有一種就是今天所說的可選依賴(Optional Dependencies)。主要還是講怎麼用。

準備工作

準備兩個工程,簡單點,就是A和B

只看POM檔案,這是A的pom檔案。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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>A</groupId> <artifactId>A</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency
>
<groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.9.9</version> </dependency> </dependencies> </project>

這是B的pom檔案:

<?xml version="1.0" encoding="UTF-8"?>
<project
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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>B</groupId> <artifactId>B</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>A</groupId> <artifactId>A</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </project>

在這種情況下,joda-time包在B工程會被正常引用。

加入optional

在A工程對joda-time新增optional選項,這時在B工程中,joda-time依賴包會消失.

    <dependencies>
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.9.9</version>
            <optional>true</optional>
        </dependency>
    </dependencies>

如果想引這個包,需要在A專案中設optional為false或者去除optional,或者在B專案中顯式呼叫。

parent 繼承的情況

如果A的pom像下面這樣配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         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>A</groupId>
    <artifactId>A</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>joda-time</groupId>
                <artifactId>joda-time</artifactId>
                <version>2.9.9</version>
                <optional>true</optional>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

B再去引用的話,還是可以正常引用joda-time包,optional選項在統一控制版本的情況下會失效。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         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>B</groupId>
    <artifactId>B</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>A</groupId>
        <artifactId>A</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
        </dependency>
    </dependencies>
</project>