# Maven
[TOC]
## 導學
Maven是一個項目管理工具,在之前的課程中,我們一個項目使用了多個jar包,這對于我們來說是比較麻煩的,不同的jar包之間可能相互依賴,也有可能產生沖突。在這種情況下,如何去保證我們的jar包使用正確呢?Maven就能極好的解決這個問題。
在本節課程中,需要掌握Maven的核心特性,依賴管理以及打包方式。
## Maven介紹
**Maven介紹:**
* Maven是項目管理工具,對軟件項目提供構建和依賴管理
* Maven是Apache下的Java開源工具
* Maven是Java項目提供了統一的管理方式,已成為業界標準
>[warning]日常開發痛點:
>1. 不同的IDE之間創建的項目結構不同,是不能互通的,eclipse中創建的項目就不能拿到idea中運行。
>2. 一個Java軟件需要多種Jar包支持,到處下載很麻煩。
>3. 一個Java項目打包無外乎jar包與war包,如何采用一個更統一更方便的方式呢?
**Maven核心特性:**
* 項目設置遵循統一的規則,保證不同開發環境的兼容性
* 強大的依賴管理,項目依賴組件自動下載、自動更新
* 可擴展的插件機制,使用簡單,功能豐富
## maven的安裝與配置
**首先需要安裝和配置好jdk!**
maven是由Java所編寫的一款軟件,所以需要先安裝好jdk。
下載地址:[http://maven.apache.org/](http://maven.apache.org/)

下載完成后,解壓。并將bin目錄添加到系統環境變量path中。
打開cmd,輸入`mvn -version`,出現如下畫面就成功了。

**修改默認倉庫**
maven默認將C盤作為下載Jar包后存放的倉庫,為了節約C盤空間需要修改maven的倉庫。
找到conf文件夾下的conf目錄,打開setting.xml文件

改為:

驗證:

**修改遠程倉庫**
遠程倉庫指的是maven從何處下載jar包,因為默認采用的是國外的地址,下載速度較慢,所以需要設置為國內阿里云的鏡像倉庫。
~~~
<mirrors>
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
</mirrors>
~~~

**整合maven到eclipse和idea**

打開preferences



關于idea集成maven,可以打開File-Settings-Build,Execution,Deployment-Build Tools-Maven選項中設置,設置步驟類似。
也可以使用idea自帶的maven插件,只需要打開該對應插件中的setting.xml配置本地倉庫和鏡像中央倉庫。
## 創建maven項目






## maven依賴管理
**依賴管理:**
1. Maven利用dependency(依賴)自動下載、管理第三方jar;
2. 在pom.xml文件中配置項目依賴的第三方組件
3. maven自動將依賴從遠程倉庫下載至本地倉庫,并在工程中引用

可以在該pom.xml中添加一個dependencies的根標簽。
并去[https://search.maven.org](https://search.maven.org/)中查找對應jar包的依賴
比如,我現在添加該依賴就可以下載對應的mysql連接驅動。
~~~
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dodoke</groupId>
<artifactId>test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
</dependencies>
</project>
~~~
比較復雜的組件由多個jar包組合,maven對組件進行深入解析,對所有jar包進行下載。
## 本地倉庫與中央倉庫
在我們使用maven之前,其實我們已經去設置了中央倉庫為阿里云的鏡像倉庫,而且也設置了本地倉庫為c盤之外的其他盤符。
那么,究竟什么是maven的中央倉庫與本地倉庫呢?

當我們使用maven的時候,我們可以通過pom.xml下載對應的jar包。其實maven會經歷如下的步驟:
1. 解析pom.xml,分析要下載的內容
2. 查看本地倉庫,查找是否已經下載過該jar包
3. 如果沒有該jar包,將前往中央倉庫下載該jar包到本地倉庫
4. 在下載好以后或本地存在該jar,則自動的將該jar包添加到項目中
其實在之前的設置中,我們設置了maven默認下載的阿里云提供的中央倉庫中保存的jar包。但是這在我們正式開發中不怎么建議。
通常我們會設置單獨某個項目采用私服(代理服務器,保存有備份的jar包,最有名的就是阿里云的私服)的倉庫,比如我們會在pom.xml中設置倉庫地址。
~~~
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dodoke</groupId>
<artifactId>test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<repositories>
<repository>
<id>aliyun</id>
<name>aliyun</name>
<!-- 可能阿里云倉庫的地址會發生變化,需要查找最新的地址 -->
<url>https://maven.aliyun.com/repository/public</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
</dependencies>
</project>
~~~
這樣就可以設置單個項目的jar下載,優先從阿里云私服下載,如果私服沒有,才從maven官網下載。
## 項目打包
Maven可以將項目打包成jar和war包,Maven項目打包是通過Plugins(插件)來實現的,Maven輸出Jar包的插件叫做`maven-assembly-plugin`
~~~xml
<!-- 與dependencies節點同級 -->
<build>
<!-- 打jar包的配置插件 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<!-- 盡管已經有更高版本的插件,但是2.5.5是一個經典版本 -->
<version>2.5.5</version>
<!-- 配置 -->
<configuration>
<!-- 指定入口類 即帶有main方法的類-->
<archive>
<manifest>
<mainClass>com.dodoke.maven.JDBCTest</mainClass>
</manifest>
</archive>
<!-- 額外參數 -->
<descriptorRefs>
<!-- all in one 在打包時將所有引用的jar(包括非自己寫的類)合并到輸出的jar文件中 -->
<descriptorRef>
jar-with-dependencies
</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
~~~

**如何運行,生成jar包**
1. 選擇run菜單中的Run Configurations命令-選擇Maven build創建新運行命令


2. 運行新命令

3. 生成的jar包

## maven創建Java web項目
創建Java web,其實對于maven來說,步驟和創建普通Java項目一樣。
但是要注意修改一下maven項目使用的jdk和編譯級別(默認使用jdk 1.5)

項目上右鍵選擇properties,選擇Java compiler

創建保存網頁的文件夾

**這時前期的準備工作就已經完成了。**
接下來,需要將普通工程轉變為Java web工程,同樣項目上右鍵選擇properties




## web工程打包
~~~
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dodoke</groupId>
<artifactId>maven</artifactId>
<version>1.0.0-SNAPSHOT</version>
<!-- packaging代表輸出格式,只有jar和war兩種格式,如果沒寫,默認輸出jar包 -->
<packaging>war</packaging>
<repositories>
<repository>
<id>aliyun</id>
<name>aliyun</name>
<!-- 可能阿里云倉庫的地址會發生變化,需要查找最新的地址 -->
<url>https://maven.aliyun.com/repository/public</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
<build>
<!-- 定義輸出的war包的文件名 -->
<finalName>maven-web</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven.war.plugis</artifactId>
<version>3.2.2</version>
</plugin>
</plugins>
</build>
</project>
~~~
同樣新增創建一個新的打包運行命令:

## maven常用命令

之前我們都是在eclipse中使用maven,其實我們也可以通過控制臺創建maven項目。
本節內容僅做了解
## idea中使用maven
**普通Java項目**



**創建Java Web項目**
[https://blog.csdn.net/qq\_37856300/article/details/85776785](https://blog.csdn.net/qq_37856300/article/details/85776785)