1. 程式人生 > 其它 >Maven學習——maven介紹和核心概念

Maven學習——maven介紹和核心概念

技術標籤:構建工具maven

Maven

Maven的介紹

在整個軟體開發的過程中,完成一個軟體專案需要完成很多的工作:

- 分析專案的組成部分以及實現方法
- 設計專案所需技術、軟體、人員以及時長,並組建團隊進行開發
- 要編譯程式碼—>開發人員自己測試程式碼—>把程式碼打包—>部署專案到測試伺服器—>測試人員測試功能—>測試測試出 bug
- 開發人員需要修改bug—>開發人員自己測試程式碼—>把程式碼打包—>部署專案到測試伺服器—>測試人員測試功能—>直到符合功能要求。

上面的過程有時會重複多次,大型專案中的專案構建比較複雜,有很多的配置檔案,jar包等,而maven可以幫助我們從上述複雜的工作流程中解脫出來。

maven是一個自動化構建工具。

  • 傳統開發專案的弊端

    • 有很多的模組,模組之間關係手動管理時會非常複雜繁瑣
    • 需要很多第三方jar包的支援,而且需要手動獲取這些第三方jar包,手動管理它們的版本
    • 需要手動管理jar檔案相互之間的依賴,這導致配置程式所需第三方工具就會耗費大量的時間
  • 使用maven可以改進專案的開發與管理

    • maven可以管理jar檔案
    • maven可以自動下載jar包及其文件與原始碼,並且自動管理jar包的版本
    • 可以自動獲取jar包之間的依賴
    • 能夠幫助開發人員編譯檔案、測試程式碼、將專案檔案打包成jar、war檔案
    • 自動部署專案
  • 專案的構建
    構建是面向過程的,其實構建就是一些步驟。maven支援的構建包括:

    • 清理:將之前專案的編譯結果刪除,為重新編譯做好準備
    • 編譯:將java源程式編譯為位元組碼檔案(maven可以實現批量編譯,而javac一次只能編譯一個原始檔)
    • 測試:針對專案中的關鍵點進行測試,確保專案在迭代開發過程中關鍵點的正確性(maven可以實現批量測試程式碼,能夠同時測試多個功能)
    • 報告:在每次測試後以標準的性格記錄和展示結果
    • 打包:將一個包含多個檔案的工程封裝為一個壓縮檔案用於安裝或者部署。java工程對應jar包,web工程對應war包。(也就是說打包是得到專案的結果壓縮檔案,伺服器可以通過該壓縮檔案安裝或者部署專案)
    • 安裝:在Maven環境下特指將打包的結果——jar包或者war包安裝到本地倉庫中。
    • 部署:將打包的結果部署到遠端倉庫或者war包部署到伺服器上執行
  • maven的核心概念

    • POM:project Object Model,即工程物件模型,指的是pom.xml檔案。maven將一個專案當做一個模型來使用,通過改變該檔案的一些配置,可以控制maven構建專案的整個過程,並且能夠管理依賴。因此對maven專案的所有控制,都通過POM來實現
    • 約定的目錄結構:指的是maven專案的目錄以及檔案的位置都是早已經定義好的(即目錄由maven建立模板,開發人員做一些小的改動)
    • 座標:是一個唯一的字串,用於表示某一唯一資源
    • 依賴管理:管理專案中所有的jar檔案及其相互之間的依賴關係
    • 倉庫管理:倉庫適用於存放資源和依賴的位置
    • 生命週期:使用maven來構建專案的過程(即maven支援的構建步驟),稱為生命週期
    • 外掛和目標:maven在構建專案過程中使用到的工具叫做外掛
    • 繼承
    • 聚合
      這些步驟都可以通過maven命令來實現,而在IDEA中這些操作已經封裝好,可以直接使用maven

Maven的核心概念

  • Maven約定的目錄結構
    maven中約定的目錄結構
    一般情況下,我們習慣上採取的措施是:約定>配置>編碼。maven的pom.xml檔案記錄了關於專案構建各個方面的設定,maven從pom.xml檔案開始,按照約定的目錄編譯、測試、打包、部署、釋出專案。

  • 倉庫

    • 倉庫指的是用於存放maven和專案使用的jar包(依賴)的位置
    • 倉庫的分類
      • 本地倉庫:即個人計算機上的資料夾,存放著各種jar包(其實這些jar包在我們的專案中被稱為工具或者依賴,但他們其實也是一個個大大小小的專案)
      • 遠端倉庫:指的是網際網路上的公共倉庫,其中包含三類
        (a ) 中央倉庫:最權威的、所有開發人員共享、集中使用的倉庫,地址為https://repo.maven.apache.org
        (b ) 中央倉庫的映象:是中央倉庫的備份,在各大洲重要城市都存在映象
        (c ) 私服:公司內部,區域網中使用的倉庫
      • 倉庫的使用
        maven的使用不需要人為的干預,由maven自動實現。在使用時,maven會首先查詢本地倉庫,隨後是私服,最後是映象和中央倉庫
  • 外掛和目標
    maven工具在執行操作時需要使用到外掛(java類以jar包的形式存在)來完成一些操作。這些外掛會由maven預設從中央倉庫下載到本地倉庫。當然本地倉庫的位置是可以修改的,開發人員可以通過修改pom檔案中的<localRepository>來實現倉庫位置的修改。
    由maven編譯完成的位元組碼檔案將被存放在專案根目錄下的target結果檔案中

  • POM

  1. POM指的是maven中的pom.xml檔案,下面是pom檔案中的一些基本配置
    • <modelVersion>,是maven模型的版本,對於maven2和maven3來說,他只能是4.0.0
    • groupId,指的是組織id,一般為公司域名的倒寫 + 專案名稱,如com.alibaba.apolo
    • artifactId,是指專案id
    • version,指的是專案的版本號,通常使用三位數字表示
    • packaging,指專案打包的目的型別,可以為jar、war、rar、ear、pom等,預設為jar
    • 座標,由groupIdartifactIdversion三個元素共同生成一個maven專案的基本座標。這個座標可以用於唯一定位到該專案,也決定了該專案在倉庫中的路徑和名稱
  2. 依賴
    在pom檔案中使用<dependencies><dependency>來引入依賴,相當於java中的import
    maven的一個重要作用為管理jar包,為了專案可以構建執行,不可避免的需要引入很多的jar包來幫助完成。這些jar包在maven中被稱為依賴。由<dependency>來配置。而依賴的配置就是通過座標來實現的。這樣不難看出maven將所有的jar包都當做專案來對待
  3. 配置屬性
    <properties>標籤,是用來定義一些maven中的屬性的,如project.build.sourceEncoding
  4. 構建
    <build>標籤,表示與構建相關的一些配置,如設定編譯外掛的jdk版本等設定
  5. 繼承
    parent,在maven中如果有多個模組都需要宣告相同的配置(如groupId、version等),也有類似於java的繼承機制。那就是可以使用parent標籤宣告要繼承的父工程的pom配置
  6. 聚合
    modules。在maven的多模組開發中,為了統一構建整個專案的所有模組,可以額外提供一個打包方式為pom的模組,並在其中適用<modules>標籤聚合其他模組。這樣就可以通過本模組自動識別其他模組之間的依賴關係來構建模組了
  • Maven的生命週期、命令和外掛
    • maven的生命週期:即為maven專案構建的整個過程。即清理、編譯、測試、報告、打包、安裝、部署等步驟。
    • maven的命令:maven對所有的步驟都提供了相應的命令,通過使用這些命令,可以完成maven生命週期各個階段的執行。
      • mvn clean,即清理,會刪除原本編譯和測試的結果目錄(即target),但是已經install到本地倉庫的依賴並不會因此被刪除。所以通過時間的推移,本地倉庫中的依賴越來越多,會形成開發人員自己的依賴庫。
      • mvn compile,編譯,會在專案根目錄下建立target檔案,用於存放編譯後的位元組碼檔案
      • mvn test-compile,編譯測試程式,同樣存放在target資料夾下
      • mvn test,測試,會生成目錄surefire-reports,儲存測試結果
      • mvn package,打包主程式,按照pom.xml檔案中的配置將其打包為指定形式的壓縮檔案
      • mvn install,安裝主程式,會將本工程打包,並按照pom檔案中的座標存放在本地倉庫中
      • mvn deploy,部署主程式,打包並儲存在私服和本地倉庫,還會自動把專案部署到web容器中
    • maven外掛
      maven命令執行時,真正完成功能的是外掛。使用<plugin>和座標來配置外掛

maven依賴管理

maven的依賴範圍使用<scope>來配置,即

<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.11</version>
	<scope>test</scope>
</dependency>
  • scope的值有compile、test、provided。表示依賴起作用的範圍(jar包在maven構建專案的那個步驟中生效),如上面程式碼中表示junit4.0依賴只在測試步驟中生效,在編譯、打包等過程中都不會用到這個依賴。
  • 在maven中,依賴的預設作用範圍為compile,這些範圍的含義為:
    • complie,指在maven構建專案的所有環節都需要該依賴的存在,為maven構建專案的預設依賴範圍
    • test:只在測試程式中有效,因此在maven構建此專案的其他任何環節都不需要此依賴的參與
    • provided:在編譯測試時會需要提供該依賴,而打包、安裝等環節則不需要該依賴包的存在(provided可以理解為在打包、安裝等環節不會將這些依賴拷貝到target資料夾中,而在伺服器部署此專案的時候,會由部署專案的人員提供所需依賴),如servlet依賴,只需要在編譯測試程式中使用該依賴,而在部署的時候會由伺服器提供相關依賴。

maven的常用操作

  • maven的屬性設定
    在pom檔案中的<properties>標籤中配置的屬性,如:
<properties>
	<project.build.sourceEncoding></project.build.sourceEncoding> ##用於配置編碼
	<maven.compiler.source></maven.compiler.source> ##用於設定編譯的jdk版本
	<maven.compiler.target></maven.compiler.target> ##用於設定執行專案的jdk版本
</properties>
  • maven中的全域性變數
    全域性變數為在<properties>中自定義的屬性
    • <properties>中使用自定義標籤配置全域性變數
    • 在pom檔案的其他位置使用${全域性變數名}使用全域性變數
      全域性變數一般會用於定義依賴的版本號等會複用多次的字串
<properties>
	<spring.version>5.2.5</spring.version>
</properties>

<dependency>
	<version>${spring.version}</version>
</dependency>
  • 指定資源外掛
    在沒有指定資源外掛時,使用maven編譯程式碼只會將resources檔案中的配置檔案拷貝到target/classes檔案下,而對於java資料夾下的非java檔案不做處理。但是對於一些需要在java檔案中新增配置檔案的情況(如MyBatis的Mapper檔案),就需要使用資源外掛來將這些檔案也拷貝到target中
<build>
	<resources>
		<resource>
			<directory>src/main/java</directory>
			<includes>
				<include>**/*.xml</include>
				<include>**/*.properties</include>
			</includes>
			<filtering>false</filtering>
		</resource>
	<resources>

</build>