可選依賴和依賴排除

可選依賴(Optional Dependencies)java

        聲明可選依賴不僅是爲了節省空間或內存等,也爲了控制須要的實際依賴列表,由於這些依賴jar包最終會被打包成WAR\EAR等,包含錯誤的jars可能會引發類路徑的一些問題。
spa

        在依賴聲明中設置<optional>的值爲true,就能夠將它設爲可選依賴。code

<dependency>
    <groupId>sample.ProjectA</groupId>
    <artifactId>Project-A</artifactId>
    <version>1.0</version>
    <scope>compile</scope>
    <optional>true</optional>
</dependency>

        若是A依賴B,當在A的POM中將B聲明爲可選依賴時,這只是正常的關係:B將被加到A的類路徑中。
xml

        如今,又有X依賴於A,這時可選依賴就產生效果了,你會發如今X的類路徑中並無包含B,若是想要包含B,須要直接聲明B依賴。
內存


依賴排除(Dependency Exclusions)ci

        Maven2引入了依賴傳遞後,使得有可能將不想要的依賴被包含進本身的項目中,好比當你依賴的項目沒有正確的聲明它們的依賴時。爲了解決這個問題,Maven2引入了依賴排除的概念。依賴排除是針對指定groupId和artifactId的依賴設置的。當你構建項目時,該組件將不會被加入類路徑中。
開發

        在<dependency>元素下添加<exclusions>子元素表示排除的依賴。
部署

<dependency>
    <groupId>sample.ProjectA</groupId>
    <artifactId>Project-A</artifactId>
    <version>1.0</version>
    <scope>compile</scope>
    <exclusions>
        <exclusion>
            <groupId>sample.ProjectB</groupId>
            <artifactId>Project-B</artifactId>
        </exclusion>
    </exclusions>
</dependency>

        

        假設A依賴B和C,B依賴D,D依賴E和F,默認A的類路徑中應該包含:B,C,D,E,F
io

A
   ---> B
      ---> D  <!-- 須要排除D -->
         --->E 
         --->F
   ---> C

        若是咱們不想將D和它的依賴被添加到A的類路徑中(由於咱們知道倉庫中可能沒有E,並且你不想使用B中依賴於D的某個功能),這時候有兩種作法,一是使用上面的可選依賴——讓B的開發者將D依賴設置爲可選。另外一種方式則能夠在A這裏進行控制:
class

<dependency>
    <groupId>sample.ProjectB</groupId>
    <artifactId>Project-B</artifactId>
    <version>1.0-SNAPSHOT</version>
    <scope>compile</scope>
    <exclusions>
        <exclusion>
            <groupId>sample.ProjectD</groupId><!-- 將D從B中排除 -->
            <artifactId>Project-D</artifactId>
        </exclusion>
    </exclusions>
</dependency>

        

X ---> A

        若是此時將A部署到倉庫,X引用A做爲依賴,D會從X的類路徑中被排除嗎?固然,由於A中已經聲明不須要D,因此A不會將D傳遞給X。        

        

X ---> Y
     ---> B
        ---> D

        考慮這樣的狀況:如今X依賴Y,Y又依賴B,而且它須要D提供的一項功能。那麼它不會從依賴列表中排除D。在這種狀況下,不全局性的排除D就顯得很重要,由於D是Y的一個合法依賴。


A
   ---> B
      ---> D
         --->E  <!-- 排除它 -->
         --->F

        如上所示的一種狀況,若是要排除的是E而不是D呢?

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>sample.ProjectA</groupId>
    <artifactId>Project-A</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packing>jar</packing>
    
    ...
    
    <dependencies>
        <dependency>
            <groupId>sample.ProjectB</groupId>
            <artifactId>Project-B</artifactId>
            <version>1.0-SNAPSHOT</version>
            <exclusions>
                <exclusion>
                    <groupId>sample.ProjectE</groupId> <!-- 從B中排除E -->
                    <artifactId>Project-E</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
</project>


        注:依賴排除是以單個依賴爲操做基礎的,不是POM的全局性設置。

相關文章
相關標籤/搜索