maven依賴、聚合、繼承、版本管理

1、項目結構java

pom.xml
src
    main
        java
           
        resources
    test
        java
           
        resources
target
    classes

                    

2、maven的scopemysql

    compile(默認)=>在編譯和單元測試會使用,而且會被一塊兒打包。web

    test=>僅僅在單元測試使用spring

        如junit,這些只須要test時候,在package時不使用,也沒有必要打包到war中,此時須要聲明scope爲test
sql

    runtimeapi

        如mysql.jar等jdbc的驅動,在test和compile時是不須要的,只有在運行時纔會須要,
服務器

    providedmaven

        如servlet-api.jar 在test和compile是須要的,可是打成war包,不須要,通常web服務器都自帶有該jar。可能會形成版本衝突
ide

    import單元測試

system


3、maven的依賴傳遞性 

A -> J1-1.0.jar

A -> E -> J2-1.0.jar

B -> J1-2.0.jar

B -> J2-2.0.jar

注意:C -> A,B ===> 此時 C依賴A,B的全部compile級別的jar,不會依賴test。  即在AB中聲明的junit若是scope是test,則不會被傳遞

注意:對J,C會依賴A的版本仍是B的版本。首先Maven是沒法識別版本的高低,因此,不會想固然的依賴高版本。

    1.先聲明,先依賴原則

        若是C的pom文件中,先定義dependency是A,則J1-1.0.jar會被依賴。

    2.路徑短原則

        C會依賴J2-2.0.jar,由於C->B->J2-2.0.jar依賴路徑短於 C->A->E->J2-1.0.jar

    3.可使用排除

        假設C的pom文件中,確實是dependency是A,則J1-1.0.jar會被依賴,可是此時C就是要依賴B的J1-2.0.jar版本,此時可使用exclusions 排除A中的J1.jar ==> 注意不用聲明version,由於A中只可能擁有一個version的J1.jar


4、maven的聚合

三個模塊,A,B,C 關係以下:

A   jar

B   jar

C->A,B  war


打包時,咱們要先打包A,再打包B,才能打包 C,由於C依賴於A,B。想象下,若是咱們有10個模塊,那麼咱們要操做10次。若是更多呢?


引入maven聚合的概念,目錄結構以下

A

    -src

    -pom.xml        jar

B

    -src

    -pom.xml        jar

C

    -src

    -pom.xml        war

D

    -pom.xml            pom            => 新定義一個pom文件類型是pom,該pom文件中,只需定義module便可。

===> module中配置是各個子模塊的相對路徑
...
...
<modules>
    <module>../A</module>            => 爲模塊A的路徑,使用了相對路徑。  編譯時候,會按順序分別操做
    <module>../B</module>
    <module>../C</module>            
</modules>
...
...


5、maven繼承

A-->J1-1.0.jar

B-->J1-1.0.jar

C-->J1-1.0.jar


當各個模塊中均含有某些共有的jar時,如spring、common、log4j等等。

咱們能夠新定義一個模塊,做爲全部模塊的父模塊。全部這些配置均在該新模塊中配置。各個子模塊只需繼承就行了。

引入maven繼承的概念,目錄結構以下

A

    -src

    -pom.xml        jar

                        =>修改次pom,添加繼承關係

                           

繼承中relativepath 是 父模塊的pom.xml文件的路徑
...
<parent>
    <groupid></groupid>
    <artifactid></artifactid>
    <version></version>
    <relativepath>../E/pom.xml</relativepath>            => 繼承E模塊的pom.xml
</parent>
...

B

    -src

    -pom.xml        jar

    

...
<parent>
    <groupid></groupid>
    <artifactid></artifactid>
    <version></version>
    <relativepath>../E/pom.xml</relativepath>            => 繼承E模塊的pom.xml
</parent>
...

C

    -src

    -pom.xml        war

...
<parent>
    <groupid></groupid>
    <artifactid></artifactid>
    <version></version>
    <relativepath>../E/pom.xml</relativepath>            => 繼承E模塊的pom.xml
</parent>
...

D

    -pom.xml            pom            => 新定義一個pom文件類型是pom,該pom文件中,只需定義module便可。

    -pom.xml            pom            => 把全部共有的屬性都移到此pom中,如屬性,dependency,groupid...全部子模塊都能被繼承。 子類能夠從新定義覆蓋。


問題:

    因爲dependency。對於不一樣的模塊,依賴是不同的,若是把各個模塊全部的dependency都移到parent中的話,會致使全部的模塊都依賴的全部jar。

    引入dependencymanager概念。即在parent中定義dependencymanager,並添加全部子類須要的jar。以及版本,

    此時子類是不會繼承這些jar的,必須收到寫入dependency。可是不須要指定version。由於會自動查找父類dependencymanager中的version,此處version確定是惟一的。


6、聚合與繼承合併

能夠把聚合的配置直接寫入到繼承中。


7、

也能夠不建立父模塊。而直接copy pom.xml到各個模塊的根目錄下。這樣只須要修改module和relativepath便可


8、版本管理

version: 通常爲 a.b.c-里程碑.jar

a:通常爲大版本,如java5.0 --> java6.0 , struts1.0 -> struts2.0 都是變化大的版本迭代。大調整的版本

b:通常爲分支版本,

c:分支版本有

里程碑:snapshot(開發版本) --> alpha(項目內測試的版本) --> beta(使用一段時間後) --> release --> ga版本

相關文章
相關標籤/搜索