1.Maven概念
Maven 是目前最流行的自動化構建工具,Maven是一款在大型項目開發過程中不可或缺的重要工具。
- maven可以管理jar文件
- 自動下載jar和他的文檔,源代碼
- 管理jar直接的依賴, a.jar需要b.jar , maven會自動下載b.jar
- 管理你需要的jar版本
- 幫你編譯程序,把java編譯為class
- 幫你測試你的代碼是否正確。
- 幫你打包文件,形成jar文件,或者war文件
- 幫你部署項目
其中5.6.7.8屬於Maven項目構建的過程,所以Maven不僅可以完成jar包的管理,還能完成項目的構建。
2.Maven項目構建
項目構建是面向過程的,就是一些步驟,完成項目代碼的編譯,測試,運行,打包,部署等等。maven支持的構建包括有:
- 清理:把之前項目編譯的東西刪除,為新的編譯代碼做准備。
- 編譯: 把java文件編譯為class文件,Maven的編譯功能是批量的,可以同時把成千上萬的文件編譯為class。與命令javac不同,javac一次編譯一個文件。
- 測試:maven可以執行測試程序代碼,驗證你的功能是否正確。同時也是批量操作,即maven可以同時執行多個測試代碼,同時測試很多功能。
- 報告:生成測試結果的文件, 通過報告查看測試是否通過。
- 打包:如果測試通過,就可以對項目進行打包。打包的含義就是 把你的項目中所有的class文件,配置文件等所有資源放到一個壓縮文件中。通常java程序,壓縮文件是jar擴展名的。對於web應用,壓縮文件擴展名是.war。
- 安裝:在Maven環境下把“打包”生成的jar、war文件安裝到本地倉庫。
- 部署:將打包的結果部署到遠程倉庫或將war包部署到服務器上運行
部署一般采用手動完成,前6個步驟都是通過Maven進行實現。
3.Maven的核心概念
-
POM:Maven的核心,它是一個文件,名稱通常為pom.xml,開發人員通過管理pom.xml可以完成控制maven構建項目的過程以及jar包依賴的管理。
-
約定的目錄結構 : maven項目的目錄和文件的位置都是規定的。
-
坐標 : 是一個唯一的字符串,用來表示資源的。
-
依賴管理 : 管理項目中可以使用的jar文件。
-
倉庫管理(了解) :資源存放的具體位置。
-
生命周期 (了解) : maven工具構建項目的過程,就是生命周期。即Maven項目構建的7個步驟就代表Maven的生命周期。
-
插件和目標(了解):執行maven構建的時候用的工具是插件
-
繼承(后期講解)
-
聚合(后期講解)
可以使用maven的命令完成相關操作,同時也可以在idea中直接使用maven,代替命令。
Maven的構建直接看視頻即可。
4.Maven的核心概念詳述
4.1 Maven工程約定的目錄結構
mvn compile:編譯src/main/java下的所有java文件,生成class文件,正確執行mvn compile命令的結果是在項目的根目錄(Hello)下生成target目錄,maven對java文件進行編譯,將編譯完成的class文件放在target/classes中
4.2 pom文件
pom在maven中是一個pom.xml文件,該文件是maven的靈魂,maven的項目構建以及管理依賴的功能都是通過編寫該文件實現的。
4.2.1 pom.xml文件的組成
(1) 坐標
唯一值, 在互聯網中唯一標識一個項目的。坐標由三部分構成
<groupId>公司域名的倒寫</groupId>
<artifactId>自定義項目名稱</artifactId>
<version>自定版本號</version>
(2) packaging
打包后壓縮文件的擴展名,默認是jar ,web應用是war
(3) 依賴
dependencies 和dependency ,相當於是 java代碼中import
你的項目中要使用的各種資源說明, 比我的項目要使用mysql驅動
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
</dependencies>
先在本地倉庫中找mysql文件夾(groupId對應的文件夾),找到后在mysql文件夾中找mysql-connector-java文件夾(artifactId對應的文件夾),最后在mysql-connector-java文件夾中找5.1.9版本對應的文件夾(version對應的文件夾),然后把對應的jar包引入我們的項目中,如果有任意一步沒找到對應文件夾,則從中央倉庫拉取。
Maven的一個重要作用就是管理jar包,為了一個項目可以構建或運行,項目中不可避免的,會依賴很多其他的jar包,在Maven中,這些jar就被稱為依賴,使用標簽dependency來配置。而這種依賴的配置正是通過坐標來定位的,由此我們也不難看出,maven把所有的 jar 包也都視為項目存在了。
(4) properties
properties 是用來定義一些配置屬性的 , 例 如 project.build.sourceEncoding(項目構建源碼編碼方式),可以設置為 UTF-8,防止中文亂碼。同時也可以設置項目的運行的Java版本。
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
(5) build
build表示與構建相關的配置,例如設置編譯插件的 jdk 版本
<build>
配置插件
<plugins>
配置具體的插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
插件的名稱
<artifactId>maven-compiler-plugin</artifactId>
插件的版本
<version>3.8.1</version>
配置插件的具體信息
<configuration>
告訴Maven 我們寫的代碼需要在jdk1.8下編譯
<source>1.8</source>
告訴Maven 我們寫的代碼需要在jdk1.8下運行
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
(6) parent
在 Maven 中,如果多個模塊都需要聲明相同的配置,例如:groupId、 version、有相同的依賴、或者相同的組件配置等,也有類似 Java 的繼承機 制,用 parent 聲明要繼承的父工程的 pom 配置。
(7) modules
在 Maven 的多模塊開發中,為了統一構建整個項目的所有模塊,可以提供一 個額外的模塊,該模塊打包方式為 pom,並且在其中使用 modules 聚合的 其它模塊,這樣通過本模塊就可以一鍵自動識別模塊間的依賴關系來構建所有 模塊,叫 Maven 的聚合。
4.3 Maven的生命周期和插件
-
Maven的生命周期指的就是maven構建項目的過程,包括清理、編譯、測試、報告、打包、安裝、部署這幾個階段。這幾個階段都可以通過Maven相對應的命令進行完成。
-
Maven的插件:在Maven執行命令的過程中,真正完成命令對應功能的就是這些插件。這些插件就是一些jar文件。
4.4 Maven單元測試
(1)加入依賴,在pom.xml加入單元測試依賴
<!-- 單元測試 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
(2)在maven項目中的src/test/java目錄下,創建測試程序。
推薦的創建類和方法:
1.測試類的名稱:Test + 你要測試的類名(注意類名Test必須大寫,否則報錯)
2.測試的方法名稱:Test + 方法名稱
例如你要測試Hello類中的add方法,則創建測試類TestHello
@Test
public void Testadd(){
測試HelloMaven的add方法是否正確
}
其中testAdd叫做測試方法,它的定義規則
1.方法是public的,必須的
2.方法沒有返回值, 必須的
3.方法名稱是自定義的,推薦是Test + 方法名稱
4.在方法的上面加入 @Test
具體實例如下:
//該測試用例表示測試Myapp類中的add()方法。
public class TestMyapp {
@Test
public void Testadd(){
int ans = myapp.add(10,20);
//Assert.assertEquals(期望值,實際值),當兩者不一樣的時候將會拋出異常。
Assert.assertEquals(30,ans);
}
}
4.5 Maven常用命令
Maven可以獨立使用,通過以下的命令就可以單獨完成maven的生命周期的執行
- mvn clean:清理(會刪除原來編譯和測試的目錄,即 target 目錄,但是已經 install 到倉庫里的包不會刪除) ,該命令由maven-clean-plugin插件實現。
- mvn compile:編譯主程序(會在當前目錄下生成一個 target,里邊存放編譯主程序之后生成的字節碼文件,並同時把main\resources下的配置文件復制一份至target\classes中) ,該命令由maven-compiler-plugin插件實現。
- mvn test-compile:編譯測試程序(會在當前目錄下生成一個 target,里邊存放編譯測試程序之后生成的字節碼文件)
- mvn test:測試(會生成一個目錄surefire-reports,保存測試結果)
- mvn package:打包主程序(會編譯、編譯測試、測試、並且按照 pom.xml 配置把主程序打包生成 jar 包或者 war 包) (該命令生成的jar包只包含
src/main目錄下的所有文件,test不包含。) - mvn install:安裝主程序(會把本工程打包,並且按照本工程的坐標保存到本地倉庫中)
- mvn deploy:部署主程序(會把本工程打包,按照本工程的坐標保存到本地庫中,並且還會保存到私服倉庫中。 還會自動把項目部署到 web 容器中)。
注意:執行以上命令必須在命令行進入 pom.xml 所在目錄,同時比如你執行mvn test,Maven會自動從上往下幫你執行,因此你不必在執行mvn test-compile等命令。
5.Maven在IDEA中的使用
5.1 Maven在IDEA中的配置
idea中內置了maven ,一般不使用內置的, 因為用內置修改maven的設置不方便。使用自己安裝的maven, 需要覆蓋idea中的默認的設置。讓idea指定maven安裝位置等信息
(1)配置當前工程的設置,
file--settings ---Build, Excution,Deployment--Build Tools--Maven
Maven Home directory: maven的安裝目錄
User Settings File : 就是maven安裝目錄conf/setting.xml配置文件
Local Repository : 本機倉庫的目錄位置
--Build Tools--Maven--Runner
VM Option: -DarchetypeCatalog=internal
JRE: 你項目的jdk
maven項目創建時,會聯網下載模版文件,模版文件比較大, 使用-DarchetypeCatalog=internal,不用下載, 創建maven項目速度快。
(2)配置以后新建工程的設置, file--other settings--Settings for New Project
5.2 使用Maven模板創建項目
- maven-archetype-quickstart : 普通的java項目
- maven-archetype-webapp : web工程
6.Maven依賴的范圍
Maven中的依賴范圍利用<scope></scope>標簽表示。scope的值有 compile, test, provided ,默認是compile
scope:表示依賴使用的范圍,也就是在maven構建項目的相應階段中起作用。maven構建項目的過程即生命周期,包括編譯,測試,打包,安裝,部署過程(階段)。
例如junit的依賴范圍是 test,表示junit只在測試階段使用。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
provided的含義在於:在編譯、測試階段需要提供相關的jar包,而在安裝部署過程則不需要提供。
