Maven入門
mvn的常用指令
- mvn -v:查看maven版本
- mvn -compile:編譯
- mvn -test:測試
- mvn- package:打包
- mvn -clean:刪除target目錄
- mvn -install:安裝jar包到本地倉庫中。
當項目缺乏依賴時,需要將jar包添加到本地倉庫中,或者從網(wǎng)上下載后添加到本地倉庫中。比如我們要開發(fā)SpringBoot應(yīng)用,就需要添加如下依賴。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
groupId是項目組織名,artifactId是項目名。groupId一般的格式是域.公司,比如com.tencent,如果它有項目名為qq,那么包名一般就是com.tencent.qq。
自動化創(chuàng)建項目的目錄骨架
創(chuàng)建目錄可以使用下面的命令
1. mvn archetype:generate 按照提示進行選擇
2. mvn archetype:generate -DgroupId=組織名
-DartifactId=項目名-模塊名
-Dversion=版本號
-Dpackage=項目所在的包
倉庫
Maven的中央倉庫訪問起來可能比較慢,通過設(shè)置鏡像倉庫,可以改善這個問題,推薦使用阿里云的鏡像。在settings.xml中添加如下<mirror>標簽
<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包會保存在本地,下次添加依賴時如果本地倉庫中已經(jīng)存在了,就不必從網(wǎng)上下載了。本地倉庫默認位置在C:Users/your-username/.m2,如果要更換默認位置,可以修改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>取消注釋,選一個合適的路徑來作為本地倉庫。
pom.xml
pom是maven項目的核心管理文件,用于項目描述、組織管理、依賴管理和構(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">
<!-- 指定了當前pom的版本 -->
<modelVersion>4.0.0</modelVersion>
<groupId>com.shy(組織域名的反寫)</groupId>
<artifactId>springboot(項目名)</artifactId>
<!-- 0.0.1-SNAPSHOT
第一個0表示大版本
第二個0表示分支版本號,第三個1表示小版本號
SNAPSHOT表示快照版本
ALPHA表示內(nèi)測版
BETA表示公測版
RELEASE表示穩(wěn)定版
-->
<version>0.0.1-SNAPSHOT(版本號)</version>
<!-- maven項目的打包方式,默認是jar,也可以打包成war、zip、pom -->
<packaging>jar</packaging>
<!-- 項目名 -->
<name>springboot</name>
<!-- 項目的描述 -->
<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:默認的范圍,編譯測試運行都有效;
provided:在編譯和測試時有效,在實際運行時不會被加入
system: 在編譯和測試時有效,與本機系統(tǒng)相關(guān)聯(lián),可移植性差
import: 只使用在 dependencyManagement標簽中,表示從其他的pom中導(dǎo)入dependency配置
-->
<scope>test</scope>
<!-- <optional></optional>設(shè)置依賴是否可選 -->
<!--
exclusions設(shè)置排除依賴傳遞的列表。如果A依賴于B,B又依賴于C,我們說存在依賴關(guān)系,在A中引入B時候,會自動引入C。如果不想引入C,可以在exclusions中將其排除。
<exclusions></exclusions>
-->
</dependency>
</dependencies>
<build>
<!-- 插件類,也要指定“坐標” -->
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
依賴范圍
- compile:默認的范圍,編譯測試運行都有效;
- provided:在編譯和測試時有效,在實際運行時不會被加入
- test:只在測試環(huán)境下使用
- system: 在編譯和測試時有效,與本機系統(tǒng)相關(guān)聯(lián),可移植性差
- import: 只使用在 dependencyManagement標簽中,表示從其他的pom中導(dǎo)入dependency配置
依賴傳遞
exclusions標簽:設(shè)置排除依賴傳遞的列表。如果A依賴于B,B又依賴于C,我們說存在依賴關(guān)系,在A中引入B時候,會自動引入C。如果不想引入C,可以在exclusions中將其排除。
依賴沖突
1、短路徑優(yōu)先
如果有兩條依賴傳遞關(guān)系
1) A -> B -> C -> X(jar)
2) A -> D -> X(jar)
會選擇短的路徑2。
2、誰先聲明誰優(yōu)先
在pom文件中,哪個依賴寫在前面就優(yōu)先引用該依賴。
繼承
用于在子模塊中對父模塊的一個pom的繼承,作用就是對代碼的復(fù)用。比如在SpringBoot項目的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>
模塊的聚合
如果我們的項目分成了好幾個模塊,那么我們構(gòu)建的時候是不是有幾個模塊就需要構(gòu)建幾次了(到每個模塊的目錄下執(zhí)行mvn命令)?當然,你逐個構(gòu)建沒問題,但是非要這么麻煩的一個一個的構(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進行打包,就能一次性構(gòu)建所有模塊了。聚合POM與繼承中的父POM的packaging標簽都必須是pom。
dependencies和dependencyManagement的區(qū)別
- dependencies即使在子項目中不寫該依賴項,那么子項目仍然會從父項目中繼承該依賴項(全部繼承)
- dependencyManagement里只是聲明依賴,并不實現(xiàn)引入。如果在子項目不聲明依賴,是不會從父項目中繼承下來的;所以要添加依賴還需顯式聲明,如果沒有指定具體版本,會從父項目中繼承該項,并且version和scope都讀取自父pom;但是如果子項目中指定了版本號,那么就使用子項目中指定的jar版本。