pom.xml檔案
<groupId>org.son.nexus</groupId>//專案隸屬的實際專案名
<artifactId>nexus-indexer</artifactId>//實際專案中的一個maven專案模組名稱
<version>2.0.0</version>//版本號
<packaging>jar</packaging>//當前maven專案打包的方式,預設為jar
以上的配置會獲得一個<artifactId>-<version>.<packaging>格式的包//nexus-indexer-2.0.0.jar
<classifier>jdk7</classifier>//用於定義構建輸出的一些附屬的構建。classifier是不能直接定義的,只能存在附加的構件(外掛)時,才能(必須)新增。在包名上也會有所提現(nexus-indexer-2.0.0-javadoc.jar)
jar包在倉庫中的路徑規律:groupId/artifactId/version/groupId-version
依賴倉庫
groupId、artifactId、version為基本座標
type為依賴型別,預設為jar
scope為依賴範圍
compile:編譯,測試,執行三種classpath都有效
test:只對測試有效
provided:編譯和測試有效
runtime:測試和執行有效
system:系統依賴,依賴的包是從計算機本地匯入,與systemPath配合使用
<systemPath>${java.home}/lib/rt.jar</systemPath>
<scope>system</scope>
傳遞性依賴
maven預設就是支援的。
什麼是傳遞性依賴?
比如:現在要匯入A.jar包,但A.jar有依賴於B.jar,在maven中就會預設匯入B.jar,而不需要手動去匯入。
scope最好設為compile
傳遞性依賴存在一個問題:工程中存在兩個jar分別依賴的是B.jar的不同版本jar包,就會出現錯誤。
optional:可選依賴,true 不會傳遞,false會傳遞(預設)
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.10</version>
<optional>true</optional>
</dependency>
當其他專案C依賴B專案時,mysql-connector-java的依賴不會發生傳遞給C
優點:
減少衝突,不用的功能不傳遞
一個jar應該只有 一個職責原則
exclusions排除依賴
用於替換某個 依賴中的依賴包作用
<dependencies>
<dependency>
<groupId>com.juv</groupId>
<artifactId>project-B</artifactId>
<version>1.0.0</version>
<exclusions>
<exclusion>//可以有多個
<groupId>com.juv</groupId>
<artifactId>project-C</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.juv</groupId>
<artifactId>project-B</artifactId>
<version>1.1.0</version>
</dependency>
</dependencies>
該例子的意思:不想使用project-B中版本的project-C依賴包,而將其環衛1.1.0的project-C包
歸類依賴
場景:存在一群版本號一致的依賴,想通過一個統一的配置,將其統一配置和修改
<properties>
<spring>2.5.6</spring>
</properties>
呼叫方式
<version>${spring}</version>
部署至遠端倉庫
修改工程中的pom檔案
<project>
....
<distributionManagement>
<repository> //釋出版本構件的倉庫
<id></id> //遠端倉庫的唯一標識
<name></name> //自定義
<url></url> //該倉庫地址
</repository>
<snapshotRepository>//快照版本的設定
<id></id>
<name></name>
<url></url>
</snapshotRepository>
</distributionManagement>
....
</project>
如果需要認證,則在setting.xml檔案中增加一個<server>元素進行配置
在配置完成後,執行mvn clean deploy 就會根據當前版本型別,釋出到相應的倉庫中
快照版本
快照不是正式版本,當設為帶有SNAPSHOT的version時,即為快照版本,每次向倉庫部署是,會自動打上時間戳,其他引用快照相同版本時會自動下載更新
例如:2.1-SNAPSHOT時,則會下載2.1-20091214之類的構件
在maven本地倉庫的groupId/artifactId/version檔案路徑下會存在maven-metadata.xml檔案,會記錄版本資訊
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>com.android.support</groupId>
<artifactId>multidex</artifactId>
<version>1.0.0</version>
<versioning>
<versions>
<version>1.0.0</version>
<version>1.0.1</version>
</versions>
<lastUpdated>20141209014044</lastUpdated>
</versioning>
</metadata>
maven生命週期
maven的生命週期是抽象的,其實際行為都是由外掛來完成的。
maven的生命週期是不做任何實際工作,實際任務都由外掛完成。
maven具有三個獨立的生命週期:clean、defeat、site
1、clean生命週期:清理專案,包含三個phase。
1)pre-clean:執行清理前需要完成的工作
2)clean:清理上一次構建生成的檔案
3)post-clean:執行清理後需要完成的工作
2、default生命週期:構建專案,重要的phase如下。
1)validate:驗證工程是否正確,所有需要的資源是否可用。
2)compile:編譯專案的原始碼。
3)test:使用合適的單元測試框架來測試已編譯的原始碼。這些測試不需要已打包和佈署。
4)Package:把已編譯的程式碼打包成可釋出的格式,比如jar。
5)integration-test:如有需要,將包處理和釋出到一個能夠進行整合測試的環境。
6)verify:執行所有檢查,驗證包是否有效且達到質量標準。
7)install:把包安裝到maven本地倉庫,可以被其他工程作為依賴來使用。
8)Deploy:在整合或者釋出環境下執行,將最終版本的包拷貝到遠端的repository,使得其他的開發者或者工程可以共享。
3、site生命週期:建立和釋出專案站點,phase如下
1)pre-site:生成專案站點之前需要完成的工作
2)site:生成專案站點文件
3)post-site:生成專案站點之後需要完成的工作
4)site-deploy:將專案站點發布到伺服器
命令列輸入:$mvn clean 其實呼叫的是clean生命週期的clean階段,執行了pre-clean和clean
而這些命令其實是由外掛提供功能的。
自定義繫結外掛
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>//maven官方,官方的可以省略該標籤
<artifactId>maven-source-plugin</artifactId>//外掛
<version>2.1.1</version>//沒有version時,會預設下載最新的release版本
<executions>//配置執行n個任務
<execution>
<id>attach-sources</id>//可以任意
<phase>verify</phase>//繫結到verify生命週期,在此時才會起作用
<goals>
<goal>jar-no-fork</goal>//啟用該外掛的jar-no-fork功能
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
因為一個外掛可能存在多個功能,但我們並不一定所有的功能都需要,所以設定goal標籤,表示我們要實現的功能。
外掛配置
命令列配置:$mvn install -Dt 外掛相關引數 //適用於當每次執行時,這個外掛的配置都會變的情況
pom中全域性配置:
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source> //jdk1.7
<target>1.7</target> //編譯後jdk1.7
</configuration>
</plugin>
</plugins>
</build>
聚合(多模組)
意義:一次構建所有想要構建的專案
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.son.nexus</groupId>
<artifactId>nexus-indexer</artifactId>
<version>2.0.0</version>
<packaging>pom</packaging>//本身也是一個maven工程
<modules>
<module>account-email</module>//想要構建的專案,這裡寫的是當前pom檔案下的相對路徑地址
<module>account-persilist</module>
</modules>
</project>
聚合pom檔案的packaging標籤一定要是pom,其工程就只是一個pom檔案,沒有其他的實現程式碼
一般來說模組處的目錄名應與其artifactId一致
聚合模組與其他模組的目錄結構並非一定要父子關係
繼承
父pom
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.son.nexus</groupId>
<artifactId>nexus-indexer</artifactId>
<version>2.0.0</version>
<packaging>pom</packaging>//本身也是一個maven工程
<dependencies>
<dependency>
<groupId>com.juv</groupId>
<artifactId>project-B</artifactId>
<version>1.0.0</version>
<exclusions>
<exclusion>
<groupId>com.juv</groupId>
<artifactId>project-C</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.juv</groupId>
<artifactId>project-B</artifactId>
<version>1.1.0</version>
</dependency>
</dependencies>
</project>
父pom的packaging也是pom
子pom
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.son.nexus</groupId>
<artifactId>nexus-B</artifactId>
<version>2.0.0</version>
<packaging>jar</packaging>
<parent>
<groupId>org.son.nexus</groupId>
<artifactId>nexus-C</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>//相對路徑
</parent>
</project>
子pom的packaging則不一定要是pom,但一定有parent標籤
子類的groupId和version也可以繼承與父pom檔案
<dependencyManagement>標籤
作用:當子類不需要父pom中的某些依賴的時,就可以使用。
父pom
<dependencyManagement>
<dependencies>
<dependency>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
<version>3.1.1.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
被<dependencyManagement>標籤所包裹的依賴是不會主動被載入進入子pom中,只有子pom中顯式再次宣告的時候才會被依賴
子pom
<dependencies>
<dependency>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</dependency>
</dependencies>
可以省略version等其他配置,因為父pom中已經配置過了
若想獲取父pom中所有的dependencyManagement中的構件配置,則在子pom中如下配置
<dependencyManagement>
<dependencies>
<dependency>
<artifactId>account-parent</artifactId>
<groupId>com.juvenxu.accout</groupId>
<version>3.1.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
配置父pom的一些資訊
外掛管理
父pom中的外掛不想在子類中預設使用
跟依賴管理一樣,被<pluginManagement>包裹的外掛配置不會被子pom主動獲取,只有當子pom中宣告瞭該外掛的groupId和artifactId後,才會被繼承
一個pom檔案既可以是聚合也可以是父pom
反應堆
在聚合構建時,構件模組的先後順序的排列。
按書寫的先後順序進行構建
加料區
如果同一個專案中存在多個模組相互依賴時候,version和groupId可以使用${project.groupId}(當前模組的groupId)和${project.verison},這樣就不用不斷的更改了。
<finalName>標籤用來確定最終包名
-
以上です(Ending)
-
ありがどう(Thank You)