為什么要用 Maven?
Maven 主要幫助用戶完成以下 3 個(gè)方面的工作:
生命周期管理咒林,便捷的構(gòu)建過程肆资;
依賴管理造虏,方便引入所需依賴 Jar 包磅崭;
倉庫管理儿子,提供統(tǒng)一管理所有 Jar 包的工具;
如何安裝 Maven?
- 下載 Maven 二進(jìn)制包
- 解壓縮:
tar xzvf apache-maven-3.3.9-bin.tar.gz
- 設(shè)置 Maven 全局變量
在 .bash_profile 中添加內(nèi)容:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_76.jdk/Contents/Home/
export M2_HOME=/Users/zhangguanghui/Public/apache-maven-3.3.9
export M2=$M2_HOME/bin:$PATH
export MAVEN_OPTS="-Xms256m -Xmx512m"
- 高級配置
如果你想改變本地的 jar 包倉庫砸喻,或者想增加代理服務(wù)器以減少從遠(yuǎn)程倉庫獲取 jar 包的次數(shù)柔逼,請參考http://maven.apache.org/guides/mini/guide-configuring-maven.html
創(chuàng)建第一個(gè) Maven 工程
- 使用 archetype 模板創(chuàng)建工程
mvn -B archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DgroupId=com.mycompany.app \
-DartifactId=my-app
命令執(zhí)行成功后,產(chǎn)生一個(gè)目錄文件 my-app割岛,該目錄下有一個(gè)文件 pom.xml愉适。Maven 就是通過 pom.xml 來構(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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>my-app</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>
</project>
該 pom.xml 文件內(nèi)包含了最基礎(chǔ)的信息癣漆,主要有:
| 標(biāo)識符 | 含義 |
|: ------- :|: ------- :|
| groupId|一般用該項(xiàng)目的組織或團(tuán)體的域名來標(biāo)識维咸,例如:org.apache.maven.plugins |
| artifactId | 代表唯一的工程名 |
|version| 版本號|
|packaging| 標(biāo)識打包的類型,例如有:jar, war, tar |
|dependencies| 該工程內(nèi)依賴的其他 jar 包|
如果想深入了解 pom.xml 文件惠爽,請閱讀
http://maven.apache.org/guides/introduction/introduction-to-the-pom.html
- 坐標(biāo)
每一個(gè) Jar 包都需要定義一個(gè)唯一標(biāo)識癌蓖,方便管理維護(hù),因此 Maven 使用 groupId, artifactId, versionId 三元素組成一個(gè) Jar 的坐標(biāo)婚肆。當(dāng)我們依賴該 Jar 包時(shí)租副,同樣需要指定該 Jar 包的坐標(biāo) <groupId, artifactId, versionId> ,Maven 根據(jù)這些信息查詢下載较性。
- 工程的目錄結(jié)構(gòu)
localhost:my-app zhangguanghui$ tree
.
|____pom.xml
|____src
| |____main
| | |____java
| | | |____com
| | | | |____mycompany
| | | | | |____app
| | | | | | |____App.java
| |____test
| | |____java
| | | |____com
| | | | |____mycompany
| | | | | |____app
| | | | | | |____AppTest.java
目錄 | 含義 |
---|---|
${basedir}/pom.xml | pom 文件 |
${basedir}/src/main/java | 源代碼目錄 |
${basedir}/src/test/java | 測試代碼目錄 |
如果你想對 Maven 工程的目錄結(jié)構(gòu)更多的了解用僧,請閱讀:Introduction to the Standard Directory Layout
如何構(gòu)建工程?
在 my-app 目錄下(pom.xml 的當(dāng)前文件)執(zhí)行 mvn clean install。
該命令依次會(huì)刪除上一次構(gòu)建產(chǎn)生的結(jié)果两残,編譯源代碼永毅,編譯測試代碼,運(yùn)行測試代碼人弓,打包,將 Jar 包存儲到本地倉庫着逐。
zhangguanghuideMacBook-Pro-3:my-app zhangguanghui$ mvn clean install
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building my-app 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ my-app ---
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ my-app ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /Users/zhangguanghui/git/IDEA_workspace/my-app/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ my-app ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 1 source file to /Users/zhangguanghui/git/IDEA_workspace/my-app/target/classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ my-app ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /Users/zhangguanghui/git/IDEA_workspace/my-app/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ my-app ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 1 source file to /Users/zhangguanghui/git/IDEA_workspace/my-app/target/test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ my-app ---
[INFO] Surefire report directory: /Users/zhangguanghui/git/IDEA_workspace/my-app/target/surefire-reports
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.mycompany.app.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.006 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ my-app ---
[INFO] Building jar: /Users/zhangguanghui/git/IDEA_workspace/my-app/target/my-app-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ my-app ---
[INFO] Installing /Users/zhangguanghui/git/IDEA_workspace/my-app/target/my-app-1.0-SNAPSHOT.jar to /Users/zhangguanghui/.m2/repository/com/mycompany/app/my-app/1.0-SNAPSHOT/my-app-1.0-SNAPSHOT.jar
[INFO] Installing /Users/zhangguanghui/git/IDEA_workspace/my-app/pom.xml to /Users/zhangguanghui/.m2/repository/com/mycompany/app/my-app/1.0-SNAPSHOT/my-app-1.0-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.615 s
[INFO] Finished at: 2017-02-15T15:08:55+08:00
[INFO] Final Memory: 18M/331M
[INFO] ------------------------------------------------------------------------
參考
maven 入門指南
maven 生命周期
Maven 默認(rèn)插件以及功能
maven 依賴管理
maven-shade-plugin 入門指南
maven-assembly-plugin 入門指南
30 分鐘了解 Maven