一、Maven 坐標
(一)概念
在 Maven 中坐標是構件的唯一標識,其元素包括 groupId、artifactId、version、packaging、classifier。其中 groupId、artifactId、version 是必定義項,packaging 默認為 jar。
(二)意義
為 Maven 世界中海量構件提供統一規范的唯一標識,便于機器自動查找。
(三)含義詳解
-
groupId :組織標識,通常是公司網址反寫加項目名(如 com.example.project)。
-
artifactId :項目名,一般格式為項目名 - 模塊名(如 myproject - core)。
-
version :版本號,形式如 0.0.1 - SNAPSHOT。第一位大版本號,第二位分支版本號,第三位小版本號。后綴有特定含義,如 SNAPSHOT(快照版本)、ALPHA(內測)、BETA(公測)、RELEASE(穩定)、GA(正式發布)。
-
packaging :打包方式,常見有 pom、jar、war 等。
-
classifier :輔助定義構件輸出的附屬構件。
-
如圖:
二、依賴
(一)意義
解決項目中對各類外部庫的依賴管理難題,Maven 能自動下載并妥善放置依賴至本地倉庫,通過在 POM 文件 dependencies 元素內聲明依賴關系。
(二)使用示例
以引入 junit - 4.9.jar 包為例:
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.9</version><scope>test</scope>
</dependency>
屬性說明:三維坐標用于定位依賴包;scope 控制依賴包在何種場景加入 classpath,可去 Maven 官網中央倉庫查找依賴。
(三)依賴范圍
Maven 項目開發涉及三套 classpath:
-
主代碼 :main 下主代碼編譯依賴。
-
測試代碼 :test 下測試代碼編譯依賴。
-
運行時 :main 代碼運行時依賴。
依賴范圍通過 scope 標簽設置,共 6 種:
-
compile :默認,對編譯、測試、運行 classpath 都有效。
-
test :僅對測試 classpath 有效,如 JUnit。
-
provided :對編譯與測試有效,運行時無效。例如 web 開發中 servlet - api,編譯測試用到,運行時由容器提供,打 war 包時不放入 WEB - INF/lib。
-
runtime :與 provided 相對,運行時有效。像 jdbc 編寫是接口規范,運行需具體實現類 jar 包。
-
例如:
(四)依賴傳遞與可選依賴
-
依賴傳遞 :若 A 依賴 B,C 依賴 A,則 C 也會依賴 B。
-
依賴阻斷 :B 中加入
<optional>true</optional>
標簽,B 就不會被傳遞。 -
可選依賴 :要排除依賴中某項,用 exclusion 屬性。例如在 C 中排除 A 中的 B 依賴,示例代碼如下:
<dependency><groupId>a - group</groupId><artifactId>a - artifact</artifactId><version>a - version</version><exclusions><exclusion><groupId>b - group</groupId><artifactId>b - artifact</artifactId></exclusion></exclusions>
</dependency>
三、倉庫
(一)概述
Maven 倉庫是存放項目依賴的第三方庫等構件的地方,幫助管理構件。
倉庫類型有本地、中央、遠程倉庫。
(二)本地倉庫
-
初次執行 Maven 命令時創建,默認在用戶目錄下(Linux 和 Windows 均如此),路徑為%USER_HOME%/.m2/repository/。
-
運行 Maven 時,優先從本地倉庫獲取構件,若沒有則從遠程倉庫下載至本地再使用。
-
可通過修改%Maven_HOME%/conf/settings.xml 文件中的配置更改默認位置。
(三)中央倉庫
-
由 Maven 社區管理,包含大量常用開源 Java 構件及相關信息。
-
無需額外配置,但需網絡訪問。
(四)依賴搜索順序
四、繼承和聚合
(一)繼承
-
意義 :避免重復配置,提升項目安全性與管理便捷性。多個子模塊可繼承父模塊的公共配置,如公共依賴、插件配置、倉庫地址等。
-
可繼承 POM 元素 :groupId :項目組 ID,項目坐標的核心元素;version :項目版本,項目坐標的核心元素;description :項目的描述信息;organization :項目的組織信息;inceptionYear :項目的創始年份;url :項目的 url 地址;developers :項目的開發者信息;contributors :項目的貢獻者信息;distributionManagement :項目的部署信息;issueManagement :缺陷跟蹤系統信息;ciManagement :項目的持續集成信息;scm :項目的版本控制信息;mailingListserv :項目的郵件列表信息;properties :自定義的 Maven 屬性;dependencies :項目的依賴配置;dependencyManagement :項目的依賴管理配置;repositories :項目的倉庫配置;build :包括項目的源碼目錄配置、輸出目錄配置、插件配置、插件管理配置等;reporting :包括項目的報告輸出目錄配置、報告插件配置等。
-
IDEA 實現 Maven 繼承 :以創建父子項目為例,創建父類項目,再創建子類項目 core、manage、portal 等,子模塊繼承父模塊,觀察父子項目的 pom 文件配置差異。
-
如圖
????????創建父類項目?
??
????????創建子類項目core?
????????以同樣的方式創建manage和portal項目:?
????????至此,一個由parent統一管理core,manage和portal的mavan項目就創建好了;
觀察父子項目的pom文件配置
(二)聚合
暫未在原文中明確提及聚合相關內容,通常聚合用于構建多模塊項目,將多個模塊聚合在一起構建。
(三)properties 屬性使用
通過 properties 元素定義 Maven 屬性,在其他地方以 ${屬性名稱} 引用,消除重復,統一管理。如統一聲明 Spring Framework 版本,避免多處重復聲明。