【Java】項目管理工具Maven的安裝與使用

文章目錄

  • 1. Maven概述
  • 2. Maven的下載與安裝
    • 2.1 下載
    • 2.2 安裝
  • 3. Maven倉庫配置
    • 3.1 修改本地倉庫配置
    • 3.2 修改遠程倉庫配置
    • 3.3 修改后的settings.xml
  • 4. 使用Maven創建項目
    • 4.1 手工創建Java項目
    • 4.2 原型創建Java項目
    • 4.3 原型創建Web項目
  • 5. Tomcat啟動Web項目
    • 5.1 使用Tomcat插件啟動項目
    • 5.2 本地安裝Tomcat啟動項目
      • 5.2.1 下載并安裝Tomcat
      • 5.2.2 本地Tomcat啟動項目
  • 6. Maven的依賴管理
    • 6.1 依賴配置
    • 6.2 依賴傳遞
      • 6.2.1 依賴傳遞演示
      • 6.2.2 依賴傳遞沖突
    • 6.3 可選依賴
    • 6.4 排除依賴
    • 6.5 依賴范圍
  • 7. 生命周期與插件
    • 7.1 構建生命周期
    • 7.2 插件

1. Maven概述

1.Maven簡介:maven是一個項目管理工具,將項目開發和管理過程抽象成一個項目對象模型(POM)。

注:POM(Project Object Model):項目對象模型

maven管理項目流程如下:

在這里插入圖片描述

2.Maven的作用

  • 項目構建:提供標準的、跨平臺的自動化項目構建方式
  • 依賴管理:方便快捷的管理項目依賴的資源(jar包),避免資源間的版本沖突問題
  • 統一開發結構:提供標準的、統一的項目結構

3.Maven倉庫

  • 倉庫:用于存儲資源, 包含各種jar包
  • 倉庫分類:
    • 本地倉庫:自己電腦上存儲資源的倉庫,連接遠程倉庫獲取資源
    • 遠程倉庫:非本機電腦上的倉庫,為本地倉庫提供資源
      • 中央倉庫:Maven團隊維護, 存儲所有資源的倉庫
      • 私服:部門/公司范圍內存儲資源的倉庫,從中央倉庫獲取資源
  • 私服的作用:
    • 保存具有版權的資源, 包含購買或自主研發的jar(中央倉庫中的jar都是開源的, 不能存儲具有版權的資源)
    • 一定范圍內共享資源,僅對內部開放,不對外共享

在這里插入圖片描述

4.Maven坐標

  • 坐標概念:Maven中的坐標用于描述倉庫中資源的位置
  • 坐標的主要組成
    • groupId:組織id,定義當前Maven項目隸屬組織名稱(通常是域名反寫, 例如:org.mybatis)
    • artifactld:項目id,定義當前Maven項目名稱(通常是模塊名稱, 例如CRM、SMS)
    • version:版本號,定義當前項目版本號
  • 坐標的作用:使用唯一標識,唯一性定位資源位置,通過該標識可以將資源的識別與下載工作交由機器完成

2. Maven的下載與安裝

2.1 下載

官網下載:

  • 最新版本:https://maven.apache.org/download.cgi
  • 歷史版本:https://archive.apache.org/dist/maven/maven-3/

最新版本:

在這里插入圖片描述

歷史版本:

在這里插入圖片描述

2.2 安裝

此處下載得到最新的 apache-maven-3.9.3-bin.zip 安裝包,放在任意一個文件夾下,右鍵解壓到當前文件夾。

此處我解壓到 E:\Applications\apache-maven-3.9.3

在這里插入圖片描述

配置環境變量:

1.新建 MAVEN_HOME 環境變量,變量值為maven安裝路徑

  • 變量名:MAVEN_HOME
  • 變量值:E:\Applications\apache-maven-3.9.3

在這里插入圖片描述

2.修改 Path 變量

在 系統變量 中選中 Path 變量后,點擊 “編輯” 按鈕,隨后點擊“新建”,輸入 %MAVEN_HOME%\bin 即可

在這里插入圖片描述

3.輸入命令,測試是否安裝成功

mvn -v

出現以下界面,表示安裝成功:

在這里插入圖片描述

3. Maven倉庫配置

3.1 修改本地倉庫配置

本地倉庫:maven啟動后,會自動保存下載的資源到本地倉庫

  • 默認位置:登錄用戶名所在目錄的.m2文件夾中,如 C:\Users\Admin\.m2\repository(默認保存到C盤)
<localRepository>${user.name}\.m2\repository</localRepository>
  • 自定義位置:修改本地倉庫位置為指定路徑,如 D:\repository
<localRepository>D:\repository</localRepository>

由于默認保存到C盤,所以要修改本地倉庫配置,步驟如下:

1.找到安裝包的conf文件夾下的settings.xml文件,使用 vscode 或者其他工具打開它

在這里插入圖片描述

2.Ctrl+F搜索 localRepository,復制剛剛的自定義配置到這里即可

在這里插入圖片描述

3.2 修改遠程倉庫配置

遠程倉庫:為本地倉庫提供資源的倉庫,資源從遠程倉庫下載到本地倉庫。

1.默認遠程倉庫:

<repositories><repository><id>central</id><name>Central Repository</name><url>https://repo.maven.apache.org/maven2</url><layout>default</layout><snapshots><enabled>false</enabled></snapshots></repository>
</repositories>

2.鏡像遠程倉庫:

鏡像倉庫配置:

  • id:鏡像的唯一標識,用來區分不同的mirror元素
  • mirrorOf:對哪個倉庫進行鏡像,簡單來說就是替代哪個倉庫,此處填為central,也就是替代了默認遠程倉庫
  • name:鏡像名稱
  • url:鏡像URL

修改鏡像倉庫地址:修改鏡像倉庫地址是為了加快下載速度,此處修改為阿里云鏡像,遠程倉庫的地址從國外轉到了國內,下載速度自然就快了

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

依然還是修改E:\Applications\apache-maven-3.9.3\conf文件夾下的settings.xml文件:

在這里插入圖片描述

3.3 修改后的settings.xml

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd"><localRepository>D:\repository</localRepository><mirrors><mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url></mirror></mirrors>
</settings>

4. 使用Maven創建項目

Maven工程的目錄結構如下:左邊是Java項目,右邊是Web項目。

可以發現Web項目就是比Java項目多了個webapp目錄

在這里插入圖片描述

4.1 手工創建Java項目

由于 Idea 創建的maven一開始是沒有 settings.xml 的,所以每次創建新 maven工程的時候,會使用默認的 settings.xml配置,也就是使用默認的本地倉庫地址和遠程倉庫地地址。

  • 默認本地倉庫地址:${user.name}\.m2\repository
  • 默認遠程倉庫地址:https://repo.maven.apache.org/maven2

前置工作:將上述修改好的 apache-maven-3.9.3\conf\settings.xml文件,復制到${user.name}\.m2\repository文件夾下,則每次創建新 maven項目,會默認使用該配置,可以解決剛啟動項目時,下載jar包速度慢的問題。

在這里插入圖片描述

1.New Project,創建新項目

在這里插入圖片描述

2.填寫項目名稱等信息,Build System勾選Maven

在這里插入圖片描述

手工創建Java項目,得到的Maven工程結構如下:

在這里插入圖片描述

3.修改項目的maven配置,打開 Settings并在搜索框輸入maven,修改以下內容即可

注:每次創建或導入一個maven項目的時候,maven配置都會使用默認配置,因此每次都需要重新修改它的maven配置

在這里插入圖片描述

4.2 原型創建Java項目

ArcheType選擇org.apache.maven.archetypes:maven-archetype-quickstart,就能使用原型創建Java工程項目

注:使用原型創建maven項目的方式,會下載一些jar包,所以項目構建需要等待一段時間。

在這里插入圖片描述

使用原型創建Java項目,得到的Maven工程結構如下:

在這里插入圖片描述

4.3 原型創建Web項目

ArcheType:選擇org.apache.maven.archetypes:maven-archetype-webapp,就能使用原型創建 Web工程項目

注:使用原型創建maven項目的方式,會下載一些jar包,所以項目構建需要等待一段時間。

在這里插入圖片描述

使用原型創建Web項目,得到的Maven工程結構如下:

在這里插入圖片描述

以該Web項目為例,由于其結構缺失,需要手動補充文件夾,使其稱為完整的Web項目工程:

  • main目錄下新建java目錄,并將其標記為 Sources Root
  • src目錄下新建test目錄,并在test目錄下新建java和resources
  • 標記test目錄下的java為 Test Sources Root,resources為Test Resources Root

最終Web項目結構如下:

在這里插入圖片描述

5. Tomcat啟動Web項目

5.1 使用Tomcat插件啟動項目

mvnrepository官網地址:https://mvnrepository.com/

1.搜索框中輸入tomcat maven,點擊Search進行搜索,找到 Apache Tomcat Maven Plugin :: Common API,然后點擊org.apache.tomcat.maven鏈接進入

注意:是點擊org.apache.tomcat.maven藍色鏈接,而不是點擊 Apache Tomcat Maven Plugin :: Common API黑體字,點擊黑體字進去的鏈接是找不到 tomcat 插件的

在這里插入圖片描述

在這里插入圖片描述

2.Apache Tomcat Maven Plugin :: Tomcat 7.x,點擊鏈接進入,繼續選擇一個版本點擊進入

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

3.得到了Tomcat7插件的 groupId、artifactId、version,并復制到pom.xml中,就完成了插件的安裝

在這里插入圖片描述

4.最終得到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 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>maven-project</artifactId><packaging>war</packaging> <!--打包方式為war包--><version>1.0-SNAPSHOT</version><name>maven-project Maven Webapp</name><url>http://maven.apache.org</url><!--構建項目需要的信息--><build><!--插件列表--><plugins><!--安裝tomcat7插件--><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version></plugin></plugins></build></project>

5.打開maven側邊欄,找到tomcat7插件,點擊tomcat7:run,啟動tomcat服務器

在這里插入圖片描述

6.運行后會在末尾出顯示一個鏈接,就是本地項目的地址,點擊該鏈接即可查看web項目。

在這里插入圖片描述

點擊 http://localhost:8080/maven-project,彈出頁面如下:

在這里插入圖片描述

之所以頁面會顯示Hello World!,是因為使用原型創建web項目時,自動創建了一個index.jsp,內容如下:

在這里插入圖片描述

注:如果不想使用默認的8080端口和默認路徑,可以進行以下配置修改

<!--構建項目需要的信息-->
<build><!--插件列表--><plugins><!--安裝tomcat7插件--><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><!--配置端口號和路徑--><configuration><port>80</port><path>/</path></configuration></plugin></plugins>
</build>

再次啟動 tomcat,訪問以下地址即可:http://localhost:80/

在這里插入圖片描述

另外,還可以進行如下配置操作,用于簡化tomcat服務器的啟動:

idea右上角,Current File 下拉框選擇 Edit Configurations

在這里插入圖片描述

點擊 + 號,選擇 Maven

在這里插入圖片描述

填寫配置名稱、命令行以及選擇應用到哪個工程

在這里插入圖片描述

以后就可以使用如下方式啟動tomcat服務器了

在這里插入圖片描述

5.2 本地安裝Tomcat啟動項目

5.2.1 下載并安裝Tomcat

1.下載 tomcat,此處以tomcat9為例

官網地址:https://tomcat.apache.org/

點擊左邊欄Download下的Tomcat9

在這里插入圖片描述

點擊 64-bit Windows zip (pgp, sha512)鏈接進行下載,得到apache-tomcat-9.0.78-windows-x64.zip壓縮包

在這里插入圖片描述

2.安裝 tomcat,把壓縮包放到任意一個文件夾下解壓,選擇解壓到當前文件夾,即可安裝成功

此處我解壓到 E:\Applications\apache-tomcat-9.0.78

在這里插入圖片描述

3.配置tomcat環境變量

新建一個變量如下:

  • 變量名:CATALINA_HOME
  • 變量值:E:\Applications\apache-tomcat-9.0.78

在這里插入圖片描述

修改path變量,新增 %CATALINA_HOME%\bin

在這里插入圖片描述

4.驗證是否配置成功:打開cmd,輸入 startup.bat回車

注:執行這步之前,先檢查其他地方是否關閉了tomcat,否則會出現端口號(8080)占用的情況,導致啟動失敗(如檢查Idea中是否停止運行了tomcat插件)

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

啟動完成后,打開瀏覽器輸入 http://localhost:8080,出現如圖所示,說明安裝配置成功了

在這里插入圖片描述

注:上述運行 startup.bat腳本時,出現的亂碼問題,可以通過修改 apache-tomcat-9.0.78\conf\logging.properties解決

打開logging.properties文件,搜索 java.util.logging.ConsoleHandler.encoding = UTF-8,把 UTF-8改為GBK即可:

java.util.logging.ConsoleHandler.encoding = GBK

在這里插入圖片描述

此時再重啟 startup.bat腳本,就沒有了亂碼問題:

在這里插入圖片描述

5.2.2 本地Tomcat啟動項目

本地tomcat安裝配置完成后,再進行以下三步即可啟動web項目:

  • 打包war包
  • 把war包放到 webapps 目錄下
  • 啟動 startup.bat 腳本

1.打包war包:打開maven側邊欄,找到 Lifecycle,并點擊 package,等待構建完成會在target文件夾下生成一個war包,此處為maven-project-1.0-SNAPSHOT.war

在這里插入圖片描述

2.將 maven-project-1.0-SNAPSHOT.war 放到 apache-tomcat-9.0.78\webapps文件夾下

在這里插入圖片描述

3.啟動 startup.bat腳本,啟動完成后,在瀏覽器輸入項目地址,即可查看web項目

項目地址組成: http://localhost:8080/,后面再加上war包名稱

以我剛剛運行的項目為例,地址就是 http://localhost:8080/maven-project-1.0-SNAPSHOT

在這里插入圖片描述

6. Maven的依賴管理

6.1 依賴配置

依賴:指的是當前項目運行所需的jar包,一個項目可以設置多個依賴

<!-- 設置當前項目所依賴的所有jar -->
<dependencies><!-- 設置具體的依賴 --><dependency><groupId>junit</groupId> <!-- 依賴所屬群組id --><artifactId>junit</artifactId> <!-- 依賴所屬項目id --><version>3.8.1</version> <!-- 依賴版本號 --></dependency>
</dependencies>

6.2 依賴傳遞

6.2.1 依賴傳遞演示

依賴具有傳遞性:

  • 直接依賴:在當前項目中通過依賴配置建立的依賴關系
  • 間接依賴:被依賴具的資源如果依賴其他資源,當前項目間接依賴其他資源

在這里插入圖片描述

1.創建一個空項目maven-project,然后在項目下面創建三個模塊,分別取名project01project02project03

創建空工程:

在這里插入圖片描述

創建三個模塊:右鍵 maven-project -> New -> Module

在這里插入圖片描述

最終得到項目結構如下:

在這里插入圖片描述

2.對三個模塊的pom.xml進行以下修改

  • project01project02project03中分別添加 log4j1.2.121.2.131.2.14 的版本依賴
  • project01中添加junit 4.12版本的依賴
  • project03作為依賴資源添加到project02

注:如果當前項目,想使用另一個項目的東西,那么就把另一個項目作為依賴資源添加到當前項目中

project01pom.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><!--project01的項目坐標--><groupId>com.example</groupId><artifactId>project01</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--添加log4j依賴--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency><!--添加junit依賴--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies></project>

project02pom.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><!--project02的項目坐標--><groupId>com.example</groupId><artifactId>project02</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--添加log4j依賴--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.13</version></dependency><!--添加project03依賴--><dependency><groupId>com.example</groupId><artifactId>project03</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies></project>

project03pom.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><!--project03的項目坐標--><groupId>com.example</groupId><artifactId>project03</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--添加log4j依賴--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.14</version></dependency></dependencies></project>

3.以上配置完成后,點擊Maven的刷新按鈕,可以看到最終依賴的結構如下:

  • 使用紅色框圈中的依賴jar包為直接依賴
  • 使用紫色框圈中的依賴jar包為間接依賴

解釋:
1.對于project01項目而言,直接依賴了log4j:log4j:1.2.12junit:junit:4.12,間接依賴了 org:hamcrest:hamcrest-core:1.3
2.對于project02項目而言,直接依賴了log4j:log4j:1.2.13com.example:project03:1.0-SNAPSHOT,間接依賴了log4j:log4j:1.2.14
3.對于project03項目而言,直接依賴了log4j:log4j:1.2.14

在這里插入圖片描述

6.2.2 依賴傳遞沖突

依賴傳遞沖突問題:

  • 路徑優先:當依賴中出現相同資源時,層級越深,優先級越低,反之優先級越高。
  • 聲明優先:當資源在相同層級被依賴時,配置順序靠前的覆蓋順序靠后的。

特殊優先:當同級配置了相同資源的不同版本,后配置的覆蓋先配置的

在這里插入圖片描述

1.路徑優先:當依賴中出現相同資源時,層級越深,優先級越低,反之優先級越高。

此處project02項目中同時依賴了log4j的1.2.13和1.2.14版本,由于1.2.13是直接依賴,層級更淺,優先級更高,所以最終使用的是1.2.13的版本依賴。

注:idea中log4j的1.2.14版本依賴顏色顯示灰色,表示它未生效。

在這里插入圖片描述

2.聲明優先:當資源在相同層級被依賴時,配置順序靠前的覆蓋順序靠后的。

project01project02project03,3個模塊項目的pom.xml進行以下修改:

project01pom.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><!--project01的項目坐標--><groupId>com.example</groupId><artifactId>project01</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--添加project03依賴--><dependency><groupId>com.example</groupId><artifactId>project03</artifactId><version>1.0-SNAPSHOT</version></dependency><!--添加project02依賴--><dependency><groupId>com.example</groupId><artifactId>project02</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies></project>

project02pom.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><!--project02的項目坐標--><groupId>com.example</groupId><artifactId>project02</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--添加log4j依賴--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.13</version></dependency></dependencies></project>

project03pom.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><!--project03的項目坐標--><groupId>com.example</groupId><artifactId>project03</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--添加log4j依賴--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.14</version></dependency></dependencies></project>

最終的依賴結構如下:在project01 的pom.xml中,先添加了project03的依賴,后添加了project02的依賴,它們的log4j依賴在同一個層級,由于project03先添加,所以project03log4j 1.2.14依賴生效了。

在這里插入圖片描述

3.特殊優先:當同級配置了相同資源的不同版本,后配置的覆蓋先配置的

project02pom.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><!--project02的項目坐標--><groupId>com.example</groupId><artifactId>project02</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--添加log4j依賴,1.2.13版本--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.13</version></dependency><!--添加log4j依賴,1.2.14版本--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.14</version></dependency></dependencies></project>

同一個pom.xml里寫了兩份一樣的依賴,后配置的依賴覆蓋前面的,所以此處最終是1.2.14版本的log4j生效。

在這里插入圖片描述

6.3 可選依賴

可選依賴:指對外隱藏當前所依賴的資源(不透明)

也就是說,其他使用該依賴資源的人,不知道使用了它,因為該依賴資源被隱藏了

依賴中添加optional配置為true,即可隱藏依賴:

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><optional>true</optional> <!--隱藏依賴-->
</dependency>

演示:原始的project01project02的pom.xml配置如下

project01pom.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><!--project01的項目坐標--><groupId>com.example</groupId><artifactId>project01</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--添加project02依賴--><dependency><groupId>com.example</groupId><artifactId>project02</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies></project>

project02pom.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><!--project02的項目坐標--><groupId>com.example</groupId><artifactId>project02</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--添加junit依賴--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies></project>

此時能看見junit依賴:

在這里插入圖片描述

然后修改project02pom.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><!--project02的項目坐標--><groupId>com.example</groupId><artifactId>project02</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--添加junit依賴--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><optional>true</optional> <!--隱藏依賴--></dependency></dependencies></project>

點擊刷新按鈕后,發現junit依賴不見了(被隱藏了):

在這里插入圖片描述

6.4 排除依賴

排除依賴:指主動斷開依賴的資源,被排除的資源無需指定版本(不需要)

也就是說,自己不需要使用別人的依賴資源,主動排除了它

依賴中添加exclusion,并指定groupIdartifactId,即可排除依賴:

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><exclusions><!--排除依賴--><exclusion><groupId>org.hamcrest</groupId><artifactId>hamcrest-core</artifactId></exclusion></exclusions>
</dependency>

演示:修改project01project02pom.xml配置為以下
project01pom.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><!--project01的項目坐標--><groupId>com.example</groupId><artifactId>project01</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--添加project02依賴--><dependency><groupId>com.example</groupId><artifactId>project02</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies></project>

project02pom.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><!--project02的項目坐標--><groupId>com.example</groupId><artifactId>project02</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--添加junit依賴--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies></project>

此時能看見junit中還依賴了org.hamcrest:hamcrest-core:1.3

在這里插入圖片描述

然后修改project02pom.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><!--project02的項目坐標--><groupId>com.example</groupId><artifactId>project02</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--添加junit依賴--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><exclusions><!--排除依賴--><exclusion><groupId>org.hamcrest</groupId><artifactId>hamcrest-core</artifactId></exclusion></exclusions></dependency></dependencies></project>

點擊刷新按鈕后,發現org.hamcrest:hamcrest-core:1.3依賴不見了(被排除了):

在這里插入圖片描述

6.5 依賴范圍

依賴范圍:依賴的jar包默認情況下,可以在任何地方使用,可以通過scope標簽設定其作用范圍。

作用范圍:

  • 主程序范圍內有效(main文件夾范圍內)
  • 測試程序范圍內有效(test文件夾范圍內)
  • 是否參與打包(package指令范圍內)
范圍主代碼測試代碼打包例子
compilelog4j
testjunit
providedservlet-api
runtimejdbc
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope> <!--測試范圍-->
</dependency>

注:帶有依賴范圍的資源在進行傳遞時,作用范圍將受到影響

在這里插入圖片描述

7. 生命周期與插件

maven項目構建命令如下:

# 編譯
mvn compile# 清理
mvn clean # 測試
mvn test # 打包
mvn package # 安裝到本地倉庫
mvn install 

這些maven項目構建命令在Idea中對應的位置如下:

在這里插入圖片描述

7.1 構建生命周期

一個典型的 Maven 構建(build)生命周期是由以下幾個階段的序列組成的:
在這里插入圖片描述

階段處理描述
validate驗證項目驗證項目是否正確且所有必須信息是可用的
compile執行編譯源代碼編譯在此階段完成
test測試使用適當的單元測試框架(例如junit)運行測試
package打包創建 jar/war 包如在 pom.xml 中定義提及的包
verify檢查對集成測試的結果進行檢查,以保證質量達標
install安裝安裝打包的項目到本地倉庫,以供其他項目使用
deploy部署拷貝最終的工程包到遠程倉庫中,以共享給其他開發人員和工程

Maven 有以下三個標準的生命周期:

  • clean:項目清理的處理,清理工作
  • default:項目部署的處理,核心工作,例如編譯、測試、打包、部署等
  • site:項目站點文檔創建的處理,產生報告,發布站點

1.clean 生命周期

生命周期階段描述
pre-clean執行一些需要在clean之前完成的工作
clean移除所有上一次構建生成的文件
post-clean執行一些需要在clean之后立刻完成的工作

2.default (build) 生命周期

生命周期階段描述
validate(校驗)校驗項目是否正確并且所有必要的信息可以完成項目的構建過程
initialize(初始化)初始化構建狀態,比如設置屬性值
generate-sources(生成源代碼)生成包含在編譯階段中的任何源代碼
process-sources(處理源代碼)處理源代碼,比如說,過濾任意值
generate-resources(生成資源文件)生成將會包含在項目包中的資源文件
process-resources (處理資源文件)復制和處理資源到目標目錄,為打包階段最好準備
compile(編譯)編譯項目的源代碼
process-classes(處理類文件)處理編譯生成的文件,比如說對Java class文件做字節碼改善優化
generate-test-sources(生成測試源代碼)生成包含在編譯階段中的任何測試源代碼
process-test-sources(處理測試源代碼)處理測試源代碼,比如說,過濾任意值
generate-test-resources(生成測試資源文件)為測試創建資源文件
process-test-resources(處理測試資源文件)復制和處理測試資源到目標目錄
test-compile(編譯測試源碼)編譯測試源代碼到測試目標目錄
process-test-classes(處理測試類文件)處理測試源碼編譯生成的文件
test(測試)使用合適的單元測試框架運行測試(Juint是其中之一)
prepare-package(準備打包)在實際打包之前,執行任何的必要的操作為打包做準備
package(打包)將編譯后的代碼打包成可分發格式的文件,比如JAR、WAR或者EAR文件
pre-integration-test(集成測試前)在執行集成測試前進行必要的動作,比如說,搭建需要的環境
integration-test(集成測試)處理和部署項目到可以運行集成測試環境中
post-integration-test(集成測試后)在執行集成測試完成后進行必要的動作。比如說,清理集成測試環境
verify (驗證)運行任意的檢查來驗證項目包有效且達到質量標準
install(安裝)安裝項目包到本地倉庫,這樣項目包可以用作其他本地項目的依賴
deploy(部署)將最終的項目包復制到遠程倉庫中與其他開發者和項目共享

3.site 生命周期

生命周期階段描述
pre-site執行一些需要在生成站點文檔之前完成的工作
site生成項目的站點文檔
post-site執行一些需要在生成站點文檔之后完成的工作,并且為部署做準備
site-deploy將生成的站點文檔部署到特定的服務器上

7.2 插件

插件:每個生命周期中都包含著一系列的階段(phase),這些 phase 就相當于 Maven 提供的統一的接口,然后這些 phase 的實現由 Maven 的插件來完成。

  • 插件與生命周期內的階段綁定,在執行到對應生命周期時執行對應的插件功能
  • 默認maven在各個生命周期上綁定有預設的功能
  • 通過插件可以自定義其他功能

我們在輸入 mvn 命令的時候 比如 mvn clean,clean 對應的就是 Clean 生命周期中的 clean 階段,但是 clean 的具體操作是由 maven-clean-plugin 來實現的,所以說 Maven 生命周期的每一個階段的具體實現都是由 Maven 插件實現的。

插件類型:

類型描述
Build plugins在構建時執行,并在 pom.xml 的 元素中配置
Reporting plugins在網站生成過程中執行,并在 pom.xml 的 元素中配置

常用插件的列表:

插件描述
clean構建之后清理目標文件,刪除目標目錄
compiler編譯 java 源文件
surefile運行 junit單元測試,創建測試報告
jar從當前工程中構建 jar 文件
war從當前工程中構建 war 文件
javadoc為工程生成 javadoc
antrun從構建過程的任意一個階段中運行一個 ant 任務的集合

插件示例:

<build><plugins><!--生成源代碼的插件--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-source-plugin</artifactId><version>3.2.1</version><executions><execution><goals><goal>jar</goal></goals><phase>generate-test-resources</phase> <!--到生成測試源代碼階段,執行該插件--></execution></executions></plugin></plugins>
</build>

點擊刷新后可以發現 Plugins下多了個 source插件,就是剛剛添加 maven-source-plugin插件

在這里插入圖片描述

測試插件是否有效:由于generate-test-resources階段在test階段之前,也就是說執行到test階段,也必然執行了generate-test-resources階段,所以,我們點擊 Lifecycle下的test按鈕,使項目執行到test階段。

在這里插入圖片描述

在這里插入圖片描述

可以看到,左側生成了一個源碼的jar包,打開該jar包,就能查看項目的源碼。

在這里插入圖片描述

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40455.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40455.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40455.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【CTF-web】備份是個好習慣(查找備份文件、雙寫繞過、md5加密繞過)

題目鏈接&#xff1a;https://ctf.bugku.com/challenges/detail/id/83.html 經過掃描可以找到index.php.bak備份文件&#xff0c;下載下來后打開發現是index.php的原代碼&#xff0c;如下圖所示。 由代碼可知我們要繞過md5加密&#xff0c;兩數如果滿足科學計數法的形式的話&a…

模型預測筆記(一):數據清洗及可視化、模型搭建、模型訓練和預測代碼一體化和對應結果展示(可作為baseline)

模型預測 一、導入關鍵包二、如何載入、分析和保存文件三、修改缺失值3.1 眾數3.2 平均值3.3 中位數3.4 0填充 四、修改異常值4.1 刪除4.2 替換 五、數據繪圖分析5.1 餅狀圖5.1.1 繪制某一特征的數值情況&#xff08;二分類&#xff09; 5.2 柱狀圖5.2.1 單特征與目標特征之間的…

OpenCV基本操作——算數操作

目錄 圖像的加法圖像的混合 圖像的加法 兩個圖像應該具有相同的大小和類型&#xff0c;或者第二個圖像可以是標量值 注意&#xff1a;OpenCV加法和Numpy加法之間存在差異。OpenCV的加法是飽和操作&#xff0c;而Numpy添加的是模運算 import numpy as np import cv2 as cv imp…

[數據集][目標檢測]鋼材表面缺陷目標檢測數據集VOC格式2279張10類別

數據集格式&#xff1a;Pascal VOC格式(不包含分割路徑的txt文件和yolo格式的txt文件&#xff0c;僅僅包含jpg圖片和對應的xml) 圖片數量(jpg文件個數)&#xff1a;2279 標注數量(xml文件個數)&#xff1a;2279 標注類別數&#xff1a;10 標注類別名稱:["yueyawan",&…

Qt 窗口隨鼠標移動效果

實現在窗口任意位置按下鼠標左鍵都可以移動窗口的效果&#xff0c;完整代碼如下&#xff1a; mainwindow.h&#xff1a; #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class MainW…

PHP混淆加密以及常用的一些加密工具

PHP混淆加密是一種將源代碼轉換為難以理解和閱讀的方式&#xff0c;以保護代碼的安全性。以下是一些常見的PHP混淆加密方法&#xff1a; 代碼壓縮&#xff1a;使用代碼壓縮工具&#xff08;如UglifyJS&#xff09;將PHP代碼壓縮為一行&#xff0c;去除空格、換行符等可讀性的字…

jenkins 連接服務器,提示Can‘t connect to server

在Jenkins 添加服務器時&#xff0c;提示 Cant connect to server&#xff0c;如圖 搞了好久&#xff0c;不知道為什么不行~原來是行的&#xff0c;現在刪了 新建一個也不行。

2023牛客暑期多校訓練營8-C Clamped Sequence II

2023牛客暑期多校訓練營8-C Clamped Sequence II https://ac.nowcoder.com/acm/contest/57362/C 文章目錄 2023牛客暑期多校訓練營8-C Clamped Sequence II題意解題思路代碼 題意 解題思路 先考慮不加緊密度的情況&#xff0c;要支持單點修改&#xff0c;整體查詢&#xff0…

axios同一個接口,同時接收 文件 或者 數據

1、前端代碼 const service axios.create({baseURL: "http://192.168.2.200:8080/api",timeout: 180000 })// 響應攔截 service.interceptors.response.use(async response > {if(response){// 請求時設置返回blob, 但是實際上可能返回的是json的情況if (respon…

[C++]筆記 - 知識點積累

一.運算符的優先級 一共15個級別 最高優先級 : () []最低優先級 :逗號表達式倒數第二低優先級 : 賦值和符合賦值(,,-...) ! >算術運算符 > 關系運算符 > && >> || >賦值運算符 二.數據類型轉換 隱式類型轉換 算數轉換 char int long longlong flo…

解決Java中的“Unchecked cast: java.lang.Object to java.util.List”問題

&#x1f337;&#x1f341; 博主貓頭虎 帶您 Go to New World.?&#x1f341; &#x1f984; 博客首頁——貓頭虎的博客&#x1f390; &#x1f433;《面試題大全專欄》 文章圖文并茂&#x1f995;生動形象&#x1f996;簡單易學&#xff01;歡迎大家來踩踩~&#x1f33a; &a…

搜索二叉樹

目錄 搜索二叉樹的性質 搜索二叉樹的實現、 插入 刪除 代碼 在以前我們學過二叉樹,但是在對二叉樹的學習中發現,似乎二叉樹并沒有什么作用,要論增刪它比不上鏈表,論隨機訪問也沒法和順序表比,對于當時的我們是一頭霧水,那么現在它的功能終于是體現出來了,這里就是我們要講的…

[Go版]算法通關村第十一關白銀——位運算的高頻算法題

目錄 專題1&#xff1a;位移的妙用題目&#xff1a;位1的個數&#xff08;也被稱為漢明重量&#xff09;解法1&#xff1a;遍歷所有位&#xff0c;判斷每個位的數字是否是1Go代碼 解法2&#xff1a;依次消除每個1的位 numnum&(num-1)Go代碼 題目&#xff1a;比特位計數思路…

Mac 卸載appium

安裝了最新版的appium 2.0.1,使用中各種問題&#xff0c;卡頓....,最終決定回退的。記錄下卸載的過程 1.打開終端應用程序 2.卸載全局安裝的 Appium 運行以下命令以卸載全局安裝的 Appium&#xff1a; npm uninstall -g appium 出現報錯&#xff1a;Error: EACCES: permiss…

云安全攻防(十二)之 手動搭建 K8S 環境搭建

手動搭建 K8S 環境搭建 首先前期我們準備好三臺 Centos7 機器&#xff0c;配置如下&#xff1a; 主機名IP系統版本k8s-master192.168.41.141Centos7k8s-node1192.168.41.142Centos7k8s-node2192.168.41.143Centos7 前期準備 首先在三臺機器上都執行如下的命令 # 關閉防火墻…

Python讀取Word統計詞頻輸出到Excel

1.安裝依賴的包 "# 讀取docx\n", "!pip install python-docx\n", "!pip install -i https://pypi.tuna.tsinghua.edu.cn/simple python-docx\n", "# 中英文分詞\n", "!pip install jieba\n", "!pi…

postman測試后端增刪改查

目錄 一、本文介紹 二、準備工作 &#xff08;一&#xff09;新建測試 &#xff08;二&#xff09;默認url路徑查看方法 三、增刪改查 &#xff08;一&#xff09;查詢全部 &#xff08;二&#xff09;增加數據 &#xff08;三&#xff09;刪除數據 &#xff08;四&…

nginx反向代理流程

一、nginx反向代理流程 反向代理&#xff1a;使用代理服務器來接受internet上的連接請求&#xff0c;然后將請求轉發給內部網絡中的上游服務器&#xff0c;并將上游服務器得到的結果返回給請求連接的客戶端&#xff0c;代理服務器對外表現就是一個web服務器。Nginx就經常拿來做…

【內網穿透】如何實現在外web瀏覽器遠程訪問jupyter notebook服務器

文章目錄 前言1. Python環境安裝2. Jupyter 安裝3. 啟動Jupyter Notebook4. 遠程訪問4.1 安裝配置cpolar內網穿透4.2 創建隧道映射本地端口 5. 固定公網地址 前言 Jupyter Notebook&#xff0c;它是一個交互式的數據科學和計算環境&#xff0c;支持多種編程語言&#xff0c;如…

信也科技一面涼經

1.在項目經歷里挑一個詳細介紹一下 項目的應用場景 2.項目里用到多線程是怎么用的&#xff1f;回答&#xff1a;線程池 用通過 ThreadPoolExecutor 構造函數的方式創建的線程池 3.線程池有哪些重要參數&#xff1f;回答&#xff1a;核心線程數、最大線程數、阻塞隊列類型、…