一、Maven是什麼?有什麼優點?
Maven介紹
Maven項目對象模型(POM),可以通過一小段描述信息來管理項目的構建,報告和文檔的項目管理工具軟件
Maven優點
- 解決jar包衝突的問題
- 解決jar包依賴的問題
- jar文件不用在每個項目保存,只需要放在倉庫
- maven可以指定jar的依賴範圍
二、Maven目錄結構
Maven創建項目的的目錄結構大體如圖所示,src下包含main和test目錄,這兩個目錄下又包含java和resources目錄,分別存放項目的代碼以及測試的代碼
target目錄下的class目錄則是存放編譯後的代碼
而Maven的核心文件pom.xml便是資源文件,確定該項目需要使用哪些jar包的座標,並通過該座標在中央倉庫進行自動下載。
三、利用Idea開發工具創建Maven項目
四、配置本地倉庫
首先本地倉庫是什麼?
英文名爲localRepository,它是用來存儲從遠程倉庫或中央倉庫下載的插件和jar包,項目使用一些插件或jar包,優先從本地倉庫查找。
作爲使用者,我們往往想指定自己創建的一個目錄作爲本地倉庫,那我們應該怎麼做呢?
做法其實很簡單,我們找到Maven安裝目錄下的conf目錄下的settings.xml
然後修改settings.xml文件的內容
在框中的標籤裏將你指定的目錄地址替換掉就ok了,這樣以後通過Maven下載的jar包都會存在這裏,當本地倉庫沒有對應的jar包的時候,Maven會自己去中央倉庫中尋找並下載到本地倉庫。
五、有關Maven常用的項目構建命令
下圖表格是Maven常用的項目構建命令
命令 | 描述 |
---|---|
mvn clean | 清除項目原來的編譯結果 |
mvn compile | 編譯源文件 |
mvn test | 運行測試代碼 |
mvn package | 打包項目war/jar |
mvn install | 打包並安裝到本地倉庫 |
mvn deploy | 發佈到本地倉庫或者服務器 |
六、Maven座標
Maven座標的主要組成
groupId:定義當前Maven項目的隸屬項目、組織
artifactId:定義實際項目的一個模塊
version:定義當前項目的版本
packaging:定義該項目的打包方式(jar/war,默認爲jar)
例子:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
那我們如何去讓Maven自動下載我們想要的jar包
首先我們去官網https://mvnrepository.com/在裏面搜索我們想要的jar包
比如 mysql-connector-java這個包
然後點擊search,點擊下圖所示
這裏有這個包的各種版本,點擊你想要的的版本
然後就能看到對應的座標了,將這個座標信息複製到pom.xml文件的dependencses標籤下,Maven就會自動下載jar包並放進本地倉庫
七、Maven的依賴範圍
在每個dependency標籤裏面都有一個子標籤scope
他有以下幾個屬性
- compile:編譯域,這個是Maven中scope的默認值,不寫scope配置時默認就是使用這個值,compile表示被依賴項目需要同當前項目編譯時一起編譯,項目測試期以及本項目運行時同樣生效,打包的時候需要包含進去
- test:測試域,表示被依賴的項目僅僅在項目進行測試時生效,項目運行時不會生效
- provided:表示打包的時候不用講provided域的包打進去
- runtime:運行域,表示被依賴的項目不會參與項目的編譯,但項目的測試時期和運行時期會參與,與compile相比,跳過了編譯時期。
- system:跟provide相似,但是在系統中要以外部jar包的形式提供,Maven不會在倉庫中查找它
- import:只使用在< dependencyManagement >中,表示從其他pom文件中導入dependency的配置
八、Maven可選依賴和依賴排除
可選依賴:是否希望將該依賴向下傳遞? 默認爲false,向下傳遞,如果選擇true則不向下傳遞
<!-- spring-boot-devtools -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional> <!-- 表示依賴不會傳遞 -->
</dependency>
排除依賴:
如果一個項目A依賴另一個項目B時,會將B項目的依賴jar包都會依賴。
但如果不想依賴B項目中的某一個依賴時,可設置exclusions排除指定的依賴
<!-- 定時任務 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<exclusions>
<exclusion>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
</exclusion>
</exclusions>
九、Maven項目的繼承
作用:在使用的時候子工程直接繼承父工程的版本號,子工程中不再需要指定版本號,方便統一管理項目的依賴版本問題。
下面用代碼展示
首先創建一個父工程
<?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>
<groupId>org.learn.maven</groupId>
<artifactId>mavendemo-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>mavendemochild</module>
</modules>
<packaging>pom</packaging>
<description>父工程</description>
<!--抽取子工程的依賴-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.1.7.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
我們可以看到有一個dependencyManagement標籤,父工程在這個標籤下定義子工程依賴的jar包
然後再創建一個子工程
<?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">
<!--引用父工程-->
<parent>
<artifactId>mavendemo-parent</artifactId>
<groupId>org.learn.maven</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>org.learn.maven</groupId>
<artifactId>mavendemochild</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
</dependencies>
</project>
這個時候子工程的座標中就不需要定義version這個標籤了,由父類統一管理
同時要注意子類的pom.xml文件中parent標籤裏要將父工程的座標複製過去
十、Maven的聚合
Maven:將多個Maven模塊整合在一起稱爲聚合
好處:可以將多個模塊整體運行,不需要先將被依賴的模塊打包至倉庫再運行項目。
假如MavenA 依賴MavenB,如果只是在MavenA模塊的pom.xml中dependency MavenB,則必須先將MavenB安裝並打包至倉庫。
通常我們會新創建一個聚合項目,這個項目作爲一個載體將項目的所有的模塊都整合在一起。
我們只需要在這個載體上加上
<modules>
<module>MavenA</module>
<module>MavenB</module>
</modules>
下面舉個例子:
首先創建mavendemoservice項目
pom.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>
<groupId>org.learn.maven</groupId>
<artifactId>mavenservice</artifactId>
</project>
創建mavenweb模塊,增加service的依賴,但是我們此前是沒有把mavendedoservice這個模塊install進倉庫的
pom.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>
<groupId>org.learn.maven</groupId>
<artifactId>mavenweb</artifactId>
<!--依賴Service模塊-->
<dependencies>
<dependency>
<groupId>org.learn.maven</groupId>
<artifactId>mavenservice</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
再創建一個作爲載體的工程
pom.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>
<groupId>org.learn.maven</groupId>
<artifactId>mavendemo-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>mavenservice</module>
<module>mavenweb</module>
</modules>
<packaging>pom</packaging>
<description>父工程</description>
<!--抽取子工程的依賴-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.1.7.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
在modules標籤下創建module,注意module裏面寫的是要聚合項目的路徑,可以用相對路徑
本篇文章依舊是作爲個人的學習筆記,如有見解不到之處還望指教
有蠻多內容是從這個博客學習的,附上鏈接