maven详解2020
maven概述
1.概念
Maven這個單詞來自于意第緒語(猶太語),意為知識的積累,最初在Jakata Turbine項目中用來簡化構建過程。當時有一些項目(有各自Ant build文件),僅有細微的差別,而JAR文件都由CVS來維護。于是希望有一種標準化的方式構建項目,一個清晰的方式定義項目的組成,一個容易的方式發布項目的信息,以及一種簡單的方式在多個項目中共享JARs。于是maven誕生了。
在我們的日常項目中,maven不僅是一個依賴管理工具,有效的幫我們管理項目中需要使用到的各種依賴,也是一個項目構建工具,可以通過其內置的項目模板(也稱為骨架 archetype),構建常規的項目(jar war等)。使用的maven項目的對象模型(pom-project object model),可以通過一小段描述信息來管理項目的構建,報告和文檔的管理。
2.為什么要用maven
這里舉個生活中的例子,比如此時的你想要配一臺主機來玩游戲,那么你需要去選購組成這個主機的各種配件,進而需要去了解各種配件的性能,配件之間的兼容性,組裝好后還需要自己裝操作系統和驅動程序,這使得不熟悉組裝電腦主機的你需要花費大量的時間,最后的結果還可能是你的主機運行不穩定,經常藍屏。在這個時候突然有個人告訴你,你可以去某個知名的電商平臺,你可以瀏覽一下主流的機型,選擇了你需要的配置,然后下單、付款。接著PC供應商幫我組裝電腦、安裝操作系統和驅動程序,物流公司將電腦送到我的家里,你接上顯示器、電源、鼠標和鍵盤就能直接使用了。這為你節省了大量時間,而且這臺電腦十分穩定,商家在把電腦發送給你之前已經進行了很好的測試。這難道不香嗎?
在日常的團隊開發中,這種找配件組裝"主機"的方式,顯得更雜亂無序,既無法有效的確保依賴之間的兼容性,又不能保證資源的重用型,且無法擺脫對代碼工具的依賴,對于大型項目的開發,框架的整合,依賴的管理帶來了很大的困擾。而使用maven這個強大的依賴管理,項目工具,你的問題將迎刃而解,它將幫我們完成,自動關聯,拉取依賴,升級框架,依賴有效管理,自動測試,打包部署等,所以我們要說maven :yes。
maven安裝與簡單使用
1.安裝
1.1 下載
前往https://maven.apache.org/download.cgi下載最新版的Maven程序
1.2 解壓與環境變量的配置
然后將文件解壓到你自己想要存放的目錄下(如D:\Program Files (x86)\apache-maven-3.6.1):
環境變量配置:
新建環境變量MAVEN_HOME,賦值D:\Program Files (x86)\apache-maven-3.6.1
編輯環境變量Path,追加%MAVEN_HOME%\bin;
至此,maven已經完成了安裝,我們可以通過DOS命令檢查一下我們是否安裝成功:
1.3 修改本地倉庫及鏡像
maven倉庫引用結構
本地倉庫(local)->自己在磁盤創建的用以存放資源的文件夾;
私服鏡像(aliyun)->常使用國內資源鏡像,提升資源拉取速度;
中央倉庫central->maven官方倉庫資源。
maven資源拉取方式
在maven的pom配置文件中國配置項目所需的依賴,在項目保存時,maven將自動通過你配置的坐標路徑去拉取依賴資源,首先會去掃描本地倉庫,若有,直接獲取,若無,將會前往所配置的私服鏡像去拉取相關的依賴資源。
倉庫配置
進入你的maven文件安裝目錄,找到conf配置文件夾,修改setting.xml,修改本地倉庫位置
修改鏡像源,拉取國內資源的路徑配置 setting.xml
通過以上步驟,已經完成了maven的安裝與簡單配置。
1.4 maven常用命令
maven comand
// 編譯源代碼 mvn compile // 運行測試 mvn test // 項目打包 mvn package // 清除產生的項目 mvn clean //項目打包時跳過測試 mvn package -Dmaven.test.skip=ture1.5 maven坐標
maven pointer
//定義當前 Maven 項目從屬的實際項目,表述形式同 Java 包名的表述方式類似,通常與域名反向一一對應 groupId //定義實際項目中的一個 Maven 項目(實際項目中的一個模塊),表述形式為當前項目名 artifactId //定義 Maven 當前所處的版本 version //定義 Maven 項目的打包方式 packaging //定義構件輸出的附屬構件 classifier //依賴描述: type: 依賴的類型 scope: 依賴的范圍 optional: 標記依賴是否可選 exclusions: 用來排除傳遞性依賴2.maven使用
2.1 構建一個簡單的項目
簡單的java se項目 jar
# 在你的磁盤中新建文件加,用以存放maven創建的項目 然后cmd 切換到你的文件夾路徑,執行以下代碼片段 # 生成java se 項目 mvn archetype:generate -DarchetypeCatalog=internal -DgroupId=com.zglt.build -DartifactId=demo # cmd 切換到你的項目路徑下即在pom.xml的目錄下運行以下代碼 mvn clean compile exec:java -Dexec.mainClass="com.zglt.build.App" # 將項目程序打包,用以發布 mvn packagemaven構建普通項目的結構
└─src classPath項目源碼根目錄├─main 主要│ ├─java java源碼│ │ └─com │ │ └─zglt│ │ └─build com.zglt.build包名│ └─resources 資源: 配置文件(約定優于配置)└─test 用于單元測試的相關包└─java└─com└─zglt└─build pom.xml 項目對象模型配置(依賴管理等)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.zglt.build</groupId><!-- 團隊信息,組id--><artifactId>demo</artifactId><!-- 項目名--><version>1.0-SNAPSHOT</version><!-- 項目版本--><!-- 打包類型 --><packaging>jar</packaging><!-- 項目名 --><name>demo</name><!-- 官方網站 --><url>http://maven.apache.org</url><!-- 項目屬性 --><properties><!-- 項目構建時的字符編碼集 --><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><!-- 依賴: druid gson --><dependencies><!-- 單元測試工具包 ,使用dependency標簽配置項目所需要的依賴,需要描述所需依賴的坐標,maven將通過配置的坐標自動去倉庫拉取對應的依賴--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency></dependencies> </project>maven生命周期
1.概念
maven基于構建生命周期的中心概念,定義了項目構建的每一個階段過程,對于構建項目的人員,這意味著只需要學習一小堆命令即可構建任何Maven項目,POM將確保他們獲得所需的結果。
2.默認生命周期
檢驗
(validate) - 驗證項目是否正確,所有必要的信息是否可用;
初始化
(initialize)項目文件配置初始化;
編譯
(compile) - 編譯項目的源代碼;
單元測試
(test) - 使用合適的單元測試框架測試編譯的源代碼(這些測試不應該要求代碼被打包或部署)
打包
(package) - 采用編譯的代碼,并以其可分配格式(如JAR)進行打包;
集成測試
(verify) - 對集成測試的結果執行任何檢查,以確保滿足質量標準;
安裝
(install) - 將軟件包安裝到本地存儲庫中,用作本地其他項目的依賴項;
部署
(deploy) - 在構建環境中完成,將最終的包復制到遠程存儲庫以與其他開發人員和項目共享。
maven依賴管理
1.依賴范圍
a.compile 默認的范圍,編譯測試運行都有效;
b.provided 編譯和測試時有效,最后是在運行的時候不會被加入,如servlet api;
c.runtime 在測試和運行時有效,如MYSQL JDBC DRIVER;
d.test 在測試時有效,如junit;
e. system 與本機系統相關聯,編譯/測試/運行時有效;
f. import 導入的范圍,它只在使用dependencyManagement中,表示從其他pom中導入dependecy的配置。
2.依賴傳遞
在maven中,依賴是可以傳遞的,就是說假設存在三個項目,分別是項目c,項目b以及項目a,假設a依賴于b,b依賴于c,那么我們可以根據Maven項目依賴的特征不難推出項目a也依賴于c(只有編譯時和運行時依賴是傳遞的),所謂的傳遞依賴,簡單的說,a的運行需要b的存在,那么a依賴于b,而b的運行又需要c的存在,那么b依賴于c,根據需求傳遞,那么可以推出a的運行需要c的存在。
3.依賴沖突
同理在一個項目中,既然存在依賴之間的傳遞,那么當依賴發生沖突的時候,maven又是怎么進行依賴管理的呢,我們舉例說明什么是依賴沖突,假設有如下的依賴樹:
最短路徑原則
A | B | | | C | C可以看出項目A存在有2個直接的依賴B,C和一個間接的依賴C,此時對于項目A來說,將會有兩個版本的C,從而產生版本沖突,也就是是所說的依賴沖突,maven在解決如下沖突時,使用最短路徑原則,亦即這里的A項目將直接依賴最短路徑的C。
優先聲明原則
A | B | | | C 1.0 優先 | E | | | C 2.0可以看出項目A存在有2個直接的依賴B,E和2個間接的依賴C,此時對于項目A來說,將會有兩個版本的C且路徑距離相同,從而產生依賴沖突,maven在解決如下沖突時,使用優先聲明原則,亦即這里的A項目將直接依賴于優先在pom中聲明的C 1.0版本。
總結
以上是生活随笔為你收集整理的maven详解2020的全部內容,希望文章能夠幫你解決所遇到的問題。