1、maven是什么?
maven是一個項(xiàng)目管理工具,可以對java項(xiàng)目進(jìn)行構(gòu)建邦蜜、依賴管理独泞。是 Apache 下的一個純 Java 開發(fā)的開源項(xiàng)目。也可被用來構(gòu)建和管理各種項(xiàng)目信不,如C#嘲叔,Ruby,Scala 和其他語言編寫的項(xiàng)目抽活。它是基于項(xiàng)目對象模型(縮寫:POM)概念硫戈,管理一個項(xiàng)目的構(gòu)建、報告和文檔等步驟下硕。
2丁逝、maven pom
POM( Project Object Model,項(xiàng)目對象模型 ) 是 Maven 工程的基本工作單元梭姓,是一個XML文件霜幼,包含了項(xiàng)目的基本信息,用于描述項(xiàng)目如何構(gòu)建誉尖,聲明項(xiàng)目依賴辛掠,等等。maven讀取pom獲取信息释牺,來執(zhí)行目標(biāo)萝衩。
POM 中可以指定以下配置:
- 項(xiàng)目依賴
- 插件
- 執(zhí)行目標(biāo)
- 項(xiàng)目構(gòu)建 profile
- 項(xiàng)目版本
- 項(xiàng)目開發(fā)者列表
- 相關(guān)郵件列表信息
2.1、父pom
父(Super)POM是 Maven 默認(rèn)的 POM没咙。所有的 POM 都繼承自一個父 POM(無論是否顯式定義了這個父 POM)猩谊。父 POM 包含了一些可以被繼承的 默認(rèn)設(shè)置。因此祭刚,當(dāng) Maven 發(fā)現(xiàn)需要下載 POM 中的 依賴時牌捷,它會到 Super POM 中配置的默認(rèn)倉庫 http://repo1.maven.org/maven2
去下載墙牌。
Maven 使用 effective pom(Super pom 加上工程自己的配置)來執(zhí)行相關(guān)的目標(biāo),它幫助開發(fā)者在 pom.xml 中做盡可能少的配置暗甥,當(dāng)然這些配置可以被重寫喜滨。
使用以下命令來mvn help:effective-pom
會在控制臺看到父pom的默認(rèn)配置。
在父 pom.xml 中撤防,你可以看到 Maven 在執(zhí)行目標(biāo)時需要用到的工程源碼目錄結(jié)構(gòu)虽风、輸出目錄、需要的插件寄月、倉庫和報表目錄辜膝。
pom中可使用的標(biāo)簽大全可以在這個網(wǎng)頁看到https://www.runoob.com/maven/maven-pom.html
,當(dāng)然建議看官網(wǎng)最好漾肮。
3场仲、maven構(gòu)建生命周期
Maven 構(gòu)建生命周期定義了一個項(xiàng)目構(gòu)建跟發(fā)布的過程榴捡。Maven 有以下三個標(biāo)準(zhǔn)的生命周期:
- clean:項(xiàng)目清理的處理
- default(或 build):項(xiàng)目部署的處理
- site:項(xiàng)目站點(diǎn)文檔創(chuàng)建的處理
default(或 build)生命周期是開發(fā)過程中最主要最常接觸到的切蟋,它由以下幾個階段(phase)的序列組成:
說得通透一點(diǎn)焰宣,maven構(gòu)建過程可以理解成,由各種plugin按照部分或全部的生命周期的階段(phase)順序執(zhí)行階段綁定的goal(底層是插件中的java方法)來完成java項(xiàng)目清理谭溉、編譯墙懂、打包、測試夜只、布署等整個項(xiàng)目的流程的一個過程垒在。在一個生命周期中蒜魄,運(yùn)行某個階段的時候扔亥,它之前的所有階段都會被運(yùn)行。
生命周期(lifecycle)由各個階段組成谈为,每個階段由maven的插件plugin來執(zhí)行g(shù)oal完成旅挤。
3.1 構(gòu)建階段(phase)由插件目標(biāo)(goal)構(gòu)成
一個插件目標(biāo)代表一個特定的任務(wù)(比構(gòu)建階段更為精細(xì)),這有助于項(xiàng)目的構(gòu)建和管理伞鲫。這些目標(biāo)可能被綁定到多個階段或者無綁定粘茄。不綁定到任何構(gòu)建階段的目標(biāo)可以在構(gòu)建生命周期之外通過直接調(diào)用執(zhí)行。這些目標(biāo)的執(zhí)行順序取決于調(diào)用目標(biāo)和構(gòu)建階段的順序秕脓。
例如柒瓣,考慮下面的命令:
mvn clean dependency:copy-dependencies package
clean 和 pakage 是構(gòu)建階段,dependency:copy-dependencies 是目標(biāo)吠架。這里的 clean 階段將會被首先執(zhí)行芙贫,然后 dependency:copy-dependencies 目標(biāo)會被執(zhí)行,最終 package 階段被執(zhí)行傍药。
4磺平、maven構(gòu)建配置文件
構(gòu)建配置文件是一系列的配置項(xiàng)的值魂仍,可以用來設(shè)置或者覆蓋 Maven 構(gòu)建默認(rèn)值。
使用構(gòu)建配置文件拣挪,你可以為不同的環(huán)境擦酌,比如說生產(chǎn)環(huán)境(Production)和開發(fā)(Development)環(huán)境,定制構(gòu)建方式菠劝。
配置文件在 pom.xml 文件中使用 activeProfiles 或者 profiles 元素指定赊舶,并且可以通過各種方式觸發(fā)。配置文件在構(gòu)建時修改 POM闸英,并且用來給參數(shù)設(shè)定不同的目標(biāo)環(huán)境(比如說锯岖,開發(fā)(Development)、測試(Testing)和生產(chǎn)環(huán)境(Production)中數(shù)據(jù)庫服務(wù)器的地址)甫何。
4.1 命令行配置文件激活
profile 可以讓我們定義一系列的配置信息出吹,然后指定其激活條件。這樣我們就可以定義多個 profile辙喂,然后每個 profile 對應(yīng)不同的激活條件和配置信息捶牢,從而達(dá)到不同環(huán)境使用不同配置信息的效果。
以下實(shí)例巍耗,我們將 maven-antrun-plugin:run 目標(biāo)添加到測試階段中秋麸。這樣我們可以在不同的 profile 中輸出文本信息。我們將使用 pom.xml 來定義不同的 profile炬太,并在命令控制臺中使用 maven 命令激活 profile灸蟆。
pom.xml 文件如下:
<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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jsoft.test</groupId>
<artifactId>testproject</artifactId>
<packaging>jar</packaging>
<version>0.1-SNAPSHOT</version>
<name>testproject</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<profiles>
<profile>
<id>test</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>Using env.test.properties</echo>
<copy file="src/main/resources/env.test.properties" tofile="${project.build.outputDirectory}/env.properties" overwrite="true"/>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>normal</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>Using env.properties</echo>
<copy file="src/main/resources/env.properties" tofile="${project.build.outputDirectory}/env.properties" overwrite="true"/>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>prod</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>Using env.prod.properties</echo>
<copy file="src/main/resources/env.prod.properties" tofile="${project.build.outputDirectory}/env.properties" overwrite="true"/>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
注意:構(gòu)建配置文件采用的是 <profiles> 節(jié)點(diǎn)。
說明:上面新建了三個 <profiles>亲族,其中 <id> 區(qū)分了不同的 <profiles> 執(zhí)行不同的 AntRun 任務(wù)炒考;而 AntRun 的任務(wù)可以這么理解,AntRun 監(jiān)聽 test 的 Maven 生命周期階段霎迫,當(dāng) Maven 執(zhí)行 test 時斋枢,就觸發(fā)了 AntRun 的任務(wù),任務(wù)里面為輸出文本并復(fù)制文件到指定的位置知给;而至于要執(zhí)行哪個 AntRun 任務(wù)瓤帚,此時構(gòu)建配置文件起到了傳輸指定的作用,比如涩赢,通過命令行參數(shù)輸入指定的 <id>戈次。
執(zhí)行命令:mvn test -Ptest
提示:第一個 test 為 Maven 生命周期階段,第 2 個 test 為構(gòu)建配置文件指定的 <id> 參數(shù)筒扒,這個參數(shù)通過 -P 來傳輸怯邪,當(dāng)然,它可以是 prod 或者 normal 霎肯。
4.2擎颖、通過Maven設(shè)置激活配置文件
<settings 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/settings-1.0.0.xsd">
...
<activeProfiles>
<activeProfile>test</activeProfile>
</activeProfiles>
</settings>
4.3 通過環(huán)境變量激活配置文件
先把上一步測試的 setting.xml 值全部去掉榛斯。
然后在 pom.xml 里面的 <id> 為 test 的 <profile> 節(jié)點(diǎn),加入 <activation> 節(jié)點(diǎn):
<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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jsoft.test</groupId>
<artifactId>testproject</artifactId>
<packaging>jar</packaging>
<version>0.1-SNAPSHOT</version>
<name>testproject</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<profiles>
<profile>
<id>test</id>
<activation>
<property>
<name>env</name>
<value>test</value>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>Using env.test.properties</echo>
<copy file="src/main/resources/env.test.properties" tofile="${project.build.outputDirectory}/env.properties" overwrite="true"/>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>prod</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>Using env.prod.properties</echo>
<copy file="src/main/resources/env.prod.properties" tofile="${project.build.outputDirectory}/env.properties" overwrite="true"/>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
或執(zhí)行命令mvn test -Denv=test
搂捧。
上面使用 -D 傳遞環(huán)境變量驮俗,其中 env 對應(yīng)剛才設(shè)置的 <name> 值,test 對應(yīng)<value>允跑。
5王凑、maven倉庫
Maven 倉庫能幫助我們管理構(gòu)件(主要是JAR),它就是放置所有JAR文件(WAR聋丝,ZIP索烹,POM等等)的地方。
Maven 倉庫有三種類型:
本地(local)
中央(central)
遠(yuǎn)程(remote)
5.1 本地倉庫
Maven 的本地倉庫弱睦,在安裝 Maven 后并不會創(chuàng)建百姓,它是在第一次執(zhí)行 maven 命令的時候才被創(chuàng)建。
運(yùn)行 Maven 的時候况木,Maven 所需要的任何構(gòu)件都是直接從本地倉庫獲取的垒拢。如果本地倉庫沒有,它會首先嘗試從遠(yuǎn)程倉庫下載構(gòu)件至本地倉庫火惊,然后再使用本地倉庫的構(gòu)件求类。
默認(rèn)情況下,屹耐,每個用戶在自己的用戶目錄下都有一個路徑名為 .m2/respository/ 的倉庫目錄尸疆。
Maven 本地倉庫默認(rèn)被創(chuàng)建在 %USER_HOME% 目錄下。要修改默認(rèn)位置惶岭,在 %M2_HOME%\conf 目錄中的 Maven 的 settings.xml 文件中定義另一個路徑寿弱。
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>C:/MyLocalRepository</localRepository>
</settings>
5.2 中央倉庫
Maven 中央倉庫是由 Maven 社區(qū)提供的倉庫,其中包含了大量常用的庫俗他。
中央倉庫包含了絕大多數(shù)流行的開源Java構(gòu)件脖捻,以及源碼阔逼、作者信息兆衅、SCM、信息嗜浮、許可證信息等羡亩。一般來說,簡單的Java項(xiàng)目依賴的構(gòu)件都可以在這里下載到危融。
5.3 遠(yuǎn)程倉庫
如果 Maven 在中央倉庫中也找不到依賴的文件畏铆,它會停止構(gòu)建過程并輸出錯誤信息到控制臺。為避免這種情況吉殃,Maven 提供了遠(yuǎn)程倉庫的概念辞居,它是開發(fā)人員自己定制倉庫楷怒。舉例如下:
<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.companyname.projectgroup</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>com.companyname.common-lib</groupId>
<artifactId>common-lib</artifactId>
<version>1.0.0</version>
</dependency>
<dependencies>
<repositories>
<repository>
<id>companyname.lib1</id>
<url>http://download.companyname.org/maven2/lib1</url>
</repository>
<repository>
<id>companyname.lib2</id>
<url>http://download.companyname.org/maven2/lib2</url>
</repository>
</repositories>
</project>
PS: maven倉庫默認(rèn)在國外,使用相對較慢瓦灶。我們可以更換為阿里云的倉庫鸠删,具體方式請使用搜索引擎。
5.4 maven依賴搜索倉庫的順序
- 在本地倉庫中搜索贼陶,如果找不到刃泡,執(zhí)行步驟 2,如果找到了則執(zhí)行其他操作碉怔。
- 在中央倉庫中搜索烘贴,如果找不到,并且有一個或多個遠(yuǎn)程倉庫已經(jīng)設(shè)置撮胧,則執(zhí)行步驟 4桨踪,如果找到了則下載到本地倉庫中以備將來引用。
- 如果遠(yuǎn)程倉庫沒有被設(shè)置芹啥,Maven 將簡單的停滯處理并拋出錯誤(無法找.到依賴的文件)馒闷。
- 在一個或多個遠(yuǎn)程倉庫中搜索依賴的文件,如果找到則下載到本地倉庫以備將來引用叁征,否則 Maven 將停止處理并拋出錯誤(無法找到依賴的文件)
6纳账、maven插件
未完待續(xù)