一、什么是 Maven黍檩?
Maven
是一個(gè)項(xiàng)目管理工具颂碧,它的本質(zhì)是一個(gè)項(xiàng)目對象模型(POM),體現(xiàn)在配置中就是我們常見的 pom.xml
文件沫换,而這個(gè) pom
文件就是 Maven
的核心臭蚁,它管理了整個(gè)項(xiàng)目的生命周期。它主要做兩件事:
項(xiàng)目構(gòu)建:對項(xiàng)目進(jìn)行編譯讯赏、打包垮兑、測試、部署以及上傳到私服倉庫等
依賴管理:
Maven
誕生時(shí)就提出了一個(gè)倉庫的概念漱挎,項(xiàng)目中用到的第三方jar
包系枪,我們在pom.xml
中配置好依賴即可,Maven
會(huì)自動(dòng)到它的官方中央倉庫下載這個(gè)jar
包到我們的本地倉庫磕谅。中央倉庫地址:https://mvnrepository.com/
二私爷、為什么要使用 Maven?
方便依賴管理:
Java
發(fā)展至今膊夹,生態(tài)非常完善衬浑。我們在項(xiàng)目中用到什么功能,網(wǎng)上一搜肯定有對應(yīng)的jar
包放刨,各種功能就導(dǎo)致了各種jar
包的引入嚎卫,這些jar
包之間可能會(huì)有依賴,可能會(huì)有版本沖突。而Maven
的誕生解決了這些問題拓诸。構(gòu)建多模塊項(xiàng)目:現(xiàn)在很多項(xiàng)目都是分了多個(gè)模塊,便于開發(fā)麻昼、也便于擴(kuò)展奠支。多模塊就意味著模塊之間會(huì)有各種依賴,我們運(yùn)行某個(gè)模塊抚芦,可能這個(gè)模塊依賴了別的模塊倍谜。而
Maven
的一鍵構(gòu)建項(xiàng)目幫我們解決了這個(gè)問題。方便移植:以前沒
maven
的時(shí)代叉抡,團(tuán)隊(duì)協(xié)作要上傳尔崔、下載一大堆jar
包導(dǎo)入項(xiàng)目,耗時(shí)褥民、費(fèi)力季春。而有了maven
,我們只需要同步一下pom
文件即可同步jar
包消返。這是maven
解決的第三個(gè)問題载弄。
三、怎么使用 Maven撵颊?
3.1 Maven 的安裝
這個(gè)就不講了宇攻,網(wǎng)上很多資料。比如:https://www.cnblogs.com/KyleXu/p/9972042.html
3.2 Maven 的配置
Maven
的配置比較簡單倡勇,主要是修改 conf
文件夾下的 setting
文件逞刷。配置以下三個(gè)倉庫:
本地倉庫
項(xiàng)目依賴的 jar
包是需要下載到本地才能用的。本地倉庫就是從 maven 私服或者遠(yuǎn)程倉庫下載的 jar
的存儲地址妻熊,默認(rèn)是 當(dāng)前用戶名\.m2\repository
夸浅,我建議改個(gè)好記的地方,后面方便檢查包有沒下載到本地固耘。打開 setting.xml
搜索 localRepository
修改成自定義的地址题篷。
<localRepository>D:\Repository</localRepository>
配置的位置,如下圖:
私服倉庫
這個(gè)倉庫的話厅目,一般就是公司內(nèi)部使用的啦番枚。用來存儲公司內(nèi)部自己的 jar
包。打開 setting.xml
文件搜索 mirrors
损敷,配置公司的鏡像地址即可葫笼。
<mirror>
<id>nexus-repos</id>
<mirrorOf>*</mirrorOf>
<name>Team Nexus Repository</name>
<url>http://127.0.0.1:8081/nexus/content/groups/public</url>
</mirror>
遠(yuǎn)程倉庫
遠(yuǎn)程倉庫就是一個(gè) maven
官方維護(hù)的,包含大量 jar
包的倉庫拗馒。這個(gè)庫默認(rèn)是 maven 官方的路星,但是下載非常慢。所以業(yè)界典范阿里巴巴也推出了一個(gè)國內(nèi)的鏡像,我們一般把遠(yuǎn)程倉庫配成阿里的鏡像地址洋丐,就可以快速地下載 jar
包啦呈昔。和私服倉庫一樣,遠(yuǎn)程倉庫也是配置在 <mirrors>
標(biāo)簽內(nèi)友绝。
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
配置的位置堤尾,如下圖:
有人可能問了,配置那么多個(gè)倉庫迁客。究竟 jar
從哪個(gè)下載的呀郭宝?都把我搞糊涂了,別急掷漱,我花了個(gè)流程圖粘室,它的查找順序是這樣的:本地不需要網(wǎng)絡(luò),優(yōu)先從本地找卜范;找不到衔统,再去速度較高的內(nèi)網(wǎng)私服找;然后才是速度稍低的外網(wǎng)遠(yuǎn)程倉庫找先朦。
3.3 Maven 的命令
常用命令
命令 | 含義 | 備注 |
---|---|---|
mvn clean | 清除 | 打包前缰冤,清空上一次的包 |
mvn compile | 編譯 | 將 java 代碼編譯成 class 文件 |
mvn test | 測試 | 運(yùn)行單元測試 |
mvn install | 安裝到本地 | 安裝到本地倉庫,一般是 jar 包 |
mvn package | 打包 | 一般會(huì)在 target 目錄下生成包喳魏,jar 或 war |
mvn deploy | 上傳 | 上傳到私服棉浸,需在 setting.xml 文件配置私服倉庫以及賬號密碼 |
以上就是 maven
常用的命令,要注意的是:很少情況下我們只運(yùn)行其中一個(gè)命令刺彩,都是組合運(yùn)行的迷郑。比如打包到本地,打包前得清空原有的包吧创倔?那組合起來就是 mvn clean
+ mvn install
當(dāng)然嗡害,在 IDEA
中開發(fā) maven
項(xiàng)目,我們并不需要手打畦攘。只需點(diǎn)擊對應(yīng)命令即可(也可以按住 ctrl
選中多個(gè)命令一起運(yùn)行)
總而言之霸妹,根據(jù)自己的需求來選擇打包命令馅巷。還有其他的命令請見:
- maven 詳細(xì)命令參考:http://www.reibang.com/p/ee7bc34d7ccc
創(chuàng)建 maven 項(xiàng)目
現(xiàn)在一般都是配合 idea
新建 maven 項(xiàng)目了赊舶,這個(gè)命令用得很少,但我們還是得知道一下:生成 maven
項(xiàng)目的原理是秸侣,依賴一個(gè)插件 maven-archetype-plugin
台盯,然后這個(gè)插件自帶一些 archetype
模版罢绽,也可以說成項(xiàng)目的骨架。其中:-DgroupId
和 -DartifactId
填寫自己想好的項(xiàng)目坐標(biāo)静盅,一般 -DgroupId
是公司名的翻轉(zhuǎn)良价,比如 com.google
而 -DartifactId
就是項(xiàng)目的名稱了。最重要的是-DarchetypeArtifactId
,他指定了創(chuàng)建的骨架明垢。
mvn archetype:generate -DgroupId=com.nasus -DartifactId=maven-test -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
點(diǎn)進(jìn)去蚣常,只有 src
文件夾和 pom.xml
文件:src
是最重要的目錄,代碼和測試用例以及資源都是放在這里的袖外,對于 maven 項(xiàng)目而言史隆,pom.xml
也是必不可少的。
用 idea
打開的項(xiàng)目結(jié)構(gòu)是這樣的:
pom.xml
的內(nèi)容:
<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/maven-v4_0_0.xsd">
<!--聲明項(xiàng)目描述符遵循哪一個(gè) POM 模型版本曼验,上面的 xsd 規(guī)范定義了這個(gè)版本,默認(rèn)就行粘姜,不需要修改鬓照,不可刪除-->
<modelVersion>4.0.0</modelVersion>
<!--團(tuán)體唯一標(biāo)識符-->
<groupId>com.nasus</groupId>
<!--項(xiàng)目唯一標(biāo)識符定位這個(gè)包-->
<artifactId>maven-test</artifactId>
<!--打包類型-->
<packaging>jar</packaging>
<!--打包版本-->
<version>1.0-SNAPSHOT</version>
<!--包名-->
<name>maven-test</name>
<!--不用管,刪掉也行-->
<url>http://maven.apache.org</url>
<!--項(xiàng)目需要依賴的 jar 包-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
由于篇幅原因孤紧,這里就不詳細(xì)講具體的 pom.xml
標(biāo)簽了豺裆,詳細(xì)介紹請看:
- pom 標(biāo)簽介紹參考:https://www.runoob.com/maven/maven-pom.html
項(xiàng)目打包到本地倉庫
由于項(xiàng)目是 java
項(xiàng)目,在打包前号显,我們要在 pom.xml
中配置項(xiàng)目的 JDK
版本以及 maven
插件版本臭猜,在 <dependencies>
標(biāo)簽前加入項(xiàng)目屬性配置,完整配置如下:
<!--項(xiàng)目屬性押蚤,在 <dependencies> 前加-->
<properties>
<!-- JDK編譯版本 -->
<java.version>1.8</java.version>
<!-- 項(xiàng)目編碼 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- JDK編譯版本 -->
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
<!--項(xiàng)目需要依賴的 jar 包-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
選擇命令蔑歌,這里我選了 clean、compile揽碘、package
:
點(diǎn)擊綠色執(zhí)行按鈕次屠,在 target
目錄下生成 maven-test-1.0.SNAPSHOT.jar
:
跳過單元測試
在開發(fā)中,我們經(jīng)常需要本地測試雳刺,而這時(shí)我們是不需要跑單元測試的劫灶。所以,我們可以跳過單元測試:選中 test
掖桦,點(diǎn)擊紅框按鈕即可本昏。
手動(dòng)打 jar 包到本地倉庫
手動(dòng)打 jar
包的應(yīng)用場景是:開發(fā)公司舊項(xiàng)目,當(dāng)找不到依賴的 jar
源碼枪汪,依賴的 jar
又沒有上傳到倉庫涌穆,只有在同事電腦的本地倉庫有一個(gè) jar
包時(shí),我們可以直接運(yùn)行這條命令把 jar
包打到我們電腦本地倉庫料饥,愉快的使用起來蒲犬。
mvn install:install-file -Dfile=jar包的路徑 -DgroupId=gruopId中的內(nèi)容 -DartifactId=actifactId的內(nèi)容 -Dversion=version的內(nèi)容 -Dpackaging=jar
四、maven 依賴管理
maven 通過 pom.xml 來進(jìn)行依賴管理岸啡,我們用它來描述項(xiàng)目的依賴屬性原叮。可以把它看作是 maven 項(xiàng)目的地圖,它描述了 jar 包的坐標(biāo)奋隶、版本以及依賴關(guān)系等擂送。如果不確定你想要引入 jar 的坐標(biāo)怎么寫,可以上 maven 中央倉庫查詢:
- maven 中央倉庫:https://mvnrepository.com/
4.1 maven 坐標(biāo)
maven 的第三方依賴都在 <dependencies>
標(biāo)簽內(nèi)定義唯欣,該標(biāo)簽下的 <dependency>
包裹的內(nèi)容就是一個(gè) jar
的坐標(biāo)嘹吨,如下 pom 就引入了 junit
和 cglib
兩個(gè) jar
。下面就說一下每個(gè)坐標(biāo)的標(biāo)簽都代表什么境氢。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
</dependencies>
- dependencies
在 dependencies 標(biāo)簽中蟀拷,添加項(xiàng)目需要的 jar 所對應(yīng)的 maven 坐標(biāo)。
- dependency
一個(gè) dependency 標(biāo)簽表示一個(gè)坐標(biāo)萍聊,也就是一個(gè) jar问芬,在 pom 中引入一個(gè) jar 可以這樣寫:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
- groupId
公司、團(tuán)體寿桨、個(gè)人開發(fā)者的唯一標(biāo)識符此衅,maven 約束它以創(chuàng)建這個(gè)項(xiàng)目的組織名稱的逆向域名開頭,比如開發(fā)者的域名是 nasus.com
那他的唯一標(biāo)識符就是 com.nasus
亭螟。
<!--團(tuán)體唯一標(biāo)識符-->
<groupId>com.nasus</groupId>
- artifactId
項(xiàng)目唯一標(biāo)識符挡鞍,一個(gè)組織可能有多個(gè)項(xiàng)目,為了方便 maven 引入预烙,maven 約定以項(xiàng)目名稱命名該標(biāo)識符墨微,比如我開發(fā)的 maven-test 項(xiàng)目。
<!--項(xiàng)目唯一標(biāo)識符-->
<artifactId>maven-test</artifactId>
- version
項(xiàng)目的版本默伍。一個(gè)項(xiàng)目欢嘿,可能會(huì)有多個(gè)版本。如果是正在開發(fā)的項(xiàng)目也糊,我們可以給版本號加上一個(gè) SNAPSHOT炼蹦,表示這是一個(gè)快照版本。
什么是快照狸剃?
對于版本掐隐,如果 maven
以前下載過指定的版本文件,比如說 maven-test:1.0
钞馁,maven
將不會(huì)再從倉庫下載新的可用的 1.0
文件虑省。若要下載更新的代碼,maven-test
的版本需要升到 1.1
僧凰。
快照是一種特殊的版本探颈,指定了某個(gè)當(dāng)前的開發(fā)進(jìn)度的副本。不同于常規(guī)的版本训措,maven
每次構(gòu)建都會(huì)在遠(yuǎn)程倉庫中檢查新的快照伪节。我們自己的模塊依賴了同事開發(fā)的模塊光羞,正常來說,同事會(huì)每次發(fā)布更新代碼的快照到倉庫中怀大。
新建項(xiàng)目的默認(rèn)版本號就是快照版纱兑,比如上面用 maven 命令新建的 maven-test 項(xiàng)目:
4.2 依賴范圍
- scope
maven 項(xiàng)目不同的階段引入到 classpath 中的依賴是不同的,例如化借,編譯時(shí)潜慎,maven 會(huì)將與編譯相關(guān)的依賴引入 classpath 中,測試時(shí)蓖康,maven 會(huì)將測試相關(guān)的的依賴引入到 classpath 中铐炫,運(yùn)行時(shí),maven 會(huì)將與運(yùn)行相關(guān)的依賴引入 classpath 中蒜焊,而依賴范圍就是用來控制依賴于這三種 classpath 的關(guān)系驳遵。 如下圖所示:
scope 表示依賴的范圍山涡,它有 compile(編譯階段)、test(測試階段)唆迁、provided(供應(yīng)階段)鸭丛、runtime(運(yùn)行階段)、system(系統(tǒng)階段)唐责、import(導(dǎo)入階段)
六個(gè)可選值鳞溉。其中 compile
是默認(rèn)的。system
和 import
用得少鼠哥,不詳細(xì)講熟菲。
不同依賴的適用范圍不一樣,舉幾個(gè)最典型的栗子:
范圍 | 編譯有效 | 測試有效 | 運(yùn)行時(shí)有效 | 打包有效 | 示例 |
---|---|---|---|---|---|
compile | 是 | 是 | 是 | 是 | spring-core |
test | 否 | 是 | 否 | 否 | junit |
provided | 是 | 是 | 否 | 否 | javax.servlet-api |
runtime | 否 | 是 | 是 | 是 | JDBC驅(qū)動(dòng) |
compile: 編譯依賴范圍朴恳。如果沒有指定抄罕,就會(huì)默認(rèn)使用該依賴范圍。使用此依賴范圍的 Maven 依賴于颖,對于編譯呆贿、供應(yīng)、測試森渐、運(yùn)行四種 classpath 都有效做入。比如
spring-core
provided: 已提供依賴范圍。使用此依賴范圍的 Maven 依賴同衣,對于 編譯和測試 classpath 有效竟块,但在運(yùn)行時(shí)無效。典型的例子是
servlet-api
編譯和測試項(xiàng)目的時(shí)候需要該依賴耐齐,但在運(yùn)行項(xiàng)目的時(shí)候浪秘,由于容器已經(jīng)提供蒋情,就不需要maven
重復(fù)地引入一遍:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
- test: 單元測試依賴范圍,只在測試的時(shí)候生效秫逝,所以可以設(shè)置它的 scope 為 test恕出,這樣,當(dāng)項(xiàng)目打包發(fā)布時(shí)违帆,單元測試的依賴就不會(huì)跟著發(fā)布浙巫。比如:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
- runtime: 運(yùn)行時(shí)依賴范圍。對于測試和運(yùn)行 classpath 有效刷后,但在編譯主代碼時(shí)無效的畴。典型的例子是 JDBC 驅(qū)動(dòng)實(shí)現(xiàn),項(xiàng)目主代碼的編譯只需要 JDK 提供的 JDBC 接口尝胆,只有在執(zhí)行測試或者運(yùn)行項(xiàng)目的時(shí)候才需要實(shí)現(xiàn)上述接口的具體 JDBC 驅(qū)動(dòng)丧裁。所以,我們使用 JDBD 驅(qū)動(dòng)時(shí)含衔,可以定義成以下樣例:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
<scope>runtime</csope>
</dependency>
4.3 排除依賴
如下 xml煎娇,原來的定義中已引入 commons-net
依賴,而 hermes-ftp
中又依賴了 commons-net
贪染,為避免版本沖突缓呛,我們可以排除 hermes-ftp
中的 commons-net
依賴。
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.6</version>
</dependency>
<dependency>
<groupId>com.nasus.greece.jupiter</groupId>
<artifactId>hermes-ftp</artifactId>
<version>1.1.0-SNAPSHOT</version>
<!--排除 commons-net 依賴-->
<exclusions>
<exclusion>
<artifactId>commons-net</artifactId>
<groupId>commons-net</groupId>
</exclusion>
</exclusions>
</dependency>
4.4 依賴傳遞
假設(shè)有如下項(xiàng)目關(guān)系:WebMavenDemo
項(xiàng)目依賴 JavaMavenService1
杭隙,JavaMavenService1
項(xiàng)目依賴 JavaMavenService2
哟绊。
pom.xml 文件配置好依賴關(guān)系后,必須首先 mvn install 后痰憎,依賴的 jar 包才能使用票髓。比如:
-
WebMavenDemo
的pom.xml
文件想能編譯通過,JavaMavenService1
必須mvn install
-
JavaMavenService
的pom.xml
文件想能編譯通過铣耘,JavaMavenService2
必須mvn install
傳遞性:
假設(shè)我們現(xiàn)在 JavaMavenService2
增加 spring-core
洽沟,那就會(huì)發(fā)現(xiàn)WebMavenDemo
和 JavaMavenService1
也會(huì)自動(dòng)的增加了這個(gè)jar
包,這就是依賴的傳遞性涡拘。
注意:非
compile
范圍的依賴是不能傳遞的玲躯。
- 來源:cnblogs.com/hzg110/p/6936101.html
4.5 統(tǒng)一管理依賴版本
在上面介紹 pom 文件時(shí),我們講過 properties
標(biāo)簽鳄乏,它還有一個(gè)作用就是限定依賴的 jar 包版本跷车,它常用在父項(xiàng)目中指定版本號,那么子項(xiàng)目用到該包就避免了版本不一致造成的依賴沖突橱野,它的寫法是這樣的:
五朽缴、build 配置
maven 打 war 包時(shí),可能需要一些額外的配置水援,請參看以下 xml 文件:
<build>
<!-- 項(xiàng)目的名字 -->
<finalName>maven-test</finalName>
<!-- 描述項(xiàng)目中資源的位置 -->
<resources>
<!-- 自定義資源1 -->
<resource>
<!-- 資源目錄 -->
<directory>src/main/java</directory>
<!-- 包括哪些文件參與打包 -->
<includes>
<include>**/*.xml</include>
</includes>
<!-- 排除哪些文件不參與打包 -->
<excludes>
<exclude>**/*.txt</exclude>
<exclude>**/*.doc</exclude>
</excludes>
</resource>
</resources>
<!-- 設(shè)置構(gòu)建時(shí)候的插件 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.1</version>
<configuration>
<!-- 源代碼編譯版本 -->
<source>1.8</source>
<!-- 目標(biāo)平臺編譯版本 -->
<target>1.8</target>
</configuration>
</plugin>
<!-- 資源插件(資源的插件) -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<phase>compile</phase>
</execution>
</executions>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- war插件(將項(xiàng)目打成war包) -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1</version>
<configuration>
<!-- war包名字 -->
<warName>maven-test</warName>
</configuration>
</plugin>
</plugins>
</build>
六密强、使用 idea 搭建 maven 聚合工程
這個(gè)網(wǎng)上很多資料茅郎,不講了。留個(gè)鏈接或渤。
- idea 搭建 maven 聚合工程參考:https://www.cnblogs.com/limn/p/9363416.html
最后
如果看到這里系冗,喜歡這篇文章的話,請轉(zhuǎn)發(fā)薪鹦、點(diǎn)贊掌敬。微信搜索「一個(gè)優(yōu)秀的廢人」,歡迎關(guān)注池磁。
回復(fù)「1024」送你一套完整的 java奔害、python、c++地熄、go华临、前端、linux端考、算法雅潭、大數(shù)據(jù)、人工智能却特、小程序以及英語教程寻馏。
回復(fù)「電子書」送你 50+ 本 java 電子書。