使用Maven那麼久了,你對企業級Maven的核心配置瞭解多少?
阿新 • • 發佈:2020-10-04
## 寫在前面
> 相信從事Java工作的小夥伴們多多少少都會接觸到Maven。使用Maven來搭建專案,能夠極大的方便我們構建專案的依賴關係,對於專案中需要依賴的Jar包,也只是簡單的在pom.xml中進行配置即可。可以說,Maven能夠極大的提高我們的開發效率和專案的維護效率,能夠統一專案的依賴環境,提高團隊的協作效率。然而,儘管使用Maven的小夥伴很多,但真正掌握了Maven核心配置的又有多少呢?
## 專案依賴
專案依賴是指Maven 通過依賴傳播、依賴優先原則、可選依賴、排除依賴、依賴範圍等特性來管理專案classpath。
### 依賴傳播特性
我們的專案通常需要依賴第三方元件,而第三方元件又會依賴其它元件遇到這種情況Maven會將依賴網路中的所有節點都會加入classpath當中,這就是Maven的依賴傳播特性。
例如下面的配置
```xml
```
專案直接依賴了spring-webmvc 叫直接依賴,而對commons-logging 依賴是通過webmvc傳遞的所以叫間接依賴。
### 依賴優先原則
基於依賴傳播特性,導致整個依賴網路會很複雜,難免會出現相同元件不同版本的情況。Maven此時會基於依賴優先原則選擇其中一個版本。
* 第一原則:最短路徑優先。
* 第二原則:相同路徑下配置在前的優先。
**第一原則示例**
```xml
```
上述例子中commons-logging 通過spring-webmvc 依賴了1.1.3,而專案中直接依賴了1.2,基於最短路徑原則專案最終引入的是1.2 版本。
**第二原則示例**
**主要步驟如下所示:**
(1)新增一個新工程Project B
(2) 配置Project B 依賴 spring-web.3.2.9-RELEASE
(3)當前工程直接依賴 Project B
配置完之後,當前工程 project A 有兩條路徑可以依賴 spring-web,選擇哪一條 就取決於 對 webmvc 和 Project B的配置先後順序。
* Project A==> spring-webmvc 5.2.9-RELEASE ==> spring-web 5.2.9-RELEASE
* Project A==> Project B 1.0.SNAPSHOT ==>spring-web.3.2.9-RELEASE
**注意:在同一pom檔案,第二原則不在適應。如下配置,最終引用的是1.2 版本,而不是配置在前面的1.1.1版本。**
```xml
```
### 可選依賴
可選依賴表示這個依賴不是必須的。通過在````中添 加```` 表示,預設是不可選的。可選依賴不會被傳遞。
### 排除依賴
即排除指定的間接依賴。通過配置````配置排除指定元件。
例如,我們可以使用下面的配置來排除對於spring-web的依賴。
```xml
```
### 依賴範圍
像junit 這個元件 我們只有在執行測試用例的時候去要用到,這就沒有必要在打包的時候把junit.jar 包過構建進去,可以通過Maven 的依賴範圍配置````來達到這種目的。Maven 總共支援以下四種依賴範圍:
* **compile(預設)**: 編譯範圍,編譯和打包都會依賴。
* **provided:** 提供範圍,編譯時依賴,但不會打包進去。如:servlet-api.jar
* **runtime:** 執行時範圍,打包時依賴,編譯不會。如:mysql-connector-java.jar
* **test:** 測試範圍,編譯執行測試用例依賴,不會打包進去。如:junit.jar
* **system:** 表示由系統中classpath指定。編譯時依賴,不會打包進去。配合```` 一起使用。示例:java.home下的tool.jar
system 除了可以用於引入系統classpath 中包,也可以用於引入系統非maven 收錄的第三方Jar,做法是將第三方Jar放置在 專案的 lib 目錄下,然後配置 相對路徑,但因system 不會打包進去所以需要配合 maven-dependency-plugin 外掛配合使用。當然,我還是推薦小夥伴們通過 將第三方Jar手動install 到倉庫。
接下來,我們就列舉幾個簡單的使用示例。
* system 的通常使用方式
```xml
```
* system 另外使用方式 ,將工程內的jar直接引入
```xml
```
* 通過外掛 將system 的jar 打包進去
```xml
```
* 手動加入本地倉庫
```bash
mvn install:install-file -Dfile=mykit-transaction-message.jar -DgroupId=io.mykit -DartifactId=mykit-transaction-message -Dversion=1.0.0-RELEASE -Dpackaging=jar
```
## 專案聚合與繼承
### 聚合
聚合是指將多個模組整合在一起,統一構建,避免一個一個的構建。聚合需要個父工程,然後使用 ```` 進行配置其中對應的是子工程的相對路徑。例如下面的配置。
```xml
```
### 繼承
繼承是指子工程直接繼承父工程 當中的屬性、依賴、外掛等配置,避免重複配置。繼承包括如下幾種方式。
* 屬性繼承
* 依賴繼承
* 外掛繼承
**注意:上面的三個配置子工程都可以進行重寫,重寫之後以子工程的為準。**
### 依賴管理
通過繼承的特性,子工程是可以間接依賴父工程的依賴,但多個子工程依賴有時並不一至,這時就可以在父工程中加入```` 宣告該工程需要的JAR包,然後在子工程中引入。例如下面的配置。
```xml
```
### 專案屬性
通過 ```` 配置屬性引數,可以簡化配置。例如下面的配置。
```xml
```
我們可以在pom.xml檔案中使用下面的形式來引入配置的引數。
```xml
${projectName}
```
接下來,我們再來看幾個Maven的預設屬性,如下所示。
* ${basedir} 專案根目錄
* ${version}表示專案版本;
* `${project.basedir}同${basedir};`
* `${project.version}表示專案版本,與${version}相同; `
* ${project.build.directory} 構建目錄,預設為target
* ${project.build.sourceEncoding}表示主原始碼的編碼格式;
* ${project.build.sourceDirectory}表示主原始碼路徑;
* ${project.build.finalName}表示輸出檔名稱;
* ${project.build.outputDirectory} 構建過程輸出目錄,預設為target/classes
## 專案構建配置
### 構建資源配置
基本配置示例:
```xml
```
說明:
* defaultGoal:執行構建時預設的goal或phase,如jar:jar或者package等
* directory:構建的結果所在的路徑,預設為${basedir}/target目錄
* finalName:構建的最終結果的名字,該名字可能在其他plugin中被改變
### resources 配置示例
```xml
```
說明:
* resources:build過程中涉及的資原始檔
* targetPath:資原始檔的目標路徑
* directory:資原始檔的路徑,預設位於${basedir}/src/main/resources/目錄下
* includes:一組檔名的匹配模式,被匹配的資原始檔將被構建過程處理
* excludes:一組檔名的匹配模式,被匹配的資原始檔將被構建過程忽略。同時被includes和excludes匹配的資原始檔,將被忽略。
* filtering:預設false ,true 表示 通過引數 對 資原始檔中 的${key} 在編譯時進行動態變更。替換源 -Dkey 和po