Maven入門
mvn的常用指令
- mvn -v:查看maven版本
- mvn -compile:編譯
- mvn -test:測試
- mvn- package:打包
- mvn -clean:刪除target目錄
- mvn -install:安裝jar包到本地倉庫中。
當(dāng)項(xiàng)目缺乏依賴時(shí)攒巍,需要將jar包添加到本地倉庫中嗽仪,或者從網(wǎng)上下載后添加到本地倉庫中。比如我們要開發(fā)SpringBoot應(yīng)用柒莉,就需要添加如下依賴闻坚。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
groupId
是項(xiàng)目組織名,artifactId
是項(xiàng)目名兢孝。groupId一般的格式是域.公司
窿凤,比如com.tencent,如果它有項(xiàng)目名為qq跨蟹,那么包名一般就是com.tencent.qq卷玉。
自動(dòng)化創(chuàng)建項(xiàng)目的目錄骨架
創(chuàng)建目錄可以使用下面的命令
1. mvn archetype:generate 按照提示進(jìn)行選擇
2. mvn archetype:generate -DgroupId=組織名
-DartifactId=項(xiàng)目名-模塊名
-Dversion=版本號
-Dpackage=項(xiàng)目所在的包
倉庫
Maven的中央倉庫訪問起來可能比較慢,通過設(shè)置鏡像倉庫喷市,可以改善這個(gè)問題,推薦使用阿里云的鏡像威恼。在settings.xml
中添加如下<mirror>
標(biāo)簽
<mirrors>
<mirror>
<id>nexus-ailiyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus ailiyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
</mirrors>
從網(wǎng)上的倉庫中下載下來的jar包會(huì)保存在本地品姓,下次添加依賴時(shí)如果本地倉庫中已經(jīng)存在了,就不必從網(wǎng)上下載了箫措。本地倉庫默認(rèn)位置在C:Users/your-username/.m2
腹备,如果要更換默認(rèn)位置,可以修改settings.xml
文件
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
將<localRepository>
取消注釋斤蔓,選一個(gè)合適的路徑來作為本地倉庫植酥。
pom.xml
pom是maven項(xiàng)目的核心管理文件,用于項(xiàng)目描述、組織管理友驮、依賴管理和構(gòu)建信息的管理漂羊。
<?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">
<!-- 指定了當(dāng)前pom的版本 -->
<modelVersion>4.0.0</modelVersion>
<groupId>com.shy(組織域名的反寫)</groupId>
<artifactId>springboot(項(xiàng)目名)</artifactId>
<!-- 0.0.1-SNAPSHOT
第一個(gè)0表示大版本
第二個(gè)0表示分支版本號,第三個(gè)1表示小版本號
SNAPSHOT表示快照版本
ALPHA表示內(nèi)測版
BETA表示公測版
RELEASE表示穩(wěn)定版
-->
<version>0.0.1-SNAPSHOT(版本號)</version>
<!-- maven項(xiàng)目的打包方式卸留,默認(rèn)是jar走越,也可以打包成war、zip耻瑟、pom -->
<packaging>jar</packaging>
<!-- 項(xiàng)目名 -->
<name>springboot</name>
<!-- 項(xiàng)目的描述 -->
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<!-- 依賴范圍旨指,表示Junit只在測試環(huán)境下使用
還有以下范圍
compile:默認(rèn)的范圍,編譯測試運(yùn)行都有效喳整;
provided:在編譯和測試時(shí)有效谆构,在實(shí)際運(yùn)行時(shí)不會(huì)被加入
system: 在編譯和測試時(shí)有效,與本機(jī)系統(tǒng)相關(guān)聯(lián),可移植性差
import: 只使用在 dependencyManagement標(biāo)簽中框都,表示從其他的pom中導(dǎo)入dependency配置
-->
<scope>test</scope>
<!-- <optional></optional>設(shè)置依賴是否可選 -->
<!--
exclusions設(shè)置排除依賴傳遞的列表搬素。如果A依賴于B,B又依賴于C瞬项,我們說存在依賴關(guān)系蔗蹋,在A中引入B時(shí)候,會(huì)自動(dòng)引入C囱淋。如果不想引入C猪杭,可以在exclusions中將其排除。
<exclusions></exclusions>
-->
</dependency>
</dependencies>
<build>
<!-- 插件類妥衣,也要指定“坐標(biāo)” -->
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
依賴范圍
- compile:默認(rèn)的范圍皂吮,編譯測試運(yùn)行都有效;
- provided:在編譯和測試時(shí)有效税手,在實(shí)際運(yùn)行時(shí)不會(huì)被加入
- test:只在測試環(huán)境下使用
- system: 在編譯和測試時(shí)有效,與本機(jī)系統(tǒng)相關(guān)聯(lián)蜂筹,可移植性差
- import: 只使用在 dependencyManagement標(biāo)簽中,表示從其他的pom中導(dǎo)入dependency配置
依賴傳遞
exclusions標(biāo)簽:設(shè)置排除依賴傳遞的列表芦倒。如果A依賴于B艺挪,B又依賴于C,我們說存在依賴關(guān)系兵扬,在A中引入B時(shí)候麻裳,會(huì)自動(dòng)引入C。如果不想引入C器钟,可以在exclusions中將其排除津坑。
依賴沖突
1、短路徑優(yōu)先
如果有兩條依賴傳遞關(guān)系
1) A -> B -> C -> X(jar)
2) A -> D -> X(jar)
會(huì)選擇短的路徑2傲霸。
2疆瑰、誰先聲明誰優(yōu)先
在pom文件中眉反,哪個(gè)依賴寫在前面就優(yōu)先引用該依賴。
繼承
用于在子模塊中對父模塊的一個(gè)pom的繼承穆役,作用就是對代碼的復(fù)用寸五。比如在SpringBoot項(xiàng)目的pom文件中就有下面的幾行。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
模塊的聚合
如果我們的項(xiàng)目分成了好幾個(gè)模塊孵睬,那么我們構(gòu)建的時(shí)候是不是有幾個(gè)模塊就需要構(gòu)建幾次了(到每個(gè)模塊的目錄下執(zhí)行mvn命令)播歼?當(dāng)然,你逐個(gè)構(gòu)建沒問題掰读,但是非要這么麻煩的一個(gè)一個(gè)的構(gòu)建嗎秘狞,那么簡單的做法就是使用聚合,一次構(gòu)建全部模塊蹈集。
<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.youzhibing.account</groupId>
<artifactId>account-aggregator</artifactId>
<version>1.0.0-SNAPSHOT</version>
<!-- 聚合pom.xml文件的打包方式必須是pom -->
<packaging>pom</packaging>
<modules> <!-- 模塊都寫在此處 -->
<module>account-register</module>
<module>account-persist</module>
</modules>
</project>
如上烁试,只需對account-aggregator進(jìn)行打包,就能一次性構(gòu)建所有模塊了拢肆。聚合POM與繼承中的父POM的packaging標(biāo)簽都必須是pom减响。
dependencies和dependencyManagement的區(qū)別
- dependencies即使在子項(xiàng)目中不寫該依賴項(xiàng),那么子項(xiàng)目仍然會(huì)從父項(xiàng)目中繼承該依賴項(xiàng)(全部繼承)
- dependencyManagement里只是聲明依賴郭怪,并不實(shí)現(xiàn)引入支示。如果在子項(xiàng)目不聲明依賴,是不會(huì)從父項(xiàng)目中繼承下來的鄙才;所以要添加依賴還需顯式聲明颂鸿,如果沒有指定具體版本,會(huì)從父項(xiàng)目中繼承該項(xiàng)攒庵,并且version和scope都讀取自父pom;但是如果子項(xiàng)目中指定了版本號嘴纺,那么就使用子項(xiàng)目中指定的jar版本。