做網(wǎng)站送郵箱中文域名
文章目錄
- 一、Maven介紹
- 1、什么是Maven
- 2、Maven的核心功能
- 二、Maven核心概念
- 1、坐標(biāo)GAVP
- 1.1、GroupId
- 1.2、ArtifactId
- 1.3、Version
- 1.3.1、版本號的組成
- 1.4、Packaging
- 2、POM、父POM和超級POM
- 2.1、POM (Project Object Model)
- 2.1、父POM(Parent POM)
- 2.3、超級POM(Super POM)
- 2.4、有效POM(Effective POM)
- 2.4.1、如何查看有效POM?
- 2.4.2、有效POM的用途
- 三、Maven依賴管理
- 1、依賴范圍
- 1.1、compile(編譯范圍)
- 1.2、provided(已提供范圍)
- 1.3、runtime(運行時范圍)
- 1.4、test(測試范圍)
- 1.5、system(系統(tǒng)范圍)
- 1.6、import(導(dǎo)入范圍)
- 2、依賴傳遞
- 2.1、依賴傳遞的作用范圍
- 2.2、可選依賴
- 2.3、依賴沖突與版本控制
- 四、Maven工程構(gòu)建
- 1、生命周期
- 2、構(gòu)建命令
- 2.1、常見組合命令
- 2.2、命令選項
- 3、插件
- 3.1、Maven默認的插件
- 3.2、生成微服務(wù)可運行jar包
- 3.2.1、添加spring-boot-maven-plugin插件后的打包流程
- 3.2.2、常規(guī)打包方式
- 3.2.3、進階打包方式
- 3.3、\<resources>標(biāo)簽
- 五、Maven繼承和聚合
- 1、繼承
- 1.1、父項目的pom.xml
- 1.2、子項目pom.xml
- 1.2.1、\<relativePath>標(biāo)簽
- 2、聚合
- 五、Maven倉庫
- 1、Maven倉庫
- 1.1、本地倉庫(Local Repository)
- 1.2、中央倉庫(Central Repository)
- 1.3、遠程倉庫(Remote Repository)
- 1.4、Maven倉庫的工作原理
- 2、Maven私服
- 2.1、Nexus倉庫
- 2.2、通過Nexus下載jar包
- 2.3、將jar包部署到Nexus
- 3、repositories和mirrors
- 3.1、repositories(倉庫)
- 3.2、mirrors(鏡像)
一、Maven介紹
1、什么是Maven
??Maven是Apache
軟件基金會開發(fā)的一款項目管理
和構(gòu)建工具
,主要用于Java 項目的構(gòu)建
、依賴管理
和項目生命周期管理
。Maven通過聲明性配置(XML 文件)定義項目構(gòu)建流程及依賴項,使得項目管理更簡單、更高效,特別適合于多模塊、大型項目。
2、Maven的核心功能
依賴管理
:自動解析、下載和管理項目所需的外部依賴庫,避免手動查找和添加 JAR 包構(gòu)建管理
:通過標(biāo)準(zhǔn)化的構(gòu)建生命周期(例如 clean、compile、test、package、install、deploy),幫助用戶自動化地編譯代碼、運行測試、打包成JAR/WAR包等插件擴展
:Maven 擁有豐富的插件生態(tài)系統(tǒng),能夠擴展構(gòu)建過程中的功能,包括代碼質(zhì)量檢查、測試覆蓋率報告、打包部署等項目統(tǒng)一管理
:Maven允許通過父子項目、聚合項目等結(jié)構(gòu),統(tǒng)一管理多模塊項目,使團隊協(xié)作更高效
二、Maven核心概念
1、坐標(biāo)GAVP
??在Maven中,GAVP是構(gòu)建項目的四個核心屬性的縮寫,分別代表GroupId
、ArtifactId
、Version
和Packaging
。這四個屬性在pom.xml
文件中定義,用于唯一標(biāo)識一個Maven項目或依賴。
1.1、GroupId
- 定義:項目或組件的組ID,通常表示項目所在的
組織、公司或團隊
- 用途:幫助區(qū)分不同的項目組和模塊。GroupId通常以
域名倒置
的格式(如com.example
)命名,以避免命名沖突 - 示例:
<groupId>com.example</groupId>
1.2、ArtifactId
- 定義:項目或模塊的標(biāo)識符,是
項目的名稱或模塊名稱
,通常是小寫的、簡短的名稱 - 用途:用于唯一標(biāo)識項目中的某個模塊。通常一個項目會有多個模塊,每個模塊的ArtifactId都是唯一的
- 示例:
<artifactId>my-app</artifactId>
1.3、Version
- 定義:項目的版本號,通常遵循語義化版本號(如
1.0.0
、1.0-SNAPSHOT
等) - 用途:幫助區(qū)分不同版本的構(gòu)件。Maven支持
SNAPSHOT
版本(用于開發(fā)階段)和RELEASE
版本(用于發(fā)布的穩(wěn)定版本) - 示例:
<version>1.0.0</version>
1.3.1、版本號的組成
- Maven的版本號通常由
主版本號
、次版本號
、補丁版本號
和標(biāo)識符
組成。其基本格式如下:
<major>.<minor>.<patch>-<qualifier>
- 主版本號 (Major Version)
- 作用: 主版本號在項目發(fā)生
重大更改
,可能導(dǎo)致向后不兼容時會更新。例如,修改了API接口或刪除了某些功能,升級主版本號 - 示例:
1.0.0
→2.0.0
- 作用: 主版本號在項目發(fā)生
- 次版本號 (Minor Version)
- 作用: 次版本號通常表示項目有了
新功能
,但向后兼容。例如,增加了新功能,但不影響現(xiàn)有功能的使用 - 示例:
1.0.0
→1.1.0
- 作用: 次版本號通常表示項目有了
- 補丁版本號 (Patch Version)
- 作用: 補丁版本號通常用于
修復(fù)錯誤
或進行小的改進,確保向后兼容 - 示例:
1.0.0
→1.0.1
- 作用: 補丁版本號通常用于
- 標(biāo)識符 (Qualifier)
- 作用: 標(biāo)識符用于
標(biāo)識
預(yù)發(fā)布版本或特殊版本,比如快照版本、測試版或里程碑版本 - 常見的附加標(biāo)識符有以下幾種
- 作用: 標(biāo)識符用于
附加標(biāo)識符 | 含義 | 適用階段 | 示例 |
---|---|---|---|
SNAPSHOT | 開發(fā)中的不穩(wěn)定版本 ,尚未發(fā)布 | 開發(fā)過程 | 1.0.0-SNAPSHOT |
ALPHA | 早期測試版本,可能包含較多 bug,功能未完全實現(xiàn) | 內(nèi)部測試 | 1.0.0-ALPHA |
BETA | 穩(wěn)定性較高的測試版本,功能基本完成 | 公開測試 | 1.0.0-BETA |
RC | 候選發(fā)布版本 ,接近正式版本 | 發(fā)布前測試 | 1.0.0-RC1 |
M | 里程碑版本 ,標(biāo)志關(guān)鍵特性的階段性完成 | 項目階段性成果 | 1.0.0-M1 |
GA | 正式發(fā)布版本 ,供所有用戶使用 | 正式發(fā)布 | 1.0.0-GA |
FINAL | 最終穩(wěn)定版本 ,適合大規(guī)模使用 | 正式發(fā)布 | 1.0.0-FINAL |
HOTFIX | 緊急修復(fù)版本,快速解決嚴(yán)重問題 | 緊急修復(fù) | 1.0.1-HOTFIX |
DEV | 開發(fā)版本,類似于 SNAPSHOT | 開發(fā)過程 | 1.0.0-DEV |
CUSTOM | 定制版本,針對特定客戶或項目需求 | 定制化發(fā)布 | 1.0.0-CUSTOM |
PREVIEW | 預(yù)覽版本,展示即將發(fā)布的功能 | 用戶或客戶展示 | 1.0.0-PREVIEW |
CANARY | 實驗版,用于有限發(fā)布和生產(chǎn)環(huán)境驗證 | 實驗性發(fā)布 | 1.0.0-CANARY |
EAP | Early Access Program,早期訪問版 | 內(nèi)部或有限外部訪問 | 1.0.0-EAP |
NIGHTLY | 每晚構(gòu)建的版本,通常用于開發(fā)中的自動化測試 | 開發(fā)過程 | 1.0.0-NIGHTLY |
STAGING | 預(yù)發(fā)布版本,通常用于發(fā)布到生產(chǎn)環(huán)境前的測試 | 預(yù)生產(chǎn)環(huán)境 | 1.0.0-STAGING |
TEST | 用于測試目的的版本,可能包含調(diào)試信息 | 內(nèi)部測試 | 1.0.0-TEST |
INTEGRATION | 用于集成測試的版本 | 集成測試 | 1.0.0-INTEGRATION |
DEMO | 演示版本,通常用于客戶或內(nèi)部展示 | 展示用途 | 1.0.0-DEMO |
EXPERIMENTAL | 實驗版本,包含實驗性功能或不穩(wěn)定的更改 | 開發(fā)測試 | 1.0.0-EXPERIMENTAL |
LTS | 長期支持版本 ,通常包含穩(wěn)定且經(jīng)驗證的功能 | 正式發(fā)布 | 1.0.0-LTS |
RELEASE | 穩(wěn)定的正式發(fā)布版本 ,類似于 GA 和 FINAL | 正式發(fā)布 | 1.0.0-RELEASE |
ROLLOUT | 漸進式發(fā)布版本,逐步向用戶推廣 | 漸進式發(fā)布 | 1.0.0-ROLLOUT |
PATCH | 小型補丁版本,用于特定問題的快速修復(fù) | 快速修復(fù) | 1.0.1-PATCH |
snapshot
表示快照版,它不是個穩(wěn)定版本,屬于開發(fā)過程中使用的版本- 當(dāng)一個項目開發(fā)完成后,就會進入測試版本,而測試版本一般會分為
內(nèi)部測試alpha版
、外部測試beta版
兩種 - 當(dāng)測試通過后,將會進入正式版本,大部分的正式版是啥也不帶,就一個單純的版本號,比如1.0、1.7.1等。也有個別的是這些
rc、final、release、ga
等
1.4、Packaging
- 定義:指定項目的
打包類型
,決定了Maven最終生成的文件格式 - 常見的打包類型:
- jar:用于生成Java的
jar
文件 - war:用于生成Web應(yīng)用的
war
文件 - pom:通常用于
父項目
或聚合項目
,表示該項目不會打包成可執(zhí)行文件,而是用于組織多個模塊
- jar:用于生成Java的
- 示例:
<packaging>jar</packaging>
2、POM、父POM和超級POM
2.1、POM (Project Object Model)
??POM是Maven項目的核心文件,通常命名為pom.xml
,包含了項目的配置信息、依賴關(guān)系、插件、構(gòu)建設(shè)置等。每個Maven項目都需要一個POM文件,它決定了如何構(gòu)建和管理項目。
以下是一個詳細的 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.0http://maven.apache.org/maven-v4_0_0.xsd"><!-- modelVersion: 定義 POM 文件的版本,通常為 4.0.0 --><modelVersion>4.0.0</modelVersion><!-- groupId: 項目的組 ID,通常是項目所在組織的域名反轉(zhuǎn)形式 --><groupId>com.example</groupId><!-- artifactId: 項目的標(biāo)識符,通常是項目的名稱 --><artifactId>my-app</artifactId><!-- version: 項目的版本號 --><version>1.0.0</version><!-- packaging: 打包類型,默認為 jar。其他值可以是 war、pom 等 --><packaging>jar</packaging><!-- name: 項目的名稱(可選) --><name>My Application</name><!-- description: 項目的簡短描述(可選) --><description>This is my first Maven project.</description><!-- url: 項目主頁的 URL(可選) --><url>http://www.example.com/my-app</url><!-- licenses: 項目使用的許可證信息 --><licenses><license><name>Apache License, Version 2.0</name><url>http://www.apache.org/licenses/LICENSE-2.0</url><distribution>repo</distribution></license></licenses><!-- developers: 項目的開發(fā)人員信息 --><developers><developer><id>johndoe</id><name>John Doe</name><email>johndoe@example.com</email><organization>Example Org</organization><roles><role>developer</role></roles></developer></developers><!-- dependencies: 定義項目依賴的外部庫 --><dependencies><dependency><!-- groupId: 依賴的組 ID --><groupId>org.springframework</groupId><!-- artifactId: 依賴的標(biāo)識符 --><artifactId>spring-core</artifactId><!-- version: 依賴的版本 --><version>5.2.9.RELEASE</version><!-- scope: 依賴的作用范圍,默認為 compile,還可以是 test、provided、runtime 等 --><scope>compile</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.1</version><scope>test</scope> <!-- 僅在測試階段使用 --></dependency></dependencies><!-- build: 構(gòu)建配置,如插件、資源等 --><build><plugins><plugin><!-- 編譯插件 --><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><!-- 設(shè)置 Java 編譯版本 --><source>1.8</source><target>1.8</target></configuration></plugin><plugin><!-- 測試報告生成插件 --><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.22.2</version></plugin></plugins></build><!-- properties: 項目屬性,通常用來定義全局變量 --><properties><!-- Maven 編譯器的 Java 源代碼版本 --><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><!-- repositories: 自定義 Maven 倉庫 --><repositories><repository><id>central</id><name>Maven Central Repository</name><url>https://repo.maven.apache.org/maven2</url></repository></repositories><!-- profiles: 定義構(gòu)建配置的不同環(huán)境 --><profiles><profile><id>development</id><properties><!-- 開發(fā)環(huán)境專用屬性 --><maven.compiler.source>11</maven.compiler.source></properties></profile><profile><id>production</id><properties><!-- 生產(chǎn)環(huán)境專用屬性 --><maven.compiler.source>1.8</maven.compiler.source></properties></profile></profiles>
</project>
2.1、父POM(Parent POM)
??父POM文件位于項目的根目錄
,通常用于多模塊
項目的配置。它包含公共
依賴項、插件版本、構(gòu)建配置等,供子模塊繼承
。父POM可以被稱為“聚合POM”或“根POM”,并且會定義<modules>
標(biāo)簽來指定所有子模塊。
以下是一個詳細的父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.0http://maven.apache.org/maven-v4_0_0.xsd"><!-- modelVersion: 定義 POM 文件的版本,通常為 4.0.0 --><modelVersion>4.0.0</modelVersion><!-- groupId: 定義父 POM 的組 ID --><groupId>com.example</groupId><artifactId>parent-project</artifactId><version>1.0.0</version><!-- packaging: 父 POM 一般使用 pom 作為打包類型 --><packaging>pom</packaging><!-- modules: 定義子模塊 --><modules><module>module-one</module><module>module-two</module></modules><!-- properties: 定義共享的屬性,用于子項目繼承 --><properties><!-- 定義所有模塊的全局 Java 編譯器版本 --><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><!-- 項目版本定義,可供子模塊繼承使用 --><spring.version>5.2.9.RELEASE</spring.version><junit.version>4.13.1</junit.version></properties><!-- dependencyManagement: 用于管理子模塊的依賴版本 --><dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version><scope>test</scope></dependency></dependencies></dependencyManagement><!-- build: 配置構(gòu)建相關(guān)信息 --><build><plugins><plugin><!-- maven-compiler-plugin 插件,用于設(shè)置編譯器版本 --><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>${maven.compiler.source}</source><target>${maven.compiler.target}</target></configuration></plugin><plugin><!-- maven-surefire-plugin 插件,用于執(zhí)行單元測試 --><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.22.2</version></plugin></plugins></build><!-- profiles: 用于定義不同環(huán)境下的構(gòu)建配置 --><profiles><profile><id>development</id><properties><!-- 開發(fā)環(huán)境中使用 Java 11 --><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target></properties></profile><profile><id>production</id><properties><!-- 生產(chǎn)環(huán)境中使用 Java 8 --><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties></profile></profiles><!-- repositories: 定義自定義 Maven 倉庫 --><repositories><repository><id>central</id><url>https://repo.maven.apache.org/maven2</url></repository></repositories>
</project>
2.3、超級POM(Super POM)
??超級POM是Maven提供的默認全局
POM文件,所有的Maven項目都會隱式繼承
這個超級POM。它是Maven的頂級POM
,定義了Maven項目構(gòu)建的默認行為。即使項目沒有顯式指定任何父POM,它也會自動繼承
超級POM中的基本設(shè)置。
??超級pom定義在maven-model-builder.jar
中,如果想查看其定義,需要將jar包解壓,解壓后超級pom的完整路徑為: maven 安裝目錄\lib\maven-model-builder-3.8.6.jar\org\apache\maven\model\pom-4.0.0.xml
,內(nèi)容如下:
<?xml version="1.0" encoding="UTF-8"?><project><!-- 定義 POM 文件的版本,通常為 4.0.0 --><modelVersion>4.0.0</modelVersion><!-- repositories 元素定義 Maven 用于解析依賴的倉庫 --><repositories><repository><!-- id 是倉庫的唯一標(biāo)識符,代表 Maven Central 倉庫 --><id>central</id><!-- name 是倉庫的名稱,描述性字段 --><name>Central Repository</name><!-- url 定義了倉庫的網(wǎng)絡(luò)地址 --><url>https://repo.maven.apache.org/maven2</url><!-- layout 定義了倉庫的布局,默認為 default --><layout>default</layout><snapshots><!-- 禁用從該倉庫下載快照版本 --><enabled>false</enabled></snapshots></repository></repositories><!-- pluginRepositories 元素用于定義 Maven 插件的倉庫 --><pluginRepositories><pluginRepository><!-- 插件倉庫的唯一標(biāo)識符,與普通倉庫類似 --><id>central</id><!-- 倉庫的名稱 --><name>Central Repository</name><!-- 倉庫的 URL 地址 --><url>https://repo.maven.apache.org/maven2</url><!-- 倉庫的布局,默認值為 default --><layout>default</layout><snapshots><!-- 禁用快照版本的插件下載 --><enabled>false</enabled></snapshots><releases><!-- 定義如何更新發(fā)布版本的策略,never 表示從不更新 --><updatePolicy>never</updatePolicy></releases></pluginRepository></pluginRepositories><!-- build 元素定義了構(gòu)建過程中的目錄、插件和資源管理 --><build><!-- 定義編譯輸出的目錄,通常為 target 文件夾 --><directory>${project.basedir}/target</directory><!-- 定義編譯后的類文件的輸出目錄 --><outputDirectory>${project.build.directory}/classes</outputDirectory><!-- 定義構(gòu)建輸出文件的最終名稱,通常包括 artifactId 和版本號 --><finalName>${project.artifactId}-${project.version}</finalName><!-- 定義測試編譯后的輸出目錄 --><testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory><!-- Java 源代碼的目錄,默認為 src/main/java --><sourceDirectory>${project.basedir}/src/main/java</sourceDirectory><!-- 腳本源文件的目錄 --><scriptSourceDirectory>${project.basedir}/src/main/scripts</scriptSourceDirectory><!-- 測試源代碼的目錄,默認為 src/test/java --><testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory><!-- 定義項目的主資源文件目錄,通常用于配置文件等 --><resources><resource><directory>${project.basedir}/src/main/resources</directory></resource></resources><!-- 定義測試資源文件目錄 --><testResources><testResource><directory>${project.basedir}/src/test/resources</directory></testResource></testResources><!-- pluginManagement 元素管理所有的插件版本和配置,供子項目繼承 --><pluginManagement><!-- NOTE: 以下插件將在未來版本的超級 POM 中移除 --><plugins><!-- 定義了 maven-antrun-plugin 插件及其版本 --><plugin><artifactId>maven-antrun-plugin</artifactId><version>1.3</version></plugin><!-- 定義了 maven-assembly-plugin 插件及其版本,用于生成項目打包配置 --><plugin><artifactId>maven-assembly-plugin</artifactId><version>2.2-beta-5</version></plugin><!-- 定義了 maven-dependency-plugin 插件及其版本,管理項目依賴 --><plugin><artifactId>maven-dependency-plugin</artifactId><version>2.8</version></plugin><!-- 定義了 maven-release-plugin 插件及其版本,管理項目發(fā)布流程 --><plugin><artifactId>maven-release-plugin</artifactId><version>2.5.3</version></plugin></plugins></pluginManagement></build><!-- reporting 元素用于生成項目報告的輸出目錄 --><reporting><outputDirectory>${project.build.directory}/site</outputDirectory></reporting><!-- profiles 元素定義了項目的構(gòu)建配置文件需要mvn clean install -DperformRelease=true才能生效--><profiles><!-- 定義一個 profile,名為 release-profile --><profile><id>release-profile</id><!-- activation 元素定義激活 profile 的條件 --><activation><!-- 當(dāng)屬性 performRelease 為 true 時激活此 profile --><property><name>performRelease</name><value>true</value></property></activation><build><plugins><!-- 繼承自父 POM 的 maven-source-plugin 插件 --><plugin><inherited>true</inherited><artifactId>maven-source-plugin</artifactId><executions><execution><id>attach-sources</id><goals><!-- 生成源碼 jar 包 --><goal>jar-no-fork</goal></goals></execution></executions></plugin><!-- 繼承自父 POM 的 maven-javadoc-plugin 插件,用于生成 Javadoc --><plugin><inherited>true</inherited><artifactId>maven-javadoc-plugin</artifactId><executions><execution><id>attach-javadocs</id><goals><!-- 生成 Javadoc jar 包 --><goal>jar</goal></goals></execution></executions></plugin><!-- 繼承自父 POM 的 maven-deploy-plugin 插件 --><plugin><inherited>true</inherited><artifactId>maven-deploy-plugin</artifactId><configuration><!-- 配置更新發(fā)布信息 --><updateReleaseInfo>true</updateReleaseInfo></configuration></plugin></plugins></build></profile></profiles></project>
??也正是超級pom中build元素定義了構(gòu)建過程中的源碼文件
、配置文件等資源
的目錄
,才有如下約定的目錄要求。
2.4、有效POM(Effective POM)
??有效POM(Effective POM)是Maven生成的最終POM文件
,它將項目POM文件與父POM、超級POM以及各種繼承和聚合的配置組合在一起,形成一個完整的項目配置。有效POM包含了項目中所有繼承的配置、依賴、插件等信息,即項目實際構(gòu)建時使用的完整POM。
2.4.1、如何查看有效POM?
mvn help:effective-pom
示例輸出:
<project><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>my-project</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><build><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><artifactId>maven-surefire-plugin</artifactId><version>2.22.2</version></plugin><plugin><artifactId>maven-jar-plugin</artifactId><version>3.1.0</version></plugin><!-- 其他插件 --></plugins></build><dependencies><!-- 列出所有依賴,包括直接聲明的和繼承來的 --></dependencies><!-- 其他配置 -->
</project>
??如果使用mvn help:effective-pom命令時,輸出的內(nèi)容過多
導(dǎo)致最上面的部分被截斷
,輸出到文件并打開
。
- 在Linux或macOS中,執(zhí)行以下命令可以將輸出保存到文件后立即打開它
mvn help:effective-pom > effective-pom.xml && open effective-pom.xml
- 在Windows上可以使用
mvn help:effective-pom > effective-pom.xml && start effective-pom.xml
2.4.2、有效POM的用途
調(diào)試配置問題
:幫助你理解為什么某個依賴或插件會被使用,或者為何某個插件沒有被使用查看默認插件
:幫助查看所有自動添加的插件和它們的版本驗證繼承和聚合
:確保項目繼承了正確的配置,尤其是當(dāng)項目使用多模塊或父子POM時
三、Maven依賴管理
??Maven依賴管理是Maven最強大
的功能之一,它通過自動下載和管理項目所需的外部庫
和插件
,使開發(fā)者無需手動配置這些依賴項。
1、依賴范圍
- 通過設(shè)置坐標(biāo)的依賴范圍,可以設(shè)置對應(yīng)
jar
包的作用范圍
編譯環(huán)境
:在源代碼的目錄src/main/java
下可以使用測試環(huán)境
:在測試源代碼的目錄src/test/java
下可以使用運行環(huán)境
:生成的war或可執(zhí)行jar的lib
下有對應(yīng)的jar
1.1、compile(編譯范圍)
- 描述:默認
依賴范圍
。所有沒有明確指定范圍的依賴,都會使用compile
范圍 - 作用:在
編譯
、測試
和運行
時均可用 - 使用場景:對于大多數(shù)核心庫,如框架類庫(例如 Spring),都應(yīng)使用
compile
范圍 - 示例:
<dependency><groupId>org.example</groupId><artifactId>example-lib</artifactId><version>1.0</version> </dependency>
1.2、provided(已提供范圍)
- 描述:運行時需要由應(yīng)用服務(wù)器或容器提供該依賴
- 作用:在
編譯
和測試
時可用,但不會在運行時包含在打包文件中
- 使用場景:適用于需要在應(yīng)用服務(wù)器或其他容器(如 Tomcat)中提供的依賴。例如,Servlet API 需要由 Web 服務(wù)器提供
- 示例:
<dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>4.0.1</version><scope>provided</scope> </dependency>
- 如圖
tomcat
也就是部署的服務(wù)器本身就提供了
1.3、runtime(運行時范圍)
- 描述:主要用于那些
不在編譯階段使用
,但需要在項目運行時加載的庫 - 作用:在
運行
和測試
時可用,但不會在編譯時使用 - 使用場景:JDBC驅(qū)動實現(xiàn)依賴,其在編譯時只需JDK提供的JDBC接口,只有測試、運行階段才需要實現(xiàn)了JDBC接口的驅(qū)動
- 示例:
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.25</version><scope>runtime</scope> </dependency>
1.4、test(測試范圍)
- 描述:通常用于JUnit、TestNG等測試框架
- 作用:只在
測試環(huán)境
src/test/java下可用,編譯和運行時不可用 - 使用場景:適用于所有測試相關(guān)的庫,如測試框架
- 示例:
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope> </dependency>
1.5、system(系統(tǒng)范圍)
- 描述:系統(tǒng)范圍的依賴類似于
provided
,但它需要手動提供JAR文件,并通過systemPath
明確指明依賴的路徑 - 作用:在
編譯
和測試
時可用,但不會在運行時包含。(project.basedir
是maven的預(yù)定義變量,表示當(dāng)前項目的根目錄路徑
) - 使用場景:適用于系統(tǒng)自帶的庫,或需要本地使用的特定
JAR
文件 - 打包插件配置
<includeSystemScope>true</includeSystemScope>
,否則可執(zhí)行jar中l(wèi)ib沒有此依賴 - 示例:
<dependency><groupId>com.xc.maven</groupId><artifactId>xc-maven-test</artifactId><version>1.0-SNAPSHOT</version><systemPath>${project.basedir}/src/main/resources/lib/open-api-sdk-2.0.jar</systemPath><scope>system</scope></dependency><!--配合打包插件配置--><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><includeSystemScope>true</includeSystemScope></configuration></plugin></plugins></build>
1.6、import(導(dǎo)入范圍)
- 描述:
import
是一種特殊的依賴范圍,通常在依賴管理(<dependencyManagement>
)中使用,用來導(dǎo)入POM類型的依賴。通過import
,可以將另一個POM中定義的依賴管理配置應(yīng)用到當(dāng)前項目中 - 作用:
引入
另一項目的依賴配置,不直接應(yīng)用于編譯、測試或運行時 - 使用場景:在一個父pom中的dependencyManagement標(biāo)簽中需要導(dǎo)入另一個pom中的dependencyManagement的時候
<type>
元素用于指定依賴的打包類型
,默認依賴是.jar
文件,是最常見的依賴類型- 示例:
<dependencyManagement><dependency><groupId>org.example</groupId><artifactId>example-dependencies</artifactId><version>1.0</version><type>pom</type><scope>import</scope></dependency> </dependencyManagement>
<type>單獨使用的場景
- 指定依賴的類型為POM,表明這是一個POM文件,而不是一個實際的庫
- 這個配置用于將指定POM文件中的
依賴管理
或其他配置
引入到當(dāng)前項目中
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.7.11</version><type>pom</type></dependency>
</dependencies>
2、依賴傳遞
??假設(shè)項目A依賴于庫B,而庫B依賴于庫C,那么當(dāng)你在項目A中聲明依賴庫B時,Maven會自動為你將庫C也加入到A的類路徑中。這就是依賴傳遞
的效果,Maven會遞歸解析每個依賴的依賴
。
2.1、依賴傳遞的作用范圍
??Maven支持不同的依賴范圍(scope)
,依賴傳遞
的行為會受到這些范圍的影響。以下是各范圍在依賴傳遞中的行為:
作用范圍 | 傳遞性 | 原因 |
---|---|---|
compile | 是 | 默認范圍,可在編譯、運行和測試時使用,傳遞性強 |
provided | 否 | 僅在編譯和測試時使用,不會在運行時加入,傳遞性關(guān)閉 |
runtime | 是 | 僅在運行時使用,編譯時不可用,傳遞性仍然保留 |
test | 否 | 僅在測試時使用,不會傳遞給其他模塊 |
system | 否 | 需要手動指定的外部依賴,不能傳遞 |
import | 僅導(dǎo)入依賴管理 | 僅用于導(dǎo)入依賴管理,不導(dǎo)入具體依賴 |
2.2、可選依賴
??當(dāng)你為某個依賴指定<optional>true</optional>
時,這個依賴就不會自動傳遞給下游的依賴(即其他依賴這個項目的項目)。一句話,阻止
依賴傳遞。
<!--熱部署依賴 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional>
</dependency>
2.3、依賴沖突與版本控制
??Maven通過依賴傳遞機制可能會引入多個不同版本的同一個庫,這時就會發(fā)生依賴沖突
。
依賴沖突優(yōu)先級規(guī)則
-
首要判斷:
最短路徑優(yōu)先
-
再者判斷:路徑相同時
先聲明者優(yōu)先
依賴沖突手動排除
- 在對依賴沖突默認規(guī)則生效的版本不滿意時候,可以自己選擇手動排除
<dependency><groupId>com.xc</groupId><artifactId>project2</artifactId><version>1.0-SNAPSHOT</version><scope>compile</scope><!-- 使用excludes標(biāo)簽配置依賴的排除 --><exclusions><!-- 在exclude標(biāo)簽中配置一個具體的排除 --><exclusion><!-- 指定要排除的依賴的坐標(biāo)(不需要寫version) --><groupId>com.xc</groupId><artifactId>project3</artifactId></exclusion></exclusions>
</dependency>
四、Maven工程構(gòu)建
??項目構(gòu)建是指將源代碼、依賴庫和資源文件
等轉(zhuǎn)換成可執(zhí)行或可部署的應(yīng)用程序
的過程,在這個過程中包括編譯源代碼、鏈接依賴庫、打包和部署等多個步驟。
1、生命周期
??Maven的生命周期(Lifecycle)是構(gòu)建項目的步驟集合
,定義了從項目編譯到部署的一系列過程。
下面是Maven生命周期及其階段的表格:
生命周期 | 階段 | 描述 |
---|---|---|
Clean 生命周期 | pre-clean | 執(zhí)行清理之前的工作 |
clean(重點) | 移除上一次構(gòu)建生成的文件 | |
post-clean | 執(zhí)行清理之后的工作 | |
Default 生命周期 | validate | 驗證項目結(jié)構(gòu)和必要信息 |
initialize | 初始化構(gòu)建狀態(tài),例如設(shè)置屬性 | |
generate-sources | 生成源代碼(如果需要) | |
process-sources | 處理源代碼(如代碼增強) | |
generate-resources | 生成資源文件 | |
process-resources | 復(fù)制并處理資源到輸出目錄,準(zhǔn)備打包 | |
compile(重點) | 編譯項目main目錄下的源代碼 | |
process-classes | 處理編譯后的類文件 | |
generate-test-sources | 生成測試源代碼 | |
process-test-sources | 處理測試源代碼 | |
generate-test-resources | 生成測試資源 | |
process-test-resources | 處理測試資源 | |
test-compile | 編譯測試代碼 | |
test(重點) | 運行測試代碼 | |
prepare-package | 打包前的準(zhǔn)備工作 | |
package(重點) | 將編譯結(jié)果打包(如 JAR、WAR) | |
pre-integration-test | 運行集成測試前的準(zhǔn)備工作 | |
integration-test | 運行集成測試 | |
post-integration-test | 集成測試后的清理工作 | |
verify | 驗證項目是否符合標(biāo)準(zhǔn) | |
install(重點) | 安裝包到本地倉庫 | |
deploy(重點) | 將包發(fā)布到遠程倉庫 | |
Site 生命周期 | pre-site | 生成站點之前的準(zhǔn)備工作 |
site | 生成項目站點文檔 | |
post-site | 生成站點之后的處理工作 | |
site-deploy | 發(fā)布生成的站點到服務(wù)器 |
生命周期獨立
:clean、default和site生命周期彼此獨立,執(zhí)行一個生命周期時,不會自動觸發(fā)其他生命周期階段順序執(zhí)行
:在一個生命周期內(nèi),Maven從最初階段開始執(zhí)行,依次運行到你指定的階段。如果指定了一個中間階段,之前的所有階段都會被執(zhí)行,確保構(gòu)建流程的完整性和一致性
2、構(gòu)建命令
??需要在包含pom.xml
的項目根目錄執(zhí)行Maven構(gòu)建命令,因為Maven是基于這個文件來讀取構(gòu)建配置、依賴和插件信息的。
命令 | 描述 |
---|---|
mvn compile | 編譯項目,生成target文件 |
mvn package | 打包項目,生成jar或war文件 |
mvn clean | 清理編譯或打包后的項目結(jié)構(gòu) |
mvn install | 打包后上傳到maven本地倉庫 |
mvn deploy | 只打包,上傳到maven私服倉庫 |
mvn site | 生成站點 |
mvn test | 執(zhí)行測試源碼 |
2.1、常見組合命令
mvn clean install
:清理項目后,重新構(gòu)建并將包安裝到本地倉庫mvn clean package
:清理項目后,重新生成可分發(fā)的包(如 JAR 或 WAR)
2.2、命令選項
-DskipTests
:跳過測試,例如:mvn clean install -DskipTests-X
:啟用詳細的調(diào)試日志信息,例如:mvn clean install -X-T 1C
:使用多線程構(gòu)建,1C表示使用與CPU核數(shù)相同的線程數(shù),例如:mvn clean install -T 1C
3、插件
??Maven插件是執(zhí)行項目構(gòu)建和管理的實際工具
。所有的構(gòu)建任務(wù)(例如編譯、測試、打包、部署等)都是由插件來執(zhí)行的
。Maven本身是一個框架,它通過插件來調(diào)用具體的功能。
3.1、Maven默認的插件
maven-compiler-plugin
:用于編譯源代碼。默認Java1.5
版本,可以通過配置更改為其他版本
方式一:并設(shè)置source和target版本
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version> <!-- 插件版本 --><configuration><source>1.8</source> <!-- 指定源代碼使用的Java版本 --><target>1.8</target> <!-- 指定生成字節(jié)碼的Java版本 --></configuration>
</plugin>
方式二:使用properties
設(shè)置全局Java版本
<!-- properties: 項目屬性,通常用來定義全局變量 -->
<properties><!-- Maven 編譯器的 Java 源代碼版本 --><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target>
</properties>
maven-surefire-plugin
:用于運行單元測試,主要是通過 JUnit 或 TestNGmaven-jar-plugin
:用于創(chuàng)建jar文件。默認把編譯后的class文件打包為一個jar文件(只是一個標(biāo)準(zhǔn)的庫 JAR,不包含所有的依賴項)maven-install-plugin
:用于把生成的工件(JAR、WAR 文件等)安裝到本地Maven倉庫maven-deploy-plugin
:用于將工件發(fā)布到遠程倉庫,供其他開發(fā)人員使用- maven-site-plugin:用于生成站點文檔,通?;陧椖康腜OM文件信息生成報告和文檔
maven-clean-plugin
:用于清除項目生成的文件,例如target目錄下的編譯輸出- maven-resources-plugin:用于處理項目中的資源文件(如將資源從
src/main/resources
復(fù)制到目標(biāo)目錄)
從idea可視化工具查看maven的默認插件:
3.2、生成微服務(wù)可運行jar包
??由以上插件maven-jar-plugin可知,默認情況只能生成依賴jar,而不是微服務(wù)可執(zhí)行的jar,一般使用SpringBoot插件spring-boot-maven-plugin
,這個插件負責(zé)打包微服務(wù)為一個可運行的jar包。
<!-- SpringBoot應(yīng)用打包插件-->
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>
3.2.1、添加spring-boot-maven-plugin插件后的打包流程
- 第一步:打包生成普通JAR
- Maven會使用默認打包插件maven-jar-plugin生成一個普通的JAR文件
- 標(biāo)準(zhǔn)JAR文件,不可執(zhí)行,用于依賴作為庫或被引用
- 第二步:生成可執(zhí)行JAR
- 將第一步生成的JAR文件重命名為
xxx.jar.original
文件 - repackage命令會將應(yīng)用的所有依賴項(包括嵌入式的 Tomcat、Jetty 或其他服務(wù)器)打包進JAR中,并且指定JAR的入口點(即 Main-Class)
- 可執(zhí)行的JAR,包含所有依賴和嵌入式服務(wù)器,能夠獨立運行
- 將第一步生成的JAR文件重命名為
3.2.2、常規(guī)打包方式
pom文件:
...<groupId>com.xc</groupId><artifactId>springboot-mybatis</artifactId><version>1.0-SNAPSHOT</version>
...<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
打包結(jié)果:
springboot-mybatis-1.0-SNAPSHOT.jar
- 命名: artifactId + 版本號,用“-”連接
- 可以使用java -jar xxx直接運行的服務(wù),里面包含依賴的jar
springboot-mybatis-1.0-SNAPSHOT.jar.original
- 去掉后綴.original則是可以被其他項目依賴的jar
3.2.3、進階打包方式
pom文件:
...<groupId>com.xc</groupId><artifactId>springboot-mybatis</artifactId><version>1.0-SNAPSHOT</version>
...<build><finalName>my-mybatis</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><classifier>exec</classifier><skip>false</skip></configuration></plugin></plugins></build>
打包結(jié)果:
my-mybatis.jar
:依賴jar,不可執(zhí)行my-mybatis-exec.jar
:可執(zhí)行依賴- <finalName>標(biāo)簽:設(shè)置
打包的名稱
,不再使用artifactId + 版本號方式 - <classifier>標(biāo)簽:設(shè)置可運行服務(wù)
jar的后綴
- 因為可運行jar有了后綴
- 所有依賴jar就不會重名,也就不用添加后綴.original
- <skip>標(biāo)簽:mavn執(zhí)行插件選擇是否跳過,默認false,true則不執(zhí)行當(dāng)前插件
3.3、<resources>標(biāo)簽
不寫<resources>標(biāo)簽
src/main/java
下非java
文件都不會編譯- target當(dāng)中的classes和打出的包解壓BOOT-INF當(dāng)中的classes都找不到
src/main/resources
下的文件都會被編譯- target當(dāng)中的classes和打出的包解壓BOOT-INF當(dāng)中的classes都可以找到
<resources>標(biāo)簽只設(shè)置src/main/java
- 假如代碼中有xml想加載編譯,添加如下
<build><resources><resource><directory>src/main/java</directory><filtering>true</filtering><includes><include>**/*.xml</include></includes></resource></resources>
</build>
- <filtering>標(biāo)簽:默認值為false。指定打包時的配置文件其中${}引用會換成直接引用
- 此時src/main/java中的xml會編譯,但是src/main/resource中的所有資源都沒有加載
- 可以理解為:
- 不加<resource>則默認只加載resource文件
- 添加<resource>則是加哪個路徑,只加載哪個路徑的文件
最終方案
- 如此,java和resources下需要的資源都會加載
<build><resources><resource><directory>src/main/java</directory><filtering>true</filtering><includes><include>**/*.xml</include></includes></resource><resource><directory>src/main/resources</directory><filtering>true</filtering></resource></resources>
</build>
Maven生命周期、命令、插件之間的關(guān)系
??Maven的生命周期
定義了項目構(gòu)建的步驟,每個階段通過綁定的插件目標(biāo)
執(zhí)行具體任務(wù)。命令
用于觸發(fā)生命周期的某個階段或直接調(diào)用插件目標(biāo)。三者通過插件綁定階段、命令觸發(fā)生命周期,協(xié)同完成項目的自動化構(gòu)建。
五、Maven繼承和聚合
1、繼承
??Maven工程之間,A工程繼承B工程。本質(zhì)上是A工程的pom.xml
中的配置繼承了B工程中pom.xml的配置
1.1、父項目的pom.xml
- 父項目是作為頂層項目,包含多個子項目的
通用配置
。父項目的打包類型是pom
- 使用
dependencyManagement
標(biāo)簽配置只對依賴的管理,不導(dǎo)入
<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.example</groupId><artifactId>parent-project</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version></plugin></plugins></build><dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.3.9</version></dependency></dependencies></dependencyManagement>
</project>
1.2、子項目pom.xml
- 子項目通過在pom.xml中使用
<parent>
標(biāo)簽指定父項目,從而繼承父項目的配置 - 子項目可以
繼承
父項目的依賴、插件、屬性等,也可以在子項目中覆蓋
父項目的配置 - 如果子工程坐標(biāo)中的
groupId
和version
與父工程一致,那么可以省略
<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><parent><groupId>com.example</groupId><artifactId>parent-project</artifactId><version>1.0-SNAPSHOT</version><relativePath>../parent-pom.xml</relativePath> <!-- 相對路徑 --></parent><artifactId>child-project</artifactId><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId></dependency></dependencies>
</project>
1.2.1、<relativePath>標(biāo)簽
<relativePath>
標(biāo)簽用于在子項目的pom.xml中指定父項目的相對路徑- 如果父項目位于子項目上一級目錄,通常不需要顯式指定
<relativePath>
,Maven會默認使用../pom.xml
- 在非標(biāo)準(zhǔn)目錄結(jié)構(gòu)或父項目位于遠程倉庫時,使用
<relativePath/>
忽略遠程父項目
2、聚合
??Maven聚合是通過在一個主項目的pom.xml文件中使用<modules>
標(biāo)簽定義多個子模塊來實現(xiàn)的。聚合項目本身的pom.xml文件不會直接生成可執(zhí)行文件,而是負責(zé)將多個子模塊集中構(gòu)建
。
聚合項目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/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>parent-project</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><!-- 列出所有模塊 --><modules><module>module-a</module><module>module-b</module><module>module-c</module></modules>
</project>
??在這個例子中,聚合項目parent-project聚合了三個子模塊module-a、module-b和module-c。通過運行聚合項目的mvn install
或mvn clean install
命令,可以一次性構(gòu)建
這三個子模塊。
五、Maven倉庫
1、Maven倉庫
??Maven倉庫(Maven Repository)是用于存儲
和管理
Maven項目構(gòu)建過程中所需的依賴庫
、插件
以及構(gòu)件的存儲庫。
1.1、本地倉庫(Local Repository)
??本地倉庫位于開發(fā)者的本地
機器上,存儲Maven構(gòu)建過程中下載的所有依賴和插件。當(dāng)項目構(gòu)建時,Maven 首先會檢查本地倉庫中是否已經(jīng)存在需要的依賴,如果沒有,則會從遠程倉庫或中央倉庫下載。
- 默認路徑:
~/.m2/repository
- 特性:緩存下載的依賴,減少重復(fù)下載,提高構(gòu)建速度
settings.xml文件修改本地倉庫地址
,將中央倉庫地址替換為阿里云Maven倉庫
<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.0http://maven.apache.org/xsd/settings-1.0.0.xsd"><localRepository>/path/to/your/repo</localRepository><mirrors><mirror><id>aliyun-maven</id><mirrorOf>central</mirrorOf><name>Aliyun Maven Repository</name><url>https://maven.aliyun.com/repository/public</url><layout>default</layout></mirror></mirrors><!-- 其他配置 -->
</settings>
1.2、中央倉庫(Central Repository)
??中央倉庫是Maven官方維護的公共倉庫,存儲了開源項目常用的依賴庫。它是Maven的默認遠程倉庫,當(dāng)本地倉庫中沒有找到某個依賴時,Maven會自動從中央倉庫下載。
- 中央倉庫地址:
https://repo.maven.apache.org/maven2
- 特性:全球公開訪問,涵蓋了大量開源項目的庫和插件
1.3、遠程倉庫(Remote Repository)
??遠程倉庫是除了中央倉庫
,任何其他的遠程倉庫,包括第三方倉庫
和私有倉庫
。
- 其中,遠程倉庫可以分為兩種子類型:
快照倉庫(Snapshot Repository)
:用于存儲開發(fā)中的快照版本,支持不斷更新發(fā)布倉庫(Release Repository)
:用于存儲穩(wěn)定的已發(fā)布版本,內(nèi)容不會改變
1.4、Maven倉庫的工作原理
本地倉庫查找
:Maven 首先從本地倉庫查找構(gòu)建所需的依賴和插件遠程倉庫下載
:如果本地倉庫沒有該依賴,Maven 會從配置的遠程倉庫或中央倉庫下載該依賴,并存儲到本地倉庫中依賴緩存
:一旦依賴下載到本地倉庫,后續(xù)構(gòu)建中無需再次下載,除非依賴的版本發(fā)生變化(如 SNAPSHOT版本)發(fā)布到倉庫
:開發(fā)人員可以將構(gòu)件(如打包的JAR文件)發(fā)布到遠程倉庫(如企業(yè)私有倉庫),供其他團隊成員或項目共享使用
2、Maven私服
??Maven私服是一種特殊的Maven遠程倉庫
,它是架設(shè)在局域網(wǎng)
內(nèi)的倉庫服務(wù),用來代理位于外部的遠程倉庫(中央倉庫、其他遠程公共倉庫)。
以下是搭建 Maven 私服常用的工具:
Nexus Repository Manager
:由Sonatype提供的開源倉庫管理器(當(dāng)前最流行、使用最廣泛)Artifactory
:Jfrog提供的倉庫管理工具,支持多種格式的包管理(包括 Maven)Apache Archiva
:Apache提供的開源工具,專注于Maven倉庫管理
2.1、Nexus倉庫
倉庫類型 | 說明 |
---|---|
proxy | 代理倉庫 :用于從遠程存儲庫獲取組件 |
group | 組倉庫 :它將多個倉庫聚合為一個訪問入口,可以一并訪問多個底層倉庫 |
hosted | 托管倉庫 :用于存儲由內(nèi)部開發(fā)者創(chuàng)建的jar包 |
maven-central
:代理了遠程的Maven中央倉庫,構(gòu)建項目時會從該倉庫下載依賴
maven-public
:一個組倉庫,聚合了多個倉庫的內(nèi)容- 它將
多個倉庫
整合成一個統(tǒng)一的入口
,便于開發(fā)者訪問 - 在這個組中,通常包含
maven-releases
、maven-snapshots
和maven-central
等倉庫 - 那么只需要配置一個maven-public倉庫,就能同時訪問這些托管的和代理的倉庫
- 它將
maven-releases
:專門用于存儲發(fā)布的版本(release versions)的構(gòu)件- 當(dāng)一個項目發(fā)布了
穩(wěn)定的版本(非SNAPSHOT)
,可以將這些構(gòu)件發(fā)布到maven-releases倉庫中 - 其他團隊成員或相關(guān)項目可以直接從這個倉庫下載發(fā)布的版本
- 當(dāng)一個項目發(fā)布了
maven-snapshots
:專門用于存儲開發(fā)中的SNAPSHOT版本的構(gòu)件- SNAPSHOT版本代表開發(fā)中的構(gòu)件,它們可能會頻繁更新,不像release版本那樣穩(wěn)定
- 每次構(gòu)建的SNAPSHOT版本都會
覆蓋
先前版本,而不是生成新的版本號
2.2、通過Nexus下載jar包
- 修改
settings.xml
<mirrors><mirror><id>nexus-mirror</id> <!-- 這是鏡像倉庫的唯一標(biāo)識符,不用于認證 --><mirrorOf>central</mirrorOf> <!-- 重定向中央倉庫的請求 --><url>http://your-nexus-repo-url/repository/maven-public/</url></mirror>
</mirrors><servers><server><id>nexus-mirror</id> <!-- 如果上面?zhèn)}庫需要認證,這個ID必須與上面id一致 --><username>your-username</username><password>your-password</password></server>
</servers>
- url標(biāo)簽的來源
- 本地倉庫下載完包以后,nexus的組倉庫
maven-public
就能看見jar包了
- 若下載速度太慢,可以設(shè)置私服中中央倉庫的地址為
阿里云倉庫地址
2.3、將jar包部署到Nexus
步驟 1:在pom.xml中配置發(fā)布倉庫
- 一個用于發(fā)布
正式的release版本
,另一個用于發(fā)布snapshot(快照)版本
<distributionManagement><repository><id>nexus-releases</id> <!-- 正式發(fā)布倉庫的 ID --><url>http://your-nexus-repo-url/repository/maven-releases/</url> <!-- Nexus Releases 倉庫的 URL --></repository><snapshotRepository><id>nexus-snapshots</id> <!-- 快照倉庫的 ID --><url>http://your-nexus-repo-url/repository/maven-snapshots/</url> <!-- Nexus Snapshots 倉庫的 URL --></snapshotRepository>
</distributionManagement>
步驟 2:在 settings.xml 中配置認證信息
- 為
distributionManagement
中的倉庫id添加相應(yīng)的認證信息
<servers><server><id>nexus-releases</id> <!-- 對應(yīng) pom.xml 中的 repository ID --><username>your-username</username><password>your-password</password></server><server><id>nexus-snapshots</id> <!-- 對應(yīng) pom.xml 中的 snapshotRepository ID --><username>your-username</username><password>your-password</password></server>
</servers>
- 上傳成功
3、repositories和mirrors
3.1、repositories(倉庫)
??repositories
是Maven用于查找和下載項目依賴的遠程或本地存儲庫
。Maven在構(gòu)建項目時,會從這些倉庫中查找所需的依賴(如 JAR 包)并下載到本地存儲庫。
主要功能
- 定義Maven用來查找項目依賴的存儲庫位置
- 可以在
pom.xml
中為每個項目單獨配置,也可以在settings.xml
中全局配置
示例
在 pom.xml
中定義倉庫:
<repositories><repository><id>company-repo</id> <!-- 倉庫的唯一 ID,用于認證等 --><url>http://your-company-repo-url/repository/maven-releases/</url> <!-- 倉庫 URL --><releases><enabled>true</enabled> <!-- 指定是否用于發(fā)布版本 --></releases><snapshots><enabled>false</enabled> <!-- 指定是否用于快照版本 --></snapshots></repository>
</repositories>
3.2、mirrors(鏡像)
??mirrors
用于對某個特定倉庫(如Maven中央倉庫)的請求重定向
到另一個倉庫(如公司內(nèi)部的Nexus倉庫)。它的主要作用是將對中央倉庫、快照倉庫等的請求重定向到另一個地方。
主要功能
- 當(dāng)Maven請求中央倉庫時,它會自動將請求轉(zhuǎn)發(fā)到定義的鏡像倉庫,而不需要手動配置每個項目的
repositories
- 配置在
settings.xml
中(而不是pom.xml
),適用于全局配置
示例
在 settings.xml
中定義鏡像:
<mirrors><mirror><id>nexus-mirror</id> <!-- 鏡像倉庫的唯一標(biāo)識符 --><mirrorOf>central</mirrorOf> <!-- 指定要鏡像的倉庫,如 Maven 中央倉庫 --><url>http://your-company-repo-url/repository/maven-public/</url> <!-- 鏡像倉庫的 URL --></mirror>
</mirrors>
id
:為鏡像指定的唯一標(biāo)識符。它可以是任意值,用于區(qū)分不同的鏡像配置mirrorOf
:定義要鏡像的倉庫。常見的值包括:central
:表示Maven中央倉庫
*
:表示鏡像所有倉庫
repo1,repo2
:表示鏡像多個指定的倉庫
!central
:表示鏡像所有倉庫,除了中央倉庫
url
:鏡像倉庫的實際URL,Maven將通過這個URL下載依賴