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便可。
E
-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版本