構建(build)一個項目包括:下載依賴,編譯源代碼,執行單元測試,以及打包編譯後的源代碼等一系列子任務。手工的執行這些任務是一項很是繁瑣,且容易出錯的事情。Maven封裝了這些子任務,並提供給用戶執行這些子任務的命令。簡而言之,Maven是Java項目的一個管理和構建(build)工具。html
項目對象模型(如下簡稱POM)是Maven的基本組成單元,它是位於項目主目錄下的一個xml文件(pom.xml),Maven使用pom.xml文件中的信息來構建(build)項目。spring
一個簡單的pom.xml的結構看起來以下:apache
<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> <properties> <maven.compiler.source>1.6</maven.compiler.source> <maven.compiler.target>1.6</maven.compiler.target> </properties> <build> <plugins> <plugin> //... </plugin> </plugins> </build> </project>
本小結將介紹pom.xml中經常使用的一些元素。編程
groupId
- 建立項目的公司或者組織的名稱artifactId
- 項目的名稱version
- 項目的版本號packaging
- 項目的打包方式(jar/war/pom)GAV (groupId:artifactId:version)是Maven項目的惟一表示符。packaging決定Maven生成包的類型,默認值是jar。app
pom.xml文件經過元素<dependency>
來聲明外部依賴,例如:maven
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies>
聲明項目依賴3.8.1版本的junit。默認狀況下,Maven將在構建項目的時候從Maven的中央倉庫(Central Repository)下載依賴到本地倉庫(${USER_HOME/.m2/repository/})。不過用戶也能夠經過元素<repository>
來聲明備選倉庫(alternate repository)。編程語言
能夠像在Java等編程語言中定義變量同樣,在pom.xml文件中定義屬性,這樣就能夠達到一處定義,多處使用的目的,使用和維護起來也更加容易。ide
pom.xml中經過元素<properties>
定義屬性,經過佔位符${property_name}
使用屬性。以下:工具
<properties> <spring.version>4.3.5.RELEASE</spring.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> </dependencies>
若是在未來須要升級spring-core和spring-context的版本,那時將只須要修改屬性spring.version
的值。單元測試
元素<build>
中能夠指定默認的Maven Goal的信息,編譯後的文件的名稱,名稱等信息。以下:
<build> <defaultGoal>install<defaultGoal> <directory>${basedir}/target</directory> <finalName>${artifactId}-${version}</finalName> ... </build>
在實際的平常開發中,在不一樣的環境(test/prod) 一般會有不一樣的構建(build)邏輯或者配置。元素<profile>
能夠用來實現這個目的。以下:
<profiles> <profile> <id>prod</id> <build> <plugins> <plugin> //... </plugin> </plugins> </build> </profile> <profile> <id>test</id> <activation> <activeByDefault>true</activeByDefault> </activation> <build> <plugins> <plugin> //... </plugin> </plugins> </build> </profile> </profiles>
若是想觸發某個profile,可使用命令:mvn clean install -P<profile id>
。
Maven的構建生命週期定義瞭如何構建和發佈Java項目,Maven內建了三種構建生命週期:clean,default,site。構建生命週期由一系列的階段(phase)構成:
具體各個階段的定義能夠參考Maven文檔。命令 mvn <phase>
能夠用來執行<phase>以及<phase>以前的階段。例如:mvn install
將執行validate ~ install全部的階段。
......
多模塊(multi-module)和 plugin goal,等等。