Maven入门教程
Maven簡(jiǎn)介
Maven作為一個(gè)構(gòu)建工具,不僅能幫我們自動(dòng)化構(gòu)建,還能夠抽象構(gòu)建過(guò)程,提供構(gòu)建任務(wù)實(shí)現(xiàn);它跨平臺(tái),對(duì)外提供了一致的操作接口,這一切足以使它成為優(yōu)秀的、流行的構(gòu)建工具。
Maven不僅是構(gòu)建工具,還是一個(gè)依賴管理工具和項(xiàng)目管理工具,它提供了中央倉(cāng)庫(kù),能幫我自動(dòng)下載構(gòu)件。
Maven安裝
Windows安裝Maven
在安裝maven之前首先先確定Windows上安裝了Jdk
然后去Maven官網(wǎng)maven.apache.org/download.cg…下載.zip結(jié)尾的Maven文件,如下圖:
最后設(shè)置環(huán)境Maven的環(huán)境變量,主要配置M2_HOME和PATH兩項(xiàng),步驟如下圖:
Mac安裝Maven
第一步和Windows一樣,下載Maven,格式為tar.gz,解壓之后放到你想放到的位置
然后打開(kāi)終端輸入vim ~/.bash_profile,在環(huán)境變量中添加一條export PATH="~/software/Maven/apache-maven-3.5.4/bin":$PATH,后面是我本機(jī)根目錄的位置,添加之后:wq保存退出,然后source ~/.bash_profile使配置生效。
輸入mvn -version查看是否安裝成功
Maven目錄
bin目錄
該目錄包含了mvn運(yùn)行的腳本,這些腳本用來(lái)配置java命令,準(zhǔn)備好classpath和相關(guān)的Java系統(tǒng)屬性,然后執(zhí)行Java命令。
boot目錄
該目錄只包含一個(gè)文件,該文件為plexus-classworlds-2.5.2.jar。plexus-classworlds是一個(gè)類(lèi)加載器框架,相對(duì)于默認(rèn)的java類(lèi)加載器,它提供了更加豐富的語(yǔ)法以方便配置,Maven使用該框架加載自己的類(lèi)庫(kù)。
conf目錄
該目錄包含了一個(gè)非常重要的文件settings.xml。直接修改該文件,就能在機(jī)器上全局地定制Maven的行為,一般情況下,我們更偏向于復(fù)制該文件至/.m2/目錄下(表示用戶目錄),然后修改該文件,在用戶范圍定制Maven的行為。
lib目錄
該目錄包含了所有Maven運(yùn)行時(shí)需要的Java類(lèi)庫(kù),Maven本身是分模塊開(kāi)發(fā)的,因此用戶能看到諸如maven-core-3.0.jar、maven-model-3.0.jar之類(lèi)的文件,此外這里還包含一些Maven用到的第三方依賴如commons-cli-1.2.jar、commons-lang-2.6.jar等等。
Maven常用命令
mvn dependency:tree,查看項(xiàng)目中jar包的依賴數(shù),解決jar包沖突問(wèn)題。
mvn clean:表示運(yùn)行清理操作(會(huì)默認(rèn)把target文件夾中的數(shù)據(jù)清理)。
mvn clean compile:表示先運(yùn)行清理之后運(yùn)行編譯,會(huì)將代碼編譯到target文件夾中。
mvn clean test:運(yùn)行清理和測(cè)試。
mvn clean package:運(yùn)行清理和打包。
mvn clean install:運(yùn)行清理和安裝,會(huì)將打好的包安裝到本地倉(cāng)庫(kù)中,以便其他的項(xiàng)目可以調(diào)用。
mvn clean deploy:運(yùn)行清理和發(fā)布(發(fā)布到私服上面)。
配置setting.xml文件
說(shuō)明:
Maven的級(jí)別有兩種,一是用戶級(jí)別,該級(jí)別是默認(rèn)級(jí)別.第二種是全局的配置.一般不生效.但是要求兩種級(jí)別的配置文件必須相同,否則會(huì)有意想不到的異常.
配置本地倉(cāng)庫(kù)
<!-- Windows中的配置--> <localRepository>E:/software/mvn_repo</localRepository><!-- Mac中的配置 --> <!-- <localRepository>/Users/hxx/software/mvn_repo</localRepository> --> 復(fù)制代碼配置阿里中央倉(cāng)庫(kù)
<mirror><id>nexus-aliyun</id><mirrorOf>*</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror> 復(fù)制代碼配置jdk
說(shuō)明:Maven通過(guò)骨架創(chuàng)建項(xiàng)目時(shí)默認(rèn)的JDK版本1.5,所以需要手動(dòng)修改JDK,但是修改繁瑣,所以添加如下的配置
<!-- 全局jdk配置,settings.xml --> <profile><id>jdk17</id><activation><activeByDefault>true</activeByDefault><jdk>1.7</jdk></activation><properties><maven.compiler.source>1.7</maven.compiler.source><maven.compiler.target>1.7</maven.compiler.target><maven.compiler.compilerVersion>1.7</maven.compiler.compilerVersion></properties> </profile><!-- jdk1.8配置 <profile><id>jdk18</id> <activation><activeByDefault>true</activeByDefault><jdk>1.8</jdk></activation><properties><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> </profile> --> 復(fù)制代碼Maven在開(kāi)發(fā)工具中的使用
博主現(xiàn)在想要在自己的開(kāi)發(fā)工具中使用自己配置好的Maven,所以來(lái)介紹一下,一下是Eclipse和Idea中的Maven配置
基于Eclipse中使用
基于Idea中使用
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>com.hxxzt</groupId><artifactId>Maventest</artifactId><version>0.0.1-SNAPSHOT</version><name>Maventest</name> </project> 復(fù)制代碼這里需要說(shuō)明一下,這里的groupId、artifactId、version都是自己定義的,與上面解釋的坐標(biāo)不一樣,坐標(biāo)是在Maven中央倉(cāng)庫(kù)中的地址,這個(gè)定義的是你自己項(xiàng)目的坐標(biāo),注意~
-
代碼的第一行是XML頭,指定了該xml文檔的版本和編碼方式。
-
project是所有pom.xml的根元素,它還聲明了一些POM相關(guān)的命名空間及xsd元素。
-
根元素下的第一個(gè)子元素modelVersion指定了當(dāng)前的POM模型的版本,對(duì)于Maven3來(lái)說(shuō),它只能是4.0.0
代碼中最重要是包含了groupId,artifactId和version了。這三個(gè)元素定義了一個(gè)項(xiàng)目基本的坐標(biāo),在Maven的世界,任何的jar、pom或者jar都是以基于這些基本的坐標(biāo)進(jìn)行區(qū)分的。
-
groupId定義了項(xiàng)目屬于哪個(gè)組,隨意命名,比如谷歌公司的myapp項(xiàng)目,就取名為 com.google.myapp
-
artifactId定義了當(dāng)前Maven項(xiàng)目在組中唯一的ID,比如定義hello-world。
-
version指定了項(xiàng)目當(dāng)前的版本0.0.1-SNAPSHOT,SNAPSHOT意為快照,說(shuō)明該項(xiàng)目還處于開(kāi)發(fā)中,是不穩(wěn)定的。
-
name元素生命了一個(gè)對(duì)于用戶更為友好的項(xiàng)目名稱,雖然這不是必須的,但還是推薦為每個(gè)POM聲明name,以方便信息交流
坐標(biāo)和依賴
何為坐標(biāo)?
關(guān)于坐標(biāo)(Coordinate),大家最熟悉的定義應(yīng)該 來(lái)自于平面幾何。在一個(gè)平面坐標(biāo)系中,坐標(biāo)( x, y)表示該平面上與x軸距離為y,與y軸距離為x的一點(diǎn),任何一個(gè)坐標(biāo)都能夠唯一標(biāo)識(shí)該平面中的一點(diǎn)。在實(shí)際生活中,我們也可以將地址看成是一種坐標(biāo)。省、市、區(qū)、街道等一系列信息同樣可以唯一標(biāo)識(shí)城市中的任一居住地址和工作地址。郵局和快遞公司正是基于這樣一種坐標(biāo)進(jìn)行日常工作的。
Maven坐標(biāo)為各種構(gòu)件引入了秩序,任何一個(gè)構(gòu)件都必須明確定義自己的坐標(biāo),而一組Maven坐標(biāo)是通過(guò)一些 元素定義的,它們是groupId、artifactId、version、packaging、classifier。
依賴的配置
<project> ... <dependencies><dependency><groupId>實(shí)際項(xiàng)目</groupId><artifactId>模塊</artifactId><version>版本</version><type>依賴類(lèi)型</type><scope>依賴范圍</scope><optional>依賴是否可選</optional><!—主要用于排除傳遞性依賴--><exclusions><exclusion><groupId>…</groupId><artifactId>…</artifactId></exclusion></exclusions></dependency> <dependencies> ... </project>復(fù)制代碼根元素project下的dependencies可以包含一個(gè)或者多個(gè)dependency元素,以聲明一個(gè)或者多個(gè)項(xiàng)目依賴。每個(gè)依賴可以包含的元素有:
- grounpId、artifactId和version:以來(lái)的基本坐標(biāo),對(duì)于任何一個(gè)依賴來(lái)說(shuō),基本坐標(biāo)是最重要的,Maven根據(jù)坐標(biāo)才能找到需要的依賴。
- type:依賴的類(lèi)型,對(duì)于項(xiàng)目坐標(biāo)定義的packaging。大部分情況下,該元素不必聲明,其默認(rèn)值為jar
- scope:依賴的范圍
- optional:標(biāo)記依賴是否可選
- exclusions:用來(lái)排除傳遞性依賴
依賴范圍
依賴范圍就是用來(lái)控制依賴和三種classpath(編譯classpath,測(cè)試classpath、運(yùn)行classpath)的關(guān)系,Maven有如下幾種依賴范圍:
-
compile:編譯依賴范圍。如果沒(méi)有指定,就會(huì)默認(rèn)使用該依賴范圍。使用此依賴范圍的Maven依賴,對(duì)于編譯、測(cè)試、運(yùn)行三種classpath都有效。典型的例子是spring-code,在編譯、測(cè)試和運(yùn)行的時(shí)候都需要使用該依賴。
-
test: 測(cè)試依賴范圍。使用次依賴范圍的Maven依賴,只對(duì)于測(cè)試classpath有效,在編譯主代碼或者運(yùn)行項(xiàng)目的使用時(shí)將無(wú)法使用此依賴。典型的例子是Jnuit,它只有在編譯測(cè)試代碼及運(yùn)行測(cè)試的時(shí)候才需要。 provided:已提供依賴范圍。使用此依賴范圍的Maven依賴,對(duì)于編譯和測(cè)試classpath有效,但在運(yùn)行時(shí)候無(wú)效。典型的例子是servlet-api,編譯和測(cè)試項(xiàng)目的時(shí)候需要該依賴,但在運(yùn)行項(xiàng)目的時(shí)候,由于容器以及提供,就不需要Maven重復(fù)地引入一遍。
-
runtime:運(yùn)行時(shí)依賴范圍。使用此依賴范圍的Maven依賴,對(duì)于測(cè)試和運(yùn)行classpath有效,但在編譯主代碼時(shí)無(wú)效。典型的例子是JDBC驅(qū)動(dòng)實(shí)現(xiàn),項(xiàng)目主代碼的編譯只需要JDK提供的JDBC接口,只有在執(zhí)行測(cè)試或者運(yùn)行項(xiàng)目的時(shí)候才需要實(shí)現(xiàn)上述接口的具體JDBC驅(qū)動(dòng)。
-
system:系統(tǒng)依賴范圍。該依賴與三種classpath的關(guān)系,和provided依賴范圍完全一致,但是,使用system范圍的依賴時(shí)必須通過(guò)systemPath元素顯示地指定依賴文件的路徑。由于此類(lèi)依賴不是通過(guò)Maven倉(cāng)庫(kù)解析的,而且往往與本機(jī)系統(tǒng)綁定,可能構(gòu)成構(gòu)建的不可移植,因此應(yīng)該謹(jǐn)慎使用。systemPath元素可以引用環(huán)境變量,如:
- import:導(dǎo)入依賴范圍。該依賴范圍不會(huì)對(duì)三種classpath產(chǎn)生實(shí)際的影響。 上述除import以外的各種依賴范圍與三種classpath的關(guān)系如下:
總結(jié)
后面有需要補(bǔ)充的繼續(xù)更新。本篇基于許曉兵《Maven實(shí)戰(zhàn)》提煉,亞馬遜購(gòu)買(mǎi)本書(shū)請(qǐng)戳此處—->《Maven實(shí)戰(zhàn)》購(gòu)買(mǎi)
總結(jié)
- 上一篇: Java微信订单查询
- 下一篇: 7 个让您需要渐进式 Web 应用程序做