目錄
Maven 項目管理工具
1. Maven 簡介
a. Maven 是什麼?
- Maven 翻譯爲"專家"、“內行”,是 Apache 下的一個純 Java 開發的開源項目。
- 對 Maven 比較正式的定義:Maven 是一個項目管理工具,它包含了一個項目對象模型,一組標準集合,一個項目生命週期,一個依賴管理系統,和用來運行定義在生命週期階段中插件目標的工具。
b. Maven 能解決什麼問題?
- 可以用更通俗的方式來說明。我們知道,項目開發不僅僅是寫寫代碼而已,期間會伴隨着各種必不可少的事情要做,下面列舉幾個例子:
- 我們需要引用各種 jar 包,尤其是比較大的工程,引用的 jar 包往往有幾十個乃至上百個,每用到一種 jar 包,都需要手動引入工程目錄,而且經常遇到各種讓人抓狂的 jar 包衝突,版本衝突。
- 我們寫好的 java 文件,需要通過 javac 編譯成 class 文件才能交給 JVM 運行。這項工作可以由各種 集成開發工具 幫我們完成 Eclipse、IDEA 等都可以將代碼即時編譯。
- 世界上沒有不存在 bug 的代碼,因此寫完了代碼,我們還要寫一些單元測試,然後 逐一 運行來檢驗代碼質量。
- 再優雅的代碼也是要出來賣的。我們後面還需要把代碼與各種配置文件、資源整合到一起,進行 打包。如果是 web 項目,還需要將之發佈到服務器 。
- 試想,如果現在有一種工具,可以把你從上面的繁瑣工作中解放出來,能幫你構建工程,管理 jar包,編譯代碼,還能幫你自動運行單元測試,打包,生成報表,甚至能幫你部署項目,生成 Web 站點,你會心動嗎?Maven 就可以解決上面所提到的這些問題。
c. Maven 的兩個核心功能(重點)
i. 依賴管理
- 傳統的 WEB 工程中,我們必須將工程所依賴的 jar 包複製到工程中,導致了工程的變得很大。
- Maven 的 WEB 工程中不直接將jar包導入到工程中,而是通過在 pom.xml 文件中添加所需jar包的座標。項目運行時,通過讀取座標到一個專門用於“存放jar包倉庫"(Maven倉庫)找到相應的jar包。
- 倉庫如何存放 jar 包?
ii. 項目構建
- 我們開發的項目,往往都要經歷編譯、測試、打包、安裝,部署等一系列過程。
- 什麼是構建項目?
指的是項目從編譯、測試、打包、安裝,部署整個過程都交給 ?Maven 進行管理,這個過程稱爲構建。 - 一鍵構建
指的是整個構建過程,使用 Maven 一個命令可以輕鬆完成整個工作。
2. Maven 安裝和使用
a. Maven 下載和安裝
- 下載
Maven 官網下載地址 :http://maven.apache.org/download.cgi
Maven 3.3+ 必須要求 JDK 1.7+ - 安裝
Maven 使用 java 語言開發的,解壓即可運行
注意:Maven 依賴 JAVA_HOME - 目錄
bin:存放了 Maven 的命令,比如我們前面用到的 mvn tomcat7:run
boot:存放了一些 Maven 本身的引導程序,如類加載器等
conf:存放了 Maven 的一些配置文件,如 setting.xml 文件
lib:存放了 Maven 本身運行所需的一些 jar 包
- 環境變量
MAVEN_HOME
:Maven 安裝目錄
path
:%MAVEN_HOME%\bin
- 配置完畢後檢查版本
mvn --version
b. Maven倉庫(重點)
i. Maven 倉庫的分類
- 本地倉庫
項目通過 jar 座標,先從本地倉庫找對應 jar 包,如果找不到會從遠程倉庫(互聯網)去下載 jar 包,保存在本地倉庫(在程序員的電腦上),第二次不需要從遠程倉庫去下載。 - 遠程倉庫
- 中央倉庫
由專業團隊(Maven 團隊)統一維護。
中央倉庫的地址:http://repo1.maven.org/maven2/ - 私服
架設在公司局域網內,提供給內部的人員使用。 - 第三方倉庫
中央倉庫只有一個,國內使用非常慢,我們可以更換爲:阿里雲鏡像。
- 中央倉庫
ii. Maven 本地倉庫的配置
- 將 repository.zip 解壓到非中文及特殊符號目錄下
(Maven 倉庫)
- 修改 Maven 的安裝目錄 /conf/settings.xml 文件的標籤
<localRepository>本地倉庫地址</localRepository>
(指定自定義本地倉庫)
iii. Maven 倉庫國內鏡像配置
- 修改 Maven 根目錄下的 conf 文件夾中的 setting.xml 文件,在 mirrors 節點上,添加內容如下:
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
c. Maven 座標和依賴
- 想要只用哪個 jar 包,通過座標方式進行依賴引入。
d. Maven 工程的結構(重點)
- 傳統的 java 工程遇到的問題:
* java項目
java工程名(項目名)
|-- src目錄
|-- main目錄(主幹代碼)
|-- java目錄(java代碼)
|-- resources目錄(配置文件)
|-- test目錄(測試代碼)
|-- java目錄(java代碼)
|-- resources目錄(配置文件)
|-- pom.xml(maven工程核心配置文件)
|-- target目錄(存放編譯後的class文件,沒有test目錄下的編譯文件)
* web項目(重點)
web工程名(項目名)
|-- src目錄
|-- main目錄(主幹代碼)
|-- java目錄(java代碼)
|-- resources目錄(配置文件)
|-- webapp目錄(頁面資源)
|-- WEB-INF
|-- web.xml(web工程核心配置文件)
|-- index.jsp
|-- css、js、img..
|-- test目錄(測試代碼)
|-- java目錄(java代碼)
|-- resources目錄(配置文件)
|-- pom.xml(maven工程核心配置文件)
|-- target目錄(存放編譯後的class文件,沒有test目錄下的編譯文件)
3. Maven 生命週期和插件(瞭解)
a. Maven 常用命令和插件
- 可以在 cmd 中通過一系列的 Maven 命令,來對我們的工程進行編譯、測試、打包、安裝、部署。
i. clean
- Maven 工程的清理命令,執行 clean 會刪除 target 目錄及內容(之前的 out 目錄)。
mvn clean
ii. compile
- Maven 工程的編譯命令,作用是將 src/main/.java 下的文件編譯爲 class 文件,並和 src/main 目錄下的配置文件一起輸出到 target/classes 目錄下。
mvn compile
iii. test
- Maven 工程的測試命令,作用是執行 src/test/java 下單元測試類,並編譯爲 class 文件。
mvn clean test
先清理再測試
iv. package
- Maven 工程的打包命令,對於 java 工程執行 package 打成 jar 包,對於 web 工程打成 war 包。 會自動進行測試,測試成功就打包,不成功不打包。
mvn clean package
先清理再打包
注意:爲什麼 maven_hello 是 war 包而不是 jar 包呢?
v. install
- Maven 工程的安裝命令,執行 install 將 mave 工程打成 jar 包或 war 包,併發布到本地倉庫。也是先編譯主幹再測試,需要添加依賴。
mvn clean install
先清理再安裝
vi. deploy
- Maven 工程部署命令,將 jar 或 war 包部署(上傳)到私服中。
- Maven 高級介紹了這個命令。
b. 生命週期
- Maven 對項目構建過程分爲 “三套相互獨立的” 生命週期,這三套生命週期分別是:
- Clean Lifecycle(清理生命週期)
在進行真正的構建之前進行一些清理工作。
命令:clean - Default Lifecycle(默認生命週期)
構建的核心部分,編譯,測試,打包,部署等等。
命令:compile test package install deploy - Site Lifecycle(站點生命週期)
生成項目報告,站點,發佈站點。
命令:site
- 在同一個生命週期中的命令,執行後面的命令,前面的命令自動執行
c. Maven 概念模型(瞭解)
4. IDEA 創建 Maven 工程(重點)
a. IDEA 配置本地 Maven 環境(全局)
- 我們在 IDEA 創建 Maven 工程默認從互聯網在下載一個骨架(但是我們電腦沒有聯網,就會卡頓一段時間,再使用本地骨架),我們可以直接指定 IDEA 查找本地骨架,提升效率並指定編碼防止亂碼。
-DarchetypeCatalog=internal -Dfile.encoding=GB2312
- 需要創建一個全新的工作空間(基於 Mave 結構),注意要遵守 IDEA 初始化工作空間規範。
b. IDEA 創建工程
i. Java 工程
- 手動創建 test 測試配置文件目錄:
- 指定 Maven 環境的 JDK 版本和字符集:
<build>
<plugins>
<!-- 設置編譯版本爲1.8 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
- Maven 工程命令操作:
- 如何導入依賴?
- Maven 的搜索倉庫:https://mvnrepository.com/
<!--依賴管理-->
<dependencies>
<!--junit座標-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
ii. web 工程(重點)
- IDEA 創建 web 工程,需要我們安裝一個插件:
- 安裝成功後,重啓 IDEA 工具
iii. 注意
- 創建完 Maven 之後,如果文件夾不會變顏色,可以手動刷新:
c. 發佈 web 工程
i. IDEA 使用外置 Tomcat 運行(重點)
- 點擊 Add Configuration:
- 測試:
ii. IDEA 使用 Maven 內置 Tomcat 插件(瞭解)
<build>
<plugins>
<!-- 設置編譯版本爲1.8 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/</path>
<uriEncoding>utf-8</uriEncoding>
</configuration>
</plugin>
</plugins>
</build>
- 雙擊啓動(推薦):
- 命令啓動(不推薦,取消會默認退回到之前的 Module):
d. 依賴管理
- 開發期間,jar 包都在倉庫;運行期間,Maven 自動把 jar 包放到了項目的 lib 目錄下。
- 不考慮依賴範圍引起的問題:
- clean package 之後,javax.servlet-api.jar 包消失了。
依賴範圍 | 對於編譯 classpath 有效 | 對於測試 classpath 有效 | 對於運行時classpath 有效 | 例子 |
---|---|---|---|---|
compile(默認) | Y | Y | Y | mybatis |
test | - | Y | - | junit |
provided | Y | Y | - | servlet-api |
runtime | - | Y | Y | JDBC驅動 |
system | Y | Y | - | 本地,maven倉庫之外的庫 |
- compile
默認依賴範圍,作用域在編譯、測試、運行時都有效。 - test
作用域在測試時有效。編譯和運行時不需要,比如:Junit。 - provided
作用域在編譯、測試時有效。運行時不需要,比如: servlet api 被 tomcat 容器提供,不指定可能會因爲版本不兼容導致衝突。 - runtime
作用域在測試、運行時有效。編譯時不需要,比如:jdbc 的驅動包。 - system
system 範圍依賴與 provided 類似,jar 包在本地磁盤而不是 Maven 倉庫。相當於找到 WEB-INF/lib,自己導入 jar 包,一般是因爲在 Maven 倉庫(本地、官網)裏沒有該 jar 包,不過一般很少出現該情況。