1.Maven簡(jiǎn)介
1.1主要內(nèi)容
??作為Apache組織中的一個(gè)頗為成功的開源項(xiàng)目,Maven主要服務(wù)于基于java平臺(tái)的項(xiàng)目構(gòu)建,依賴管理和項(xiàng)目信息管理。
1.2.項(xiàng)目構(gòu)建
??不管你是否意識(shí)到,構(gòu)建(build)是每一位程序員每天都在做的工作。早上來(lái)到公司,我們做的第一件事就是從源碼庫(kù)簽出最新的代碼,然后進(jìn)行單元測(cè)試,如果測(cè)試失敗,會(huì)找相關(guān)的同事一起調(diào)試,修復(fù)錯(cuò)誤代碼。接著回到自己的工作上來(lái),編寫自己的單元測(cè)試及產(chǎn)品代碼。
??仔細(xì)總結(jié)一下,我們會(huì)發(fā)現(xiàn),除了編寫源代碼,我們每天有相當(dāng)一部分時(shí)間花在了編譯,運(yùn)行單元測(cè)試,生成文檔,打包和部署等繁瑣且不起眼的工作上,這就是構(gòu)建。如果我們現(xiàn)在還手工這樣做,那成本也太高了,于是有人用軟件的方法讓這一系列工作完全自動(dòng)化,使得軟件的構(gòu)建可以像全自動(dòng)流水線一樣,只需要一條簡(jiǎn)單的命令,所有繁瑣的步驟都能夠自動(dòng)完成,很快就能得到最終結(jié)果。
1.3.項(xiàng)目構(gòu)建工具
Ant構(gòu)建
??最早的構(gòu)建工具,基于IDE,大概是2000年有的,當(dāng)時(shí)是最流行java構(gòu)建工具,不過(guò)它的XML腳本編寫格式讓XML文件特別大。對(duì)工程構(gòu)建過(guò)程中的過(guò)程控制特別好。
Maven 【JAVA】
??項(xiàng)目對(duì)象模型,通過(guò)其描述信息來(lái)管理項(xiàng)目的構(gòu)建,報(bào)告和文檔的軟件項(xiàng)目管理工具。它填補(bǔ)了Ant缺點(diǎn),Maven第一次支持了從網(wǎng)絡(luò)上下載的功能,仍然采用xml作為配置文件格式。Maven專注的是依賴管理,使用Java編寫。
Gradle
屬于結(jié)合以上兩個(gè)的優(yōu)點(diǎn),它繼承了Ant的靈活和Maven的生命周期管理,它最后被google作為了Android御用管理工具。它最大的區(qū)別是不用XML作為配置文件格式,采用了DSL格式,使得腳本更加簡(jiǎn)潔。
目前市面上Ant比較老,所以一般是一些比較傳統(tǒng)的軟件企業(yè)公司使用, Maven使用Java編寫,是當(dāng)下大多數(shù)互聯(lián)網(wǎng)公司會(huì)使用的一個(gè)構(gòu)建工具,中文文檔也比較齊全,gradle是用groovy編寫,目前比較新型的構(gòu)建工具一些初創(chuàng)互聯(lián)網(wǎng)公司會(huì)使用,以后會(huì)有很大的使用空間。
1.4.Maven的四大特性
1.4.1.依賴管理系統(tǒng)
??Maven為Java世界引入了一個(gè)新的依賴管理系統(tǒng)jar包管理 jar升級(jí)時(shí)修改配置文件即可。在Java世界中,可以用groupld、artifactld、version組成的Coordination(坐標(biāo))唯一標(biāo)識(shí)一個(gè)依賴。
??任何基于Maven構(gòu)建的項(xiàng)目自身也必須定義這三項(xiàng)屬性,生成的包可以是Jar包,也可以是war包或者jar包。—個(gè)典型的依賴引用如下所示:
<dependency>
<groupId>javax.servlet</groupId> com. baidu
<artifactId>javax.servlet-api</artifactId> ueditor echarts
<version>3.1.0</version>
</dependency>
坐標(biāo)屬性的理解
??Maven坐標(biāo)為各種組件引入了秩序,任何一個(gè)組件都必須明確定義自己的坐標(biāo)。
groupld
??定義當(dāng)前Maven項(xiàng)目隸屬的實(shí)際項(xiàng)目-公司名稱。(jar包所在倉(cāng)庫(kù)路徑)由于Maven中模塊的概念,因此一個(gè)實(shí)際項(xiàng)目往往會(huì)被劃分為很多模塊。比如spring是一個(gè)實(shí)際項(xiàng)目,其對(duì)應(yīng)的Maven模塊會(huì)有很多,如spring-core,spring-webmvc等。
artifactld
??該元素定義實(shí)際項(xiàng)目中的一個(gè)Maven模塊-項(xiàng)目名,推薦的做法是使用實(shí)際項(xiàng)目名稱作為artifactld的前綴。比如: spring-bean, spring-webmvc等。
version
??該元素定義Maven項(xiàng)目當(dāng)前所處的版本。
1.4.2.多模塊構(gòu)建
??項(xiàng)目復(fù)查時(shí)dao service controller層分離將一個(gè)項(xiàng)目分解為多個(gè)模塊已經(jīng)是很通用的一種方式。
??在Maven中需要定義一個(gè)parent POM作為一組module的聚合POM。在該P(yáng)OM中可以使用<modules>標(biāo)簽來(lái)定義一組子模塊。parent POM不會(huì)有什么實(shí)際構(gòu)建產(chǎn)出。而parent POM中的build配置以及依賴配置都會(huì)自動(dòng)繼承給子module。
1.4.3.一致的項(xiàng)目結(jié)構(gòu)
??Ant時(shí)代大家創(chuàng)建Java項(xiàng)目目錄時(shí)比較隨意,然后通過(guò)Ant配置指定哪些屬于source,那些屬于testSource等。而Maven在設(shè)計(jì)之初的理念就是Conversion over configuration(約定大于配置)。其制定了一套項(xiàng)目目錄結(jié)構(gòu)作為標(biāo)準(zhǔn)的Java項(xiàng)目結(jié)構(gòu),解決不同ide帶來(lái)的文件目錄不一致問(wèn)題。
1.4.4.一致的構(gòu)建模型和插件機(jī)制
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.25</version>
<configuration>
<scanIntervalseconds>10</ scanIntervalseconds>
<contextPath>/test</contextPath>
</configuration>
</plugin>
2.1.Maven的安裝配置
2.1.1.檢查JDK的版本
??JDK版本1.7及以上版本
??win+R鍵打開終端,輸入java -version即可查看jdk版本
2.1.2.下載Maven
??下載地址:http://maven.apache.org/download.html
??歷史版本:https://maven.apache.org/docs/history.html
??下載最新版本:

2.1.3.配置Maven環(huán)境變量
??解壓后把Maven的根目錄配置到系統(tǒng)環(huán)境變量中MAVEN_HOME,將bin目錄配置到path變量中。
??注: maven解壓后存放的目錄不要包含中文和空格
??第一步,新建第一個(gè)環(huán)境變量MAVEN_HOME,如下所示:

??第二步,編輯Path變量,新增:%MAVEN_HOME%,如下所示:

??最后,驗(yàn)證是否安裝成功?,F(xiàn)在我們打開 cmd,輸入:mvn -v即可。
2.2.認(rèn)識(shí)Maven目錄結(jié)構(gòu)
Maven項(xiàng)目目錄結(jié)構(gòu)
| 目錄 | 作用 |
|---|---|
${basedir} |
存放 pom.xml 和所有子目錄 |
${basedir}/src/main/java |
項(xiàng)目的 java 源代碼所在的目錄 |
${basedir}/src/main/resources |
項(xiàng)目的資源文件所在的目錄,例如:propert文件 |
${basedir}/src/test/java |
測(cè)試代碼所在的目錄,例如:JUnit 代碼 |
${basedir}/src/test/resources |
測(cè)試相關(guān)的資源文件所在的目錄 |
${basedir}/src/main/webapp/WEB-INF |
web 應(yīng)用文件目錄,web 項(xiàng)目的信息,比如存放 web.xml、本地圖片、jsp 視圖頁(yè)面 |
${basedir}/target |
打包輸出目錄 |
${basedir}/target/classes |
編譯輸出目錄 |
${basedir}/target/test-classes |
測(cè)試編譯輸出目錄 |
2.2.1根目錄的pom.xml文件
<?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.xxxx</groupId>
<artifactId>maven01</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>maven01</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
<junit.version>5.7.0</junit.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
標(biāo)簽定義解釋:
根目錄下的第一個(gè)子元素Modelversion指定當(dāng)前Pom模型的版本,對(duì)于Maven3來(lái)說(shuō),它只能是4.0.0。指定了當(dāng)前Maven模型的版本號(hào),對(duì)于Maven2和Maven3來(lái)說(shuō),它只能是4.0.0
groupId定義了項(xiàng)目屬于哪個(gè)組,這個(gè)組往往和項(xiàng)目所在的組織和公司存在關(guān)聯(lián)。
比如:com.xxx
artifactId定義了當(dāng)前Maven項(xiàng)目在組中唯一的ID。
version x.×.x-里程碑
比如:1.0.O-SNAPSHOT
第一個(gè)x 大版本 有重大變革
第二個(gè)x 小版本 修復(fù)bug,增加功能
第三個(gè)x 更新
里程碑版本:
SNAPSHOT(快照,開發(fā)版)
a1pha(內(nèi)部測(cè)試)
beta(公開測(cè)試)
Release | RC(發(fā)布版)
GA(正常版本)
使用name標(biāo)簽聲明一個(gè)對(duì)于用戶更為友好的項(xiàng)目名稱,雖然不是必須的,但還是推薦為每個(gè)Pom聲明name,以方便信息交流。
2.2.2編寫主函數(shù)
package com.xxxx.demo;
public class Hello{
public static void main(String[] args){
System.out.println("Hello maven");
}
}
2.2.3cmd 下編譯并運(yùn)行
??注:第一次下載會(huì)比較慢,要修改maven解壓之后的conf目錄下的settings.xml。
修改配置
1.1.修改默認(rèn)倉(cāng)庫(kù)位置
打開maven目錄 -> conf -> settings.xm1添加倉(cāng)庫(kù)位置配置
<localRepository>F:/m2/ repository</localRepository>
注:倉(cāng)庫(kù)位置改為自己本機(jī)的指定目錄,"/"不要寫反
1.2.更換阿里鏡像,加快依賴下載
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
進(jìn)入項(xiàng)目的根目錄,cmd進(jìn)入終端
1.編譯java文件
??mvn compile
2.執(zhí)行main方法
??mvn exec:java -Dexec.mainClass="com.xxxx.demo.Hello"
引號(hào)里的是包名和類名
3.Maven命令
3.1.常用命令
| 命令 | 描述 |
|---|---|
| mvn -version | 顯示版本信息 |
| mvn clean | 清理項(xiàng)目生產(chǎn)的臨時(shí)文件,一般是模塊下的target目錄 |
| mvn compile | 編譯源代碼,一般編譯模塊下的src/main/java目錄 |
| mvn package | 項(xiàng)目打包工具,會(huì)在模塊下的target目錄生成jar或war等文件 |
| mvn test | 測(cè)試命令,或執(zhí)行src/test/java/下junit的測(cè)試用例 |
| mvn install | 將打包的jar/war文件復(fù)制到你的本地倉(cāng)庫(kù)中,供其他模塊使用 |
| mvn deploy | 將打包的文件發(fā)布到遠(yuǎn)程參考,提供其他人員進(jìn)行下載依賴 |
| mvn site | 生成項(xiàng)目相關(guān)信息的網(wǎng)站 |
| mvn eclipse:eclipse | 將項(xiàng)目轉(zhuǎn)化為Eclipse項(xiàng)目 |
| mvn dependency:tree | 打印出項(xiàng)目的整個(gè)依賴樹 |
| mvn archetype:generate | 創(chuàng)建Maven的普通java項(xiàng)目 |
| mvn tomcat7:run | 在tomcat容器中運(yùn)行web應(yīng)用 |
| mvn jetty:run | 調(diào)用Jetty插件的Run目標(biāo)在Jetty Servlet容器中啟動(dòng)web 應(yīng)用 |
??注意:運(yùn)行maven命令的時(shí)候,首先需要定位到maven項(xiàng)目的目錄,也就是項(xiàng)目的pom .xm1文件所在的目錄。否則,必以通過(guò)參數(shù)來(lái)指定項(xiàng)目的目錄。
3.2.命令參數(shù)
??上面列舉的只是比較通用的命令,其實(shí)很多命令都可以攜帶參數(shù)以執(zhí)行更精準(zhǔn)的任務(wù)。4.2.1.-D傳入屬性參數(shù)
例如:
mvn package -Dmaven.test.skip=true
??以-D開頭,將maven.test.skip的值設(shè)為true ,就是告訴maven打包的時(shí)候跳過(guò)單元測(cè)試。同理,mvndeploy-Dmaven.test.skip=true代表部署項(xiàng)目并跳過(guò)單元測(cè)試。
3.2.2.-P使用指定的Profile配置
比如項(xiàng)目開發(fā)需要有多個(gè)環(huán)境,一般為開發(fā),測(cè)試,預(yù)發(fā),正式4個(gè)環(huán)境,在pom.xml中的配置如下:
<profiles>
<profile>
<id>dev</id>
<properties>
<env>dev</env>
</properties>
<activation>
<activeByDefau1t>true</activeByDefault>
</activation>
</profile>
<profile>
<id>qa</id>
<properties>
<env>qa</env>
</properties>
</profile>
<profile>
<id>pre</id>
<properties>
<env>pre</env>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<env>prod</env>
</properties>
</profile>
</profiles>
...
<bui1d>
<filters>
<filter>config/${env}.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
...
</bui1d>