1. 程式人生 > 其它 >Maven篇-一篇文章,快速入門Maven

Maven篇-一篇文章,快速入門Maven

Maven簡介
Maven的需求
目前技術在開發中存在的問題

一個專案就是一個工程
如果專案非常龐大,就不適合繼續使用package來劃分模組。最好是每一個模組對應一 個工程,利於分工協作。

藉助於Maven就可以將一個專案拆分成多個工程。

專案中的jar包必須手動“複製”、“貼上”到WEB-INF/lib目錄下
帶來的問題是:同樣的jar包檔案重複出現在不同的專案工程中, 一方面浪費儲存空間,另外也讓工程比較臃腫。

藉助Maven ,可以將jar包僅僅儲存在“倉庫”中,有需要使用的工程"引用”這個檔案介面,並鈽需要真的把jar包複製過來。

jar包需要別人替我們準備好,或到官網下載
不同技術的官網提供jar包下載的形式是五花八門的。

有些技術的官網就是通過Maven或SVN等專門的工具來提供下載的。

如果是以不規範的方式下載的jar包,那麼其中的內容很可能也是不規範的。

藉助於Maven可以以一種規範的方式下載jar包。因為所有知名框架或第三方工具的jar包以及按照統一-的規範存放在 了Maven的中央倉庫中

以規範的方式下載的jar包,內容也是可靠的。

Tips: "統一的規範"不僅是對T開發領域非常重要,對於整個人類社會都是非常重要的。

一個jar包依賴的其他jar包需要自己手動加入到專案中
FileUpload元件–>IO元件。 commons-fileupload-1.3.jar依賴於commons-io-2.0.1jar

如果所有jar包之間的依賴關係都需要程式設計師自己非常清楚的瞭解,那麼就會極大的增加學習成本。

Maven會自動將被依賴的jar包匯入進來。

Maven的概述
Maven是Apache軟體基金會組織維護的一款自動化構建工具。主要有兩個作用:

maven工程對jar包的管理過程
專案的一鍵構建
構建
概念:以“java原檔案”、“框架配置檔案”、“JSP”、“HTML”、“圖片”等資源為“原材料”,去“生產”一個可以執行的專案過程

其中包括:編譯、部署、搭建

編譯:Java原始檔[User.java]-→編譯- +Class位元組碼檔案[User.class]- +交給JVM去執行

部署:一個BS專案最終執行的並不是動態Web工程本身,而是這個動態Web工程"編譯的結果”

一個形象的比喻:生的雞 -> 處理 -> 熟的雞

​ 動態Web工程 -> 編譯、部署 -> 編譯結果

圖解編譯結果與動態Web工程的區別:


開發過程中,所有的路徑或配置檔案中配置的類路徑等都是以編譯結果的目錄結構為標準的

其中:


被稱為執行時環境,並不會載入到編譯結果中

構建過程的各個環節

清理:將以前編譯得到的舊的class位元組碼檔案刪除,為下一-次編譯做準備
編譯:將Java源程式程式設計成class位元組碼檔案
測試:自動測試,自動呼叫junit程式
報告:測試程式執行的結果
打包:動態Web_ I程打war包, Java工程打jar包
安裝: Maven特定的概念一將打包得到的檔案複製到 "倉庫”中的指定位置
部署:將動態Web.工程生成的war包複製到Servlet容器的指定目錄下,使其可以執行

自動化構建

安裝Maven核心程式
檢查JAVA_HOME環境變數, maven本身就是java寫的,所以要求必須安裝JDK


下載並解壓 maven 安裝程式 ,放在一個非中文無空格路徑下

配置Maven相關的環境變數


驗證是否安裝成功,在cmd中執行mvn -v命令

第一個Maven工程(原生Maven)
建立約定的目錄結構
目錄結構
Hello 工程名
|---src 原始碼
|---|---main 放主程式
|---|---|---java 存放java原始檔
|---|---|---resources 存放框架或其他工具的配置檔案
|---|---test 存放測試程式
|---|---|---java 存放java原始檔
|---|---|---resources 存放框架或其他工具的配置檔案
|---pom.xml Maven的核心配置檔案

手動建立時為什麼要遵守約定的目錄結構?

Maven要負責我們這個專案的自動化構建,以編譯為例, Maven要想自動進行編譯,那麼它必須知道Java原始檔儲存在哪裡

而,我們自定義的東西要想讓框架知道或工具知道,有兩種方式

通過配置的方式告訴框架
按照框架約定的來建立
編寫pom.xml
<?xml version="1.0" ?>
<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.atguigu.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>

<name>Hello</name>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

在src/main/java/com/atguigu/maven目錄下新建檔案Hello.java
package com.atguigu.maven;
public class Hello {
public String sayHello(String name){
return "Hello "+name+"!";
}
}

在/src/test/java/com/atguigu/maven目錄下新建測試檔案HelloTest.java
package com.atguigu.maven;
import org.junit.Test;
import static junit.framework.Assert.*;
public class HelloTest {
@Test
public void testHello(){
Hello hello = new Hello();
String results = hello.sayHello("litingwei");
assertEquals("Hello litingwei!",results);
}
}

在命令列中執行基本命令
mvn compile 編譯
mvn clean 清理
mvn test 測試
mvn package 打包

注意:執行Maven命令時一定要進入pom.xml檔案所在的目錄!

Maven的核心概念
Maven目錄結構
目錄結構
Hello 工程名
|---src 原始碼
|---|---main 放主程式
|---|---|---java 存放java原始檔
|---|---|---resources 存放框架或其他工具的配置檔案
|---|---test 存放測試程式
|---|---|---java 存放java原始檔
|---|---|---resources 存放框架或其他工具的配置檔案
|---pom.xml Maven的核心配置檔案

Maven常用命令
mvn clean:將target目錄刪除,但是已經 install 到倉庫裡的包不會刪除
mvn compile:編譯主程式
mvn test-compile:編譯測試程式
mvn test:執行測試
mvn package:打包
mvn install:安裝
mvn deploy:部署、生成站點
maven工程對jar包的管理過程
①Maven的核心程式中僅僅定義了抽象的生命週期,但是具體的工作必須由特定的外掛來完成。而外掛本身並不包含在Maven的核心程式中。
②當我們執行的Maven命令需要用到某些外掛時, Maven核心程式會首先到本地倉庫中查詢。
③本地倉庫的預設位置: C:\USERS\USERNAME\.m2\repository
④Maven核心程式如果在本地倉庫中找不到需要的外掛,那麼它會自動連線外網,到中央倉庫下載
⑤如果此時無法連線外網,則構建失敗。
⑥修改預設本地倉庫的位置可以讓Maven核心程式到我們事先準備好的目錄下查詢外掛
[1]找到Maven解壓目錄\confsettings.xml
[2]在settings.xm|檔案中找到localRepository標籤
[3]將<localRepository> /path/to/local/repo</localRepository>從註釋中取出
[4]將標籤體內容修改為已經準備好的Maven倉庫目錄
POM
Project Object Model 專案物件模型

​ DOM Document Object Model 文件物件模型

pom.xml對於Maven工程是核心配置檔案,與構建過程相關的一切設定都在這個檔案中進行配置。重要程度相當於web.xm|對於動態Web工程

座標gav
數學中的座標:

在平面上,使用x、y兩個向量可以唯一的定位平面中的任何一個點
在空間上,使用x、y、z三個向量可以唯一的定位空間中的任何一個點
Maven的座標

使用三個向量在倉庫中唯一定位一個Maven工程

groupid:公司或組織域名的倒序+專案名
com.baidu.projectname
1
artifactid:模組名
version:版本
Maven工程的座標與倉庫中路徑的對應關係

<groupId> org.springframework </groupId>
<artifactId> spring-core </artifactId>
<version>4.0.0.RELEASE </version>

org/springframework/spring-core/4.0.0.RELEASE/spring-core-4.0.0.RELEASE.jar

倉庫repository
倉庫的分類

本地倉庫:當前電腦上部署的倉庫目錄,為當前電腦上多有Maven工程服務

遠端倉庫

私服:搭建在區域網環境中,為區域網範圍內的所有Maven工程服務


中央倉庫:架設在Internet上,為全世界所有Maven工程服務
中央倉庫映象:為了分擔中央倉庫的流量,提升使用者訪問速度

倉庫中儲存的內容:Maven工程

Maven自身所需的外掛
第三方框架或工具的jar包
自己開發的Maven工程
依賴【初步】
Maven解析依賴資訊時會到本地倉庫中查詢被依賴的jar包。對於我們自己開發的Maven工程,使用mvn install命令安裝後就可以進入倉庫。

依賴的範圍


compile範圍依賴
對主程式是否有效:有效
對測試程式是否有效:有效
是否參與打包:參與
是否參與部署:參與
典型例子:spring-core
test範圍依賴
對主程式是否有效:無效
對測試程式是否有效:有效
是否參與打包:不參與
是否參與部署:不參與
典型例子:junit
provided範圍依賴
對主程式是否有效:有效
對測試程式是否有效:有效
是否參與打包:不參與
是否參與部署:不參與
典型例子:servlet-api.jar

生命週期
各個構建環節執行的順序:不能打亂順序,必須按照既定的正確順序來執行
Maven的核心程式中定義了抽象的生命週期,生命週期中各個階段的具體任務是由外掛來完成的
Maven核心程式為了更好的實現自動化構建,按照這一的特點執行生命週期中的各個階段:不論現在要執行生命週期中的哪一個階段,都是從這個生命週期最初的位置開始執行
例如:


外掛與目標
生命週期的各個階段僅僅定義了要執行的任務是什麼
各個階段和外掛的目標是對應的
相似的日標由特定的外掛來完成
可以將目標看作”呼叫外掛功能的命令“

依賴【高階】
依賴的傳遞性

好處:可以傳遞的依賴不必在每個模組工程中都重複宣告,在”最下面”的工程中依賴-次即可。

注意:非compile範圍的依賴不能傳遞。所以在各個工程模組中,如果有需要就得重複宣告依賴。

依賴的排除

需要設定依賴排除的場合


依賴排除的設定方式

<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>

依賴的原則

作用:解決模組工程之間的jar包衝突問題

情景設定一:驗證路徑最短者優先原則


情景設定二:驗證路徑相同時先宣告者優先


統一管理依賴的版本

情景舉例

這裡需要對spring各個jar包的依賴版本進行管理,如需要升級到4.1.1

配置方式

使用properties標籤內使用自定義標籤統一宣告版本號
<properties>
<cvzhanshi.spring.version>4.0.0.RELEASE</cvzhanshi.spring.version>
</properties>

在需要統一版本的位置,使用${自定義標籤名}引用宣告的版本號
<version>${cvzhanshi.spring.versio}</version>

其實properties標籤配合自定義標籤宣告資料的配置並不是只能用於宣告依賴的版本號。凡是需要統一聲明後再弓|用的場合都可以使用

<properties>
<cvzhanshi.spring.version>4.0.0.RELEASE</cvzhanshi.spring.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>


繼承
現狀


需求:統一管理各個模組工程中對junit依賴的版本

解決思路:將junit依賴統一提取到“父”工程中,在子工程中宣告junit依賴時不指定版本,以父工程中統一設定的為準。同時也便於修改

操作步驟

建立一個Maven工程作為父工程。注意:打包的方式為pom
<groupId>com.cvzhanshi.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>

在子工程中宣告對父工程的引用
<!-- 子工程中宣告父工程 -->
<parent>
<groupId>com.cvzhanshi.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>

<!-- 以當前檔案為基準的父工程pom.xml檔案的相對路徑 -->
<relativePath>../Parent/pom.xml</relativePath>
</parent>

將子工程的座標中與父工程座標中重複的內容刪除


在父工程中統一管理junit的依賴

<!-- 配置依賴的管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>

在子工程中刪除junit依賴的版本號部分

注意:配置繼承後,執行安裝命令時要先安裝父工程

聚合
作用:一鍵安裝各個模組工程
配置方式:在一個”總的聚合工程“中配置各個參與聚合的模組
<!-- 配置聚合 -->
<modules>
<!-- 指定各個子工程的相對路徑 -->
<module>../HelloFriend</module>
<module>../MakeFriends</module>
<module>../Hello</module>
</modules>

使用方式:在聚合工程的pom.xml上點右鍵->run as->maven install(eclipse中)
IDEA中使用Maven
在 Idea中配置 Maven
Idea 中也自帶 Maven 外掛,而且我們也可以給自帶的 Maven 外掛進行配置, 所以我們可以使用自帶的 Maven,也可以使用我們安裝的 Maven 核心程式

配置自己安裝的Maven


配置IDEA自帶的Maven外掛
進入idea的安裝目錄

E:\study\Java\soft\idea\ideaIU-2019.2.4.win\plugins\maven\lib\maven3\conf配置setting.xml


1、新增本地倉庫位置

<localRepository>E:\study\Java\maven\apache-maven-3.5.3\repository</localRepository>

2、新增阿里雲倉庫和中央倉庫,方便聯網時下載jar包

<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

<!-- 中央倉庫1 -->
<mirror>
<id>repo1</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://repo1.maven.org/maven2/</url>
</mirror>

<!-- 中央倉庫2 -->
<mirror>
<id>repo2</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://repo2.maven.org/maven2/</url>
</mirror>

3、配置jdk版本

<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>

使用Maven建立Java工程
建立


測試
配置 Maven 的核心配置檔案 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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.cvzhanshi.maven</groupId>
<artifactId>Hello</artifactId>
<version>1.0-SNAPSHOT</version>


<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

在 src/main/java 目錄下建立包並建立 Hello.java 檔案
/**
* @author cVzhanshi
* @create 2021-04-26 1:06
*/
public class Hello {
public String sayHello(String name){
return "Hello "+name+"!";
}
}

在/src/test/java 目錄下建立包並建立 HelloTest.java 檔案
package com.atguigu.maven;
import org.junit.Test;
public class HelloTest {
@Test
public void testHello(){
Hello hello = new Hello();
String maven = hello.sayHello("Maven");
System.out.println(maven);
}
}

使用 Maven 的方式執行 Maven 工程 :


使用Maven建立Java Web工程
建立
選擇Maven->選擇java jdk->勾選Create from archetype->選擇maven-archetype-webapp


填寫GroupId(域名.公司名.專案名)、Artifacted(模組名)

選擇本地maven解壓的路徑、配置檔案


選擇工作空間


建立成功,結構如下


在main底下new兩個Directory:java,resources


點Project Struct,設定原始碼資料夾和資原始檔夾


tomcat部署


啟動tomcat

Idea 中匯入 Maven 專案
點選 Project Structure


點選 Modules→➕→Import Module


找到專案所在的位置


選擇 Import module from external model(從外部模型匯入模組)→Maven →Finish


eclipse中使用Maven
在eclipse中配置 Maven
Eclipse 中預設自帶 Maven 外掛,但是自帶的 Maven 外掛不能修改本地倉庫,所 以通常我們不使用自帶的 Maven,而是使用自己安裝的,在 Eclipse 中配置 Maven 的 步驟如下:

點選 Eclipse 中的 Window→Preferences


點開 Maven 前面的箭頭,選擇 Installations,點選 Add…


點選 Directory…選擇我們安裝的 Maven 核心程式的根目錄,然後點選 Finish


勾上新增的 Maven 核心程式


選擇 Maven 下的 User Settings,在全域性設定哪兒點選 Browse…選擇 Maven 核心程式的配置檔案 settings.xml,本地倉庫會自動變為我們在 settings.xml 檔案中設定的路徑


使用eclipse建立Java專案
點選 File→New→Maven Project,彈出如下視窗


點選 Next,配置座標(GAV)及打包方式,然後點選 Finish


建立完工程之後發現預設的 JDK 的編譯版本與電腦安裝的不符合,在 Maven 的核心配置文 件 settings.xml 檔案中新增以下配置將編譯版本改為 1.8,重啟 Eclipse 即可

<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>


配置 Maven 的核心配置檔案 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
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.atguigu.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

編寫主程式碼
在 src/main/java 目錄下建立包並建立 Hello.java 檔案

package com.cvzhanshi.maven;
public class Hello {
public String sayHello(String name){
return "Hello "+name+"!";
}
}

編寫測試程式碼
在 src/test/java 目錄下建立包並建立 HelloTest.java 檔案

package com.cvzhanshi.maven;
import org.junit.Test;
import static junit.framework.Assert.*;
public class HelloTest {
@Test
public void testHello(){
Hello hello = new Hello();
String results = hello.sayHello("litingwei");
assertEquals("Hello litingwei!",results);
}
}


使用 Maven 的方式執行 Maven 工程
在工程名 Hello 或 pom.xml 上右鍵→Run As 執行 Maven 專案

使用eclipse建立Web工程
建立簡單的 Maven 工程,打包方式為 war 包


建立完成之後因缺少 web.xml 檔案工程出現小紅叉


在工程上右鍵→Build Path→Configure Build Path…


點選 Project Facets 欺騙 Eclipse 當前工程不是 Web 工程,點選應用


再告訴 Eclipse 當前工程是一個 Web 工程,點選應用並關閉


發現 MavenWeb 工程小紅叉消失,並出現了 WebContext 目錄


在 WebContext 下建立 index.jsp 頁面並新增 Tomcat 庫


在 MavenWeb 上右鍵→Run As→Run on Server 部署到 Tomcat 上執行

Eclipse 中匯入 Maven 專案
點選 File→Import…


第一次匯入手動建立的 Maven 專案時,由於專案中沒有 Eclipse 生成的一些檔案, 使用方式一匯入時 Eclipse 認為它不是一個工程


所以必須通過方式二匯入到 Eclipse 中

匯入到 Eclipse 中之後就會生成一些 Eclipse 能識別的檔案


有了這些 Eclipse 能識別的檔案之後以後再往 Eclipse 中匯入的時候選擇方式一和 方式二都可以
————————————————
版權宣告:本文為CSDN博主「cv展示」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/qq_45408390/article/details/116144065