是什么
Maven是一個(gè)Java項(xiàng)目管理和構(gòu)建工具澳腹,它可以定義項(xiàng)目結(jié)構(gòu)织盼、項(xiàng)目依賴,并使用統(tǒng)一的方式進(jìn)行自動(dòng)化構(gòu)建酱塔,是Java項(xiàng)目不可缺少的工具沥邻。
重點(diǎn)詞:
- Java
- 解決依賴問(wèn)題
- 標(biāo)準(zhǔn)結(jié)構(gòu)
- 構(gòu)建(build)
安裝配置
安裝
前提:Java(JDK)已經(jīng)安裝。
官方下載地址:http://maven.apache.org/download.cgi
$ wget http://apache.mirrors.spacedump.net/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
$ tar -xvf apache-maven-3.6.3-bin.tar.gz
$ sudo mv -f apache-maven-3.6.3 /usr/local/
修改用戶環(huán)境變量
vi ~/.bash_profile
export MAVEN_HOME=/usr/local/apache-maven-3.6.3
export PATH=${PATH}:${MAVEN_HOME}/bin
source ~/.bash_profile
mvn -v
設(shè)置MAVEN_OPTS環(huán)境變量
防止運(yùn)行Java時(shí)內(nèi)存溢出
export MAVEN_OPTS="-Xms128m -Xmx512m"
settings.xml
全局配置 ${MAVEN_HOME}/conf/settings.xml
或者用戶配置 ~/.m2/settings.xml
比如從新定義本地倉(cāng)庫(kù)羊娃。(默認(rèn)是~/.m2/repository/)
<settings>
...
<localRepository>/localdisk/repository</localRepository>
...
</settings>
還可以設(shè)置http代理唐全。
<settings>
...
<proxies>
<proxy>
<id>my-proxy</id>
<active>true</active>
<protocol>http</protocol>
<host>218.14.227.137</host>
<port>3128</port>
<!--
<username>***</username>
<password>***</password>
<nonProxyHosts>
repository.mycom.com|*.google.com
</nonProxyHosts>
-->
</proxy>
</proxies>
...
</settings>
Maven項(xiàng)目結(jié)構(gòu)
a-maven-project
├─ src
│ ├─ main 存放主程序
│ │ ├─ java 存放Java源文件
│ │ ├─ resources 存放框架或其他工具的配置文件
│ ├─ test 存放測(cè)試程序
│ │ ├─ java 存放Java測(cè)試的源文件
│ │ ├─ resources 存放測(cè)試的配置文件
├─pom.xml Maven工程的核心配置
Maven Hello World
Maven 使用原型 archetype 插件創(chuàng)建項(xiàng)目。要?jiǎng)?chuàng)建一個(gè)簡(jiǎn)單的 Java 應(yīng)用,我們將使用 maven-archetype-quickstart 插件邮利。
在下面的例子中弥雹,創(chuàng)建一個(gè)基于 maven 的 java 應(yīng)用項(xiàng)目。
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
參數(shù)說(shuō)明:
- -DgourpId: 組織名,公司網(wǎng)址的反寫 + 項(xiàng)目名稱
- -DartifactId: 項(xiàng)目名-模塊名
- -DarchetypeArtifactId: 指定 ArchetypeId头朱,maven-archetype-quickstart,創(chuàng)建一個(gè)簡(jiǎn)單的 Java 應(yīng)用
- -DinteractiveMode: 是否使用交互模式
創(chuàng)建了之前命令行中給 artifactId 定義的新目錄,結(jié)構(gòu)如下:
.
└── my-app
├── pom.xml
└── src
├── main
│ └── java
│ └── com
│ └── mycompany
│ └── app
│ └── App.java
└── test
└── java
└── com
└── mycompany
└── app
└── AppTest.java
進(jìn)入這個(gè)目錄,直接compile
$ cd my-app
$ mvn compile
POM 文件
<project ...>
<modelVersion>4.0.0</modelVersion>
<groupId>com.google</groupId>
<artifactId>springBootDemo1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springBootDemo1</name>
</project>
根元素下的第一個(gè)子元素modelVersion指定了當(dāng)前的POM模型的版本,對(duì)于Maven3來(lái)說(shuō),它只能是4.0.0.
groupId 定義了項(xiàng)目屬于哪個(gè)組織水由。
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,以方便信息交流
依賴
一個(gè)Maven工程就是由groupId
,artifactId
和version
作為唯一標(biāo)識(shí)。我們?cè)谝闷渌谌綆?kù)的時(shí)候毕源,也是通過(guò)這3個(gè)變量確定。例如冻璃,依賴commons-logging
:
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
<scope>system</scope> <!--作用域-->
<systemPath>${basedir}\src\lib\ldapjdk.jar</systemPath> <!--項(xiàng)目根目錄下的lib文件夾下-->
</dependency>
使用<dependency>
聲明一個(gè)依賴后,Maven就會(huì)自動(dòng)下載這個(gè)依賴包并把它放到classpath中。
Maven常用命令說(shuō)明
- 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ā)布到私服上面)。
上面的命令大部分都是連寫的,大家也可以拆分分別執(zhí)行痒蓬,這是活的,看個(gè)人喜好以及使用需求。執(zhí)行test之前是會(huì)先執(zhí)行compile,執(zhí)行package之前會(huì)先執(zhí)行test破喻,而類似的,install之前會(huì)執(zhí)行package。
倉(cāng)庫(kù)的分類
中央倉(cāng)庫(kù)
其實(shí)我們使用的大多數(shù)第三方模塊都是這個(gè)用法,例如,我們使用commons logging绰咽、log4j這些第三方模塊笑跛,就是第三方模塊的開(kāi)發(fā)者自己把編譯好的jar包發(fā)布到Maven的中央倉(cāng)庫(kù)中陈哑。
私有倉(cāng)庫(kù)
私有倉(cāng)庫(kù)是指公司內(nèi)部如果不希望把源碼和jar包放到公網(wǎng)上,那么可以搭建私有倉(cāng)庫(kù)。私有倉(cāng)庫(kù)總是在公司內(nèi)部使用执解,它只需要在本地的~/.m2/settings.xml
中配置好,使用方式和中央倉(cāng)位沒(méi)有任何區(qū)別。
本地倉(cāng)庫(kù)
本地倉(cāng)庫(kù)是指把本地開(kāi)發(fā)的項(xiàng)目“發(fā)布”在本地莫鸭,這樣其他項(xiàng)目可以通過(guò)本地倉(cāng)庫(kù)引用它堕花。但是我們不推薦把自己的模塊安裝到Maven的本地倉(cāng)庫(kù)苏研,因?yàn)槊看涡薷哪硞€(gè)模塊的源碼,都需要重新安裝援奢,非常容易出現(xiàn)版本不一致的情況纬霞。更好的方法是使用模塊化編譯,在編譯的時(shí)候胳蛮,告訴Maven幾個(gè)模塊之間存在依賴關(guān)系瓶竭,需要一塊編譯瓷叫,Maven就會(huì)自動(dòng)按依賴順序編譯這些模塊蔽介。
發(fā)布到私有倉(cāng)庫(kù)
使用Artifact的Token只需要read:packages
權(quán)限坐儿。
在發(fā)布端貌矿,把GitHub的用戶名和發(fā)布Token寫入~/.m2/settings.xml
配置中:
<settings ...>
...
<servers>
<server>
<id>github-release</id>
<username>GITHUB-USERNAME</username>
<password>f052...c21f</password>
</server>
</servers>
</settings>
然后,在需要發(fā)布的Artifact的pom.xml
中尽楔,添加一個(gè)<repository>
聲明:
<project ...>
...
<distributionManagement>
<repository>
<id>github-release</id>
<name>GitHub Release</name>
<url>https://maven.pkg.github.com/michaelliao/complex</url>
</repository>
</distributionManagement>
</project>
注意到<id>
和~/.m2/settings.xml
配置中的<id>
要保持一致玛荞,因?yàn)榘l(fā)布時(shí)Maven根據(jù)id找到用于登錄的用戶名和Token客蹋,才能成功上傳文件到GitHub。我們直接通過(guò)命令mvn clean package deploy
部署婉烟。
參考
https://maven.apache.org/pom.html#
http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html
https://www.runoob.com/maven/maven-tutorial.html
https://www.liaoxuefeng.com/wiki/1252599548343744/1309301243117601