Maven使用與學習 一、Maven是什麼 maven像是一種管理的工具,實現的原理是使用插件。比如說,一個公司需要做一個項目,這個項目被分成了很多模塊,每個模塊又分成了許多的業務,這些最後都需要整合到一起。那麼就會出現一個很大的問題,在項目開發中每個人使用的jar包版本、軟體版本等如果不一樣的話, ...
Maven使用與學習
一、Maven是什麼
-
maven像是一種管理的工具,實現的原理是使用插件。比如說,一個公司需要做一個項目,這個項目被分成了很多模塊,每個模塊又分成了許多的業務,這些最後都需要整合到一起。那麼就會出現一個很大的問題,在項目開發中每個人使用的jar包版本、軟體版本等如果不一樣的話,就算單個模塊可以執行,一旦整合就會出現各種各樣的問題。那麼如何避免這些問題或者最大程度上減少這種情況發生呢?那麼就要用到maven。它更像是每個開發者從網上的一個中央倉庫獲取到開發所需要的jar包,並且可以把自己完成的項目打包發佈到這個倉庫中,供其他開發人員使用,同時項目經理可以統一開發所需要的版本、jar包等,最大程度上減少這種非技術問題的情況發生。
-
Maven 字面意思:專家、內行
-
Maven是一款自動化構建工具,專註服務於Java平臺的項目構建和依賴管理。
-
依賴管理:jar之間的依賴關係,jar包管理問題統稱為依賴管理
-
項目構建:項目構建不等同於項目創建
- 項目構建是一個過程【7步驟組成】,項目創建是瞬間完成的
- 清理:mvn clean
- 編譯:mvn compile
- 測試:mvn test
- 報告:
- 打包:mvn package
- 安裝:mvn install
- 部署:
- 項目構建是一個過程【7步驟組成】,項目創建是瞬間完成的
二、為什麼使用maven
1.獲取jar包
- 使用Maven之前,自行在網路中下載jar包,效率較低。如【谷歌、百度、CSDN....】
- 使用Maven之後,統一在一個地址下載資源jar包【阿裡雲鏡像伺服器等...】
2.添加jar包
-
使用maven之前,將jar複製到項目文件中,相對浪費存儲空間
-
使用maven之後,jar包統一存儲到Maven本地倉庫,使用坐標方式把jar包引入到項目中
3.使用maven便於解決jar包衝突及依賴問題
三、Maven的POM
POM:Project Object Model【項目對象模型】,將項目封裝為對象模型,便於使用Maven管理【構建】項目
pom.xml:是maven的核心配置文件,一個maven項目有且只有一個
四、Maven的目錄結構
-
項目名
-
src【書寫java源代碼】
-
main【書寫java主程式代碼】
- java【書寫java代碼】
- resources【書寫配置文件代碼】
-
test【書寫測試代碼】
- java【書寫測試java代碼】
-
pom.xml【書寫配置文件代碼】
-
target【編譯後目錄結構】
-
-
五、Maven的生命周期
Maven生命周期:按照順序執行各個命令,Maven生命周期包含以下三個部分組成
- Clean LifeCycle:在進行真正的構建之前進行一些清理工作。
- Default LifeCycle:構建的核心部分,編譯,測試,打包,安裝,部署等等。
- Site LifeCycle:生成項目報告,站點,發佈站點。
六、Maven的插件和目標
- 插件:本質上由jar包和配置文件組成
- 目標:每個插件都能實現多個功能,每個功能就是一個插件目標。
七、Maven的倉庫【重要】
- 倉庫分類
- 本地倉庫:為當前電腦提供maven服務
- 遠程倉庫:為其他電腦也可以提供maven服務
- 私服:架設在當前區域網環境下,為當前區域網範圍內的所有Maven工程服務。
- 中央倉庫:架設在Internet上,為全世界所有Maven工程服務。
- 中央倉庫的鏡像:架設在各個大洲,為中央倉庫分擔流量。減輕中央倉庫的壓力,同時更快的響應用戶請求。
- 倉庫中的文件類型【jar包】
- Maven的插件
- 第三方框架或工具的jar包
- 自己研發的項目或模塊
八、Maven的坐標【重要】
-
作用:使用坐標引入jar包
-
坐標由g-a-v組成
[1]groupId:公司或組織的功能變數名稱倒序+當前項目名稱
[2]artifactId:當前項目的模塊名稱
[3]version:當前模塊的版本
-
註意
- g-a-v:本地倉庫jar包位置
- a-v:jar包全名
-
坐標應用
- 坐標參考網址:http://mvnrepository.com
<dependency>
<groupId>com.shujia</groupId>
<artifactId>mysql-demo2</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
九、依賴範圍
依賴語法:<scope>
- compile【預設值】:在main、test、Tomcat【伺服器】下均有效。
- test:只能在test目錄下有效
- junit
- provided:在main、test下均有效,Tomcat【伺服器】無效。
- servlet-api
十、依賴的傳遞性
- 路徑最短者優先【就進原則】
- 先聲明者優先
- 註意:Maven可以自動解決jar包之間的依賴問題
十一、Maven統一版本號
語法:
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<hadoop-version>2.7.6</hadoop-version>
</properties>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>${hadoop-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>${hadoop-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>${hadoop-version}</version>
</dependency>
</dependencies>
十二、Maven的繼承
第一種方式
-
在父工程中的pom.xml中導入jar包,在子工程中統一使用。【所有子工程強制引入父工程jar包】
- 父工程pom.xml依賴
<dependencies> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.49</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>${hadoop-version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>${hadoop-version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>${hadoop-version}</version> </dependency> </dependencies>
子過程不寫任何依賴,自動引入父工程所有的包
第二種方式
使用
<dependencyManagement>
<dependencies>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>${hadoop-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>${hadoop-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>${hadoop-version}</version>
</dependency>
在子工程引入父工程的相關jar包
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
註意:在子工程中,不能指定版本號
十三、 Maven的聚合
為什麼使用Maven的聚合
- 優勢:只要將子工程聚合到父工程中,就可以實現效果:安裝或清除父工程時,子工程會進行同步操作。
- 註意:Maven會按照依賴順序自動安裝子工程