1. 程式人生 > >第四十一章:Maven自動化構建依賴管理工具

第四十一章:Maven自動化構建依賴管理工具

在這裡插入圖片描述

1Maven簡介
Maven是一款自動化“構建”和“依賴”管理的工具。
2提出問題
2.1jar包管理問題
jar包從哪來的?
官網下載
CSND……
51CTO……
……
jar包之間存在依賴關係
A jar包中用到了B jar包中的類,就說A依賴B。jar包之間普遍存在的依賴關係錯綜複雜,極大的增加了我們開發專案時jar包管理的難度。在jar包非常多的時候,手動管理幾乎是不可能的。
spring-core依賴commons-logging
commons-fileupload依賴commons-io
……
各個工程在開發時分別複製相同的jar包
更好的做法是各個工程對同一份jar包進行各自的引用。
2.2專案架構
以之前學習的技術來說,我們開發的都是單一架構的專案。
單一架構;整個專案只有一個工程。
但是,以後我們要開發分散式架構。
分散式架構:一個專案是由很多個工程組成的,而各個工程之間存在下面四種關係:
依賴:由Maven實現
繼承:由Maven實現
聚合:由Maven實現
呼叫:需要藉助其他分散式架構技術實現
Dubbo+Zookeeper組合
SpringBoot+SpringCloud組合
2.3自動化構建
構建的概念
“構建”其實就是以開發時所編寫的程式碼為“原材料”去“生產”出來一個可以執行的專案過程。
我們開發的是工程,但是真正在伺服器上執行的是工程“構建”的結果。
工程→一隻雞
構建→燉熟了
構建結果→可以吃的雞
在沒有具體使用Maven這樣的構建工具前,其實在Eclipse中我們已經不知不覺的進行了構建的操作。
例如:清理、測試、編譯、部署等等。

在這裡插入圖片描述
構建過程中的主要環節
清理:把上一次編譯得到的*.class位元組碼檔案刪除,為下一次編譯做好準備。
編譯:重新將Java源程式編譯為*.class位元組碼檔案。
主體程式編譯
測試程式編譯
測試:執行預先寫好的測試程式對主體程式進行測試
報告:測試結果
打包:將整個工程中的所有程式碼和配置檔案等資源封裝到一個壓縮檔案中,為部署做好準備
Java工程:jar包
Web工程:war包
安裝:在Maven這樣的工具中將打包得到的檔案存放到Maven的倉庫中。
部署:將打包的結果放到伺服器的指定目錄下使其可以執行。
構建工具在自動化部署過程中的作用

在這裡插入圖片描述
3Maven工具的使用
3.1工作機制

在這裡插入圖片描述
3.2解壓配置Maven的核心程式
apache-maven-3.5.4-bin.zip解壓到非中文沒有空格的目錄下。
配置環境變數
path
套路:bin目錄

在這裡插入圖片描述
MAVEN_HOME
套路:bin目錄的上一級目錄
在這裡插入圖片描述

※驗證:在命令列檢視Maven的版本
mvn -v
在這裡插入圖片描述

※注意:當前系統中必須正確安裝了JDK

在這裡插入圖片描述

3.3核心程式配置
配置檔案路徑
MAVEN_HOME/conf/settings.xml

例如:MAVEN_HOME=D:\installations\apache\apache-maven-3.5.4
那麼settings.xml的路徑是:
D:\installations\apache\apache-maven-3.5.4\conf\settings.xml
settings.xml配置檔案結構,還沒有配置

<?xml version="1.0" encoding="UTF-8"?>

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <!-- localRepository
  我們在這裡配置本地倉庫位置
  <localRepository>/path/to/local/repo</localRepository>
  -->
  <pluginGroups></pluginGroups>
  <proxies></proxies>

  <servers></servers>
  
  <!-- 在這裡配置阿里雲映象伺服器地址 -->
  <mirrors></mirrors>
  
  <!-- 指定Maven工程的JDK版本 -->
  <profiles></profiles>
</settings>

配置本地倉庫路徑
一定要記得從註釋中拿出來,否則無效!!!

  <!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository
  <localRepository>/path/to/local/repo</localRepository>
  -->
  <!--配置自己的路徑-->
<localRepository>D:\RepMaven0906</localRepository>

配置阿里雲映象伺服器地址
注意:一定到配置到mirrors標籤的裡面

<mirrors>
<!-- mirror
 | Specifies a repository mirror site to use instead of a given repository. The repository that
 | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
 | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
 |
<mirror>
  <id>mirrorId</id>
  <mirrorOf>repositoryId</mirrorOf>
  <name>Human Readable Name for this Mirror.</name>
  <url>http://my.repository.com/repo/path</url>
</mirror>
 -->
 <!--這個是固定不變的-->
<mirror>
	<id>nexus-aliyun</id>
	<mirrorOf>central</mirrorOf>
	<name>Nexus aliyun</name>
	<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>

配置Maven工程的JDK版本
一定要配置到profiles標籤的裡面!!!可以直接複製

<profiles>
   <profile>
      <id>jdk-1.8</id>
      <activation>
		<activeByDefault>true</activeByDefault>
        <jdk>1.8</jdk>
      </activation>
	  <properties>
		<maven.compiler.source>1.8</maven.compiler.source>
		<maven.compiler.target>1.8</maven.compiler.target>
		<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
	  </properties>
    </profile>
</profiles>

注意:Maven工程能夠使用的JDK版本會受到Maven核心程式版本的限制。

3.4Eclipse中設定Maven外掛
要設定的點
更換工作區後需要重新設定

在這裡插入圖片描述
指定Maven核心程式的位置

在這裡插入圖片描述
指定settings.xml配置檔案路徑
在這裡插入圖片描述

4單個的Maven工程
4.1建立打包方式為jar的Maven工程

在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述

Finish
4.2建立打包方式為war的Maven工程
總體步驟和建立jar包工程一致,只是在選擇打包方式的時候選擇war。

在這裡插入圖片描述

然後需要生成web.xml,做法是工程→右鍵

在這裡插入圖片描述
4.3建立打包方式為pom的Maven工程
建立過程和前面基本一致,只是把打包方式改成pom即可。這樣的工程中不寫Java程式碼、框架配置檔案、頁面等等,而是管理其他Maven工程。

在這裡插入圖片描述

在這裡插入圖片描述

4.4相關概念
座標:在Maven倉庫的眾多jar包中唯一的定位到某一個jar包
groupId:公司或組織域名倒序+專案名稱
artifactId:模組名稱(當前正在建立的工程的工程名)
version:版本
約定的目錄結構
Maven為了實現自動化構建,設計約定的目錄結構,基於約定的目錄結構,Maven就知道在工程中Java原始檔位置、配置檔案位置、測試程式的位置等等,進而可以對原始檔進行編譯、執行、載入讀取配置檔案以及執行測試。

在這裡插入圖片描述

POM
Project Object Model工程物件模型
Maven對每一個Maven工程進行構建環節操作和依賴的管理都是基於pom.xml
生命週期
特點:在每一個生命週期內部,執行任何一個環節,Maven都會從整個生命週期最初的位置開始執行。所以,假設我們想執行下面幾個操作:
compile
test
package
install
那麼,直接執行install就可以了,compile、test、package都會包含在install執行的過程中。
Maven這樣設計的目的是為了進一步提高構建過程的自動化程度,想構建的時候不必過問具體的構建過程,而是直接執行最終步驟即可。
Clean生命週期[瞭解]
pre-clean
clean
post-clean
Default生命週期[瞭解]
最重要的生命週期,包含了主要的構建環節
……
compile
……
test-compile
……
test
……
package
……
install
deploy
Site生命週期[瞭解]
pre-site
site
post-site
site-deploy
4.5常用Maven命令
命令列執行
第一步:開啟命令列視窗
第二步:進入pom.xml所在的目錄
D:\workstation\Station180906\Pro14_MavenSingleProject
第三步:執行Maven命令
mvn clean
mvn compile
mvn test
mvn package
mvn install
mvn deploy

執行效果參考如下:

在這裡插入圖片描述

Eclipse執行

在這裡插入圖片描述
在pom.xml檔案上點右鍵→Run As→Maven clean等等
執行效果參考如下:

在這裡插入圖片描述

如果想要執行沒有提供的Maven命令,點選Maven build…

在這裡插入圖片描述

在這裡插入圖片描述
如果點選Maven build可以直接執行以前執行過的Maven命令。
具體命令介紹
mvn clean
清理
mvn compile
編譯主程式
mvn test-compile
編譯測試程式
mvn test
執行junit測試程式

在這裡插入圖片描述
mvn package
執行打包操作。Java工程打jar包,Web工程打war包。生成的jar包或war包會放在target目錄下。

5Maven jar包下載失敗
5.1現象表現
表現形式不侷限於這一種,但是這是最典型、最直接的表現。

在這裡插入圖片描述

另一種表現形式:
在這裡插入圖片描述

*.lastUpdated結尾的檔案:Maven在下載jar包的過程中檔名都是以lastUpdated結尾的,表示這個檔案正在下載。但是如果下載失敗,那麼Maven不會自動刪除lastUpdated字尾。
下次重新下載時,Maven會忽略以lastUpdated為字尾的檔案,也不會重新下載。我們如果不進行人為干預、處理,那麼這些下載失敗的jar包就會一直保持這個狀態。
人為干預的方式是:手動把lastUpdated結尾的檔案刪除,讓Maven重新下載。而這個操作使用clearLastUpdated.bat指令碼後可以提高效率。

5.2clearLastUpdated.bat指令碼使用
第一步
將clearLastUpdated.bat檔案放在Maven倉庫的根目錄下。
第二步
使用文字編輯器開啟clearLastUpdated.bat檔案,如果沒有文字編輯器使用記事本也一樣

在這裡插入圖片描述
第三步
雙擊開啟,按照提示使用

在這裡插入圖片描述
有可能遇到的問題
cls
@ECHO OFF
SET CLEAR_PATH=D:
SET CLEAR_DIR=D:\Program Files\maven

在這裡插入圖片描述

解決辦法:讓Maven倉庫的路徑沒有空格!!!

5.3基本思路
將下載失敗的jar包刪除,讓Eclipse重新下載。
找到jar包的儲存位置
jar包→右鍵→properties→複製路徑
刪除
點選工程→alt+F5→OK
如果再次下載的jar包還是損壞的,就再試一次

5.4檔案校驗工具的使用
原理:雜湊加密演算法
雜湊演算法中包含很多具體演算法,具體演算法之間主要的區別是加密強度不同。具體加密演算法包括:MD5、CRC32、SHA1等等
特點1:不可逆,不能通過密文反推出明文。
特點2:在具體加密演算法確定的前提下,不管輸入的資料體積多麼龐大或多麼小,輸出的資料長度固定。例如:MD5加密的結果固定是32位,不管輸入的是1KB的資料還是100T的資料輸出的結果都是32位。
特點3:在具體加密演算法確定的前提下,輸入資料有細微改變,輸出資料跟著改變;輸入資料不變,任何時候執行加密結果都一樣。
校驗檔案原理
在這裡插入圖片描述
基於雜湊加密的檔案校驗工具使用

在這裡插入圖片描述

在這裡插入圖片描述

6工程之間的關係
6.1依賴
概念
A工程(jar包)用到了B工程(jar包)中的類,那麼A依賴B。
Maven工程中通過座標配置依賴資訊

<!-- 配置junit依賴 -->
<dependencies>
	<!-- 具體依賴 -->
	<dependency>
		<!-- junit的jar包的座標 -->
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.12</version>
		<!-- 依賴的範圍 -->
		<scope>test</scope>
	</dependency>
	<!-- 依賴Spring-core -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-core</artifactId>
		<version>4.0.0.RELEASE</version>
	</dependency>
</dependencies>

在工程間建立依賴關係

<dependencies>
	<!-- 配置對Dao工程的依賴 -->
	<dependency>
		<groupId>com.maven</groupId>
		<artifactId>Dependency_Dao</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</dependency>
</dependencies>

根據座標在本地倉庫中查詢jar包的方式

		<groupId>com.maven</groupId>
		<artifactId>Dependency_Dao</artifactId>
		<version>0.0.1-SNAPSHOT</version>

Maven倉庫的根目錄/com/maven/Dependency_Dao/0.0.1-SNAPSHOT/Pro18_Dependency_Dao-0.0.1-SNAPSHOT.jar

Maven根據依賴的jar包的座標到Maven本地倉庫中查詢jar包,如果找不到就無法解析依賴資訊。
Maven的install命令
將Maven工程安裝到本地倉庫
依賴的傳遞性
A依賴B,B依賴C,A是否可以不配置依賴資訊直接使用C?可以使用。但是需要參照依賴範圍:
compile範圍:可以傳遞
test範圍:不能傳遞
provided範圍:不能傳遞
依賴的範圍
compile:預設的依賴範圍。
對main目錄下的程式碼:有效
對test目錄下的程式碼:有效
部署到伺服器:有效
test:專門用於測試的jar包
對main目錄下的程式碼:無效
對test目錄下的程式碼:有效
部署到伺服器:不參與
provided:表示“已提供”的jar包
對main目錄下的程式碼:有效
對test目錄下的程式碼:有效
部署到伺服器:不參與

	<dependency>
		<groupId>javax.servlet</groupId>
		<artifactId>servlet-api</artifactId>
		<version>2.4</version>
		<scope>provided</scope>
	</dependency>

開發階段:有效
部署階段:無效
依賴傳遞的排除
作用:在依賴一個jar包的時候,將這個jar包傳遞給我們的某個jar包排除

	<!-- 依賴Spring-core -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-core</artifactId>
		<version>4.0.0.RELEASE</version>
		<scope>compile</scope>
		<!-- 配置依賴的排除 -->
		<exclusions>
			<exclusion>
				<groupId>commons-logging</groupId>
				<artifactId>commons-logging</artifactId>
			</exclusion>
		</exclusions>
	</dependency>

6.2繼承
概念
工程A繼承工程B。
作用
在父工程中統一管理依賴資訊。
要求
作為父工程的Maven工程打包方式必須是pom。
測試

在這裡插入圖片描述
在這裡插入圖片描述
在子工程中指定父工程

<!-- 指定當前工程的父工程 -->
<parent>
	<groupId>com</groupId>
	<artifactId>Parent</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	
	<!-- 父工程的pom.xml檔案的相對路徑 -->
	<relativePath>../Parent/pom.xml</relativePath>
</parent>

PS:此時子工程中會提示groupid和version相對於父工程重複,可以刪除。
對依賴進行管理
父工程

<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>4.0.0.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>4.0.0.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>4.0.0.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-expression</artifactId>
			<version>4.0.0.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>4.0.0.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>4.0.0.RELEASE</version>
		</dependency>
	</dependencies>
</dependencyManagement>

子工程

<dependencies>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-core</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-beans</artifactId>
	</dependency>
</dependencies>

依賴統一管理的好處
開發人員在需要某個jar包的依賴資訊時不必到網上去找,直接從父工程中複製進來即可。整個專案中使用的依賴資訊有一個統一的來源,不會變的雜亂。
如果需要統一修改一組jar包的版本時,不必到各個子工程中逐個修改,在父工程中統一修改即可。一處修改,處處生效。

配置properties

<!-- 配置properties -->
<properties>
	<atguigu.spring.version>4.0.0.RELEASE</atguigu.spring.version>
</properties>
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-core</artifactId>
				<version>${atguigu.spring.version}</version>
			</dependency>
			……

6.3聚合
概念
將各個模組工程聚合在一起形成專案的整體。
作用
讓專案模組化程度更高,結構更清晰。
一鍵安裝。
測試

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
聚合的配置

<!-- 配置聚合 -->
<modules>
	<module>../One/pom.xml</module>
	<module>../Two/pom.xml</module>
	<module>../Three/pom.xml</module>
</modules>

對聚合工程執行install命令
能夠自動理順安裝順序

在這裡插入圖片描述

7Maven酷站
https://mvnrepository.com/
http://maven.aliyun.com/mvn/search