Maven是apache的一個開源項目。是一個用來把源代碼構建成可發布的構件的工具。
Maven的功能非常強大,可以認為是一個項目管理工具,不僅僅是一個構建工具。
Maven本身的核心很小,但是可以在上面擴展出很多的插件。Mven采用的是插件的思想,通過插件的功能擴展出很多的功能。同時Maven采用約定大于配置的思想,在項目中采用了很多約定規則來減少配置。不想ant這樣的構建工具需要很多的配置。作為一個項目構建工具,最重要的是管理項目的庫和項目之間的依賴關系。
本文將以以下面的例子,來作為學習maven的一個過程。
假設要構建一個名為Content-Search的項目,該項目包含了三個子項目:contentSearch-dal,contentSearch-biz,contentSearch-web。項目采用Struts2、hibernate3、spring2.5的框架結合。使用mysql數據庫。
contentSearch-web:Web層的代碼, struts2+spring2.5結合的框架。
contentSearch-biz:業務邏輯層代碼。
contentSearch-dal:數據持久層代碼。
三個項目之間的依賴和對外部庫的依賴關系大概如下:
?
?
?
?
作為從一個項目構建工具角度出發,maven主要要實現的就是項目的依賴的二方、三方庫管理,項目之間的依賴管理。以及項目的整個生命周期的管理,包括編譯(compile)、測試(test)、打包(packaging)、部署(install)等。
以以上為背景,先介紹下maven的基本概念:
依賴管理:對每個項目對外部的依賴的管理。
遠程倉庫:maven外部引用倉庫的管理。
項目LifeCycle抽象和管理:項目生命周期編譯、測試和打包等過程的抽象和管理。
?
- 1.?Maven安裝
http://maven.apache.org/download.html在上面根據不同的操作系統選擇不同的安裝版本。
安裝后的目錄結構如下:
bin/:maven腳本
boot/
conf/:全局的settings.xml。?如果需要自己定制可以覆蓋.m2文件夾里的settings.xml文件。
lib/:有包含maven核心的jar文件
設置環境變量: M2_HOME=maven安裝路徑??Path: $M2_HOME/bin
?
?
- 2.?Maven核心概念
groupId , artifactId, packaging, version:——?以上4個是?Maven?的?坐?標(coordinates),它們唯一標識了一個項目。
groupId:?團體,公司,小組,組織,項目,或者其它團體。如contentSearch-web,contentSearch-dal,contentSearch-biz同屬一個groupId。
artifactId:在?groupId?下的表示一個單獨項目的唯一標識符。項目名稱ID?。
packaging:?標識項目的類型,如jar,war等。
Version:版本號。
以文章開頭的例子為例,contentSearch-web的坐標可以定義如下:
groupId: com.companyName.contentSearch
artifactId:contentSearch-web
packaging: war
Version:1.0。
而contentSearch-dal的坐標如下:
groupId: com.companyName.contentSearch
artifactId:contentSearch-dal
packaging: jar
Version:1.0。
在一個?Maven?倉庫中,所有的東西存儲在一個與?Maven?項目坐標十分匹配的目錄結構中。
/groupId/artifactId/version/artifactId-version.packaging.
?
POM:項目抽象模型
這是maven非常核心的概念。Maven通過它來管理項目。每一個項目都有一個pom.xml文件,該文件定義了改項目的基本信息,依賴關系等,maven對項目的生命周期管理也是基于此文件。以contentSearch-dal為例,該項目的pom.xml定義如下(關于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>
?????????<parent>
???????????????????<groupId> com.companyName.contentSearch</groupId>
???????????????????<artifactId>contentSearch</artifactId>
???????????????????<version>1.0</version>
?????????</parent>
?????????<artifactId>contentSearch-dal</artifactId>
?????????<packaging>jar</packaging>
?????????<version>1.0</version>
?????????<name>contentSearch-dal</name>
?????????<url>http://maven.apache.org</url>
?????????<dependencies>
???????????????????<dependency>
????????????????????????????<groupId>junit</groupId>
????????????????????????????<artifactId>junit</artifactId>
????????????????????????????<version>3.8.1</version>
????????????????????????????<scope>test</scope>
???????????????????</dependency>
???????????????????<dependency>
????????????????????????????<groupId>generalorm</groupId>
????????????????????????????<artifactId>hibernate</artifactId>
????????????????????????????<version>3.0</version>
???????????????????</dependency>
???????????????????<dependency>
????????????????????????????<groupId>mysql</groupId>
????????????????????????????<artifactId>mysql-connector-java</artifactId>
????????????????????????????<version>5.1.6</version>
???????????????????</dependency>
???????????????????<dependency>
????????????????????????????<groupId>log4j</groupId>
????????????????????????????<artifactId>log4j</artifactId>
????????????????????????????<version>1.2.14</version>
???????????????????</dependency>
???????????????????<dependency>
????????????????????????????<groupId>dom4j</groupId>
????????????????????????????<artifactId>dom4j</artifactId>
????????????????????????????<version>1.6.1</version>
???????????????????</dependency>
???????????????????<dependency>
????????????????????????????<groupId>slf4j</groupId>
????????????????????????????<artifactId>slf4j-api</artifactId>
????????????????????????????<version>1.5.8</version>
???????????????????</dependency>
???????????????????<dependency>
????????????????????????????<groupId>slf4j</groupId>
????????????????????????????<artifactId>slf4j-nop</artifactId>
????????????????????????????<version>1.5.2</version>
???????????????????</dependency>
???????????????????<dependency>
????????????????????????????<groupId>antlr</groupId>
????????????????????????????<artifactId>antlr</artifactId>
????????????????????????????<version>2.7.6</version>
???????????????????</dependency>
???????????????????<dependency>
????????????????????????????<groupId>jta</groupId>
????????????????????????????<artifactId>jta</artifactId>
????????????????????????????<version>1.1</version>
???????????????????</dependency>
???????????????????<dependency>
????????????????????????????<groupId>javassist</groupId>
????????????????????????????<artifactId>javassist</artifactId>
????????????????????????????<version>3.9.0.GA</version>
???????????????????</dependency>
???????????????????<dependency>
????????????????????????????<groupId>commons-collections</groupId>
????????????????????????????<artifactId>commons-collections</artifactId>
????????????????????????????<version>3.1</version>
???????????????????</dependency>
?????????</dependencies>
</project>
Repository
倉庫,二方庫,三方庫的概念。每當安裝完成maven之后就會有一個默認的本地倉庫和遠程倉庫。本地倉庫在用戶工作目錄下的.m2文件夾,如在linux下為/home/yblin/.m2。遠程repository默認在settings.xml里面配置,如果要修改該文件必須在.m2文件夾下面替換一下即可。當進行編譯的時候,maven會先查找本地Repository,如果本地Repository沒有,會去取遠程repository?。
?
?
- 3.?Maven命令
創建一個項目:
mvn archetype:create -DgroupId=com.xxx.simple??- DartifactId =simple
archetype:create是一個goal,-DgroupId=org.sonatype.mavenbook.ch03代表要傳到目標goal任務的參數,以-D開頭。
插件和目標:maven archetype:create. Archetype是插件標識,create是目標標識。
一個?Maven?插件是一個單個或者多個目標的集合。Maven?插件的例子有一些簡單但核心的插件,像?Jar?插件,它包含了一組創建JAR?文件的目標,Compiler插件,它包含了一組編譯源代碼和測試代碼的目標,或者?Surefire?插件,它包含一組運行單元測試和生成測試報告的目標。而其它的,更有專門的插件包括:Hibernate3?插件,用來集成流行的持久化框架?Hibernate,JRuby?插件,它讓你能夠讓運行?ruby?稱為?Maven?構建的一部分或者用?Ruby?來編寫?Maven?插件。Maven也提供了自定義插件的能力。一個定制的插件可以用?Java?編寫,或者用一些其它的語言如?Ant,Groovy,beanshell?和之前提到的?Ruby。
?
生命周期命令:maven install等
Mvn install命令沒有進行任何插件配置或者定制,所以這個例子綁定了一組標準插件的目標到默認的生命周期。當?Maven?經過以?package?為結尾的默認生命周期的時候,下面的目標按順序被執行:
resources:resources
??????Resources?插件的?resources?目標綁定到了?resources?階段。這個目標復
??????制?src/main/resources?下的所有資源和其它任何配置的資源目錄,到輸
??????出目錄。
compiler:compile
??????Compiler?插件的?compile?目標綁定到了?compile?階段。這個目標編譯
??????src/main/java?下的所有源代碼和其他任何配置的資源目錄,到輸出目
??????錄。
resources:testResources
??????Resources?插件的?testResources?目標綁定到了?test-resources?階段。
??????這個目標復制?src/test/resources?下的所有資源和其它任何的配置的測
??????試資源目錄,到測試輸出目錄。
compiler:testCompile
??????Compiler?插件的?testCompile?目標綁定到了?test-compile?階段。這個目
??????標編譯?src/test/java?下的測試用例和其它任何的配置的測試資源目錄,
??????到測試輸出目錄。
surefire:test
??????Surefire?插件的?test?目標綁定到了?test?階段。這個目標運行所有的測試
??????并且創建那些捕捉詳細測試結果的輸出文件。默認情況下,如果有測試失
??????敗,這個目標會終止。
jar:jar
??????Jar?插件的?jar?目標綁定到了?package?階段。這個目標把輸出目錄打包成
??????JAR?文件。
當?Maven?運行一個目標的時候,每個目標都會訪問定義在項目?POM?里的信息。
?
?
其他命令:
mvn install:install-file -DgeneratePom=true -DgroupId=jep -DartifactId=jep -Dversion=3.3.0 -Dpackaging=jar -Dfile=E:/lib/LIB_COMMON/jep-3.3.0-trial.jar:添加一個包到依賴庫。
mvn dependency:resolve??mvn dependency:tree瀏覽項目依賴。
mvn archetype:create?:創建?Maven?項目
mvn compile?:編譯源代碼
mvn test-compile?:編譯測試代碼
mvn test?:?運行應用程序中的單元測試
mvn site?:?生成項目相關信息的網站
mvn clean?:清除目標目錄中的生成結果
mvn package?:?依據項目生成?jar?文件
mvn install?:在本地?Repository?中安裝?jar
mvn eclipse:eclipse?:生成?Eclipse?項目文件
- 4.?Maven實踐
?
以文章開頭例子為例,做為實踐。
1.?下載依賴包,并添加到本地repository.如果配置了遠程依賴庫里面已經有了這些依賴包,那無需下載,在編譯時會自動下載到本地庫。
下載struts2,hibernate2,spring2.5,mysql-jdbc等相關的包到本地,通過命令安裝到本地repository.
mvn install:install-file -DgrouptId=framework -DartifactId=spring-beans -Dversion=2.5.6 -Dfile=spring-beans-2.5.6.jar
該命令將spring-beans-2.5.6.jar安裝到本地repository.
2.?創建總控項目
mvn archetype:create命令創建總控項目,修改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.companyName.contentSearch?</groupId>
??<artifactId>contentSearch</artifactId>
??<packaging>pom</packaging>
??<version>1.0</version>
??<name>Chapter 6 Simple Parent Project</name>
??<modules>
????<module>contentSearch-dal</module>
????<module>contentSearch-biz</module>
????<module>contentSearch-web</module>
??</modules>
??<build>
????<pluginManagement>
??????<plugins>
????????<plugin>
??????????<groupId>org.apache.maven.plugins</groupId>
??????????<artifactId>maven-compiler-plugin</artifactId>
??????????<configuration>
????????????<source>1.5</source>
????????????<target>1.5</target>
??????????</configuration>
????????</plugin>
??????</plugins>
???</pluginManagement>
??</build>
??<dependencies>
????<dependency>
??????<groupId>junit</groupId>
??????<artifactId>junit</artifactId>
??????<version>3.8.1</version>
??????<scope>test</scope>
????</dependency>
??</dependencies>
</project>
3.?創建子項目
總控項目包括了三個子項目,在總控項目文件夾下面創建3個子項目如下:
contentSearch-dal:
<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>
?
<parent>
?????<groupId>?com.companyName.contentSearch?</groupId>
?????<artifactId>contentSearch</artifactId>
?????<version>1.0</version>
</parent>
<artifactId>contentSearch-dal</artifactId>
<packaging>jar</packaging>
<version>1.0</version>
<name>contentSearch-dal</name>
<url>http://maven.apache.org</url>
<dependencies>
?????<dependency>
?????????<groupId>junit</groupId>
?????????<artifactId>junit</artifactId>
?????????<version>3.8.1</version>
?????????<scope>test</scope>
?????</dependency>
?????<dependency>
?????????<groupId>generalorm</groupId>
?????????<artifactId>hibernate</artifactId>
?????????<version>3.0</version>
?????</dependency>
?????<dependency>
?????????<groupId>mysql</groupId>
?????????<artifactId>mysql-connector-java</artifactId>
?????????<version>5.1.6</version>
?????</dependency>
?????<dependency>
?????????<groupId>log4j</groupId>
?????????<artifactId>log4j</artifactId>
?????????<version>1.2.14</version>
?????</dependency>
?????<dependency>
?????????<groupId>dom4j</groupId>
?????????<artifactId>dom4j</artifactId>
?????????<version>1.6.1</version>
?????</dependency>
?????<dependency>
?????????<groupId>slf4j</groupId>
?????????<artifactId>slf4j-api</artifactId>
?????????<version>1.5.8</version>
?????</dependency>
?????<dependency>
?????????<groupId>slf4j</groupId>
?????????<artifactId>slf4j-nop</artifactId>
?????????<version>1.5.2</version>
?????</dependency>
?????<dependency>
?????????<groupId>antlr</groupId>
?????????<artifactId>antlr</artifactId>
?????????<version>2.7.6</version>
?????</dependency>
?????<dependency>
?????????<groupId>jta</groupId>
?????????<artifactId>jta</artifactId>
?????????<version>1.1</version>
?????</dependency>
?????<dependency>
?????????<groupId>javassist</groupId>
?????????<artifactId>javassist</artifactId>
?????????<version>3.9.0.GA</version>
?????</dependency>
?????<dependency>
?????????<groupId>commons-collections</groupId>
?????????<artifactId>commons-collections</artifactId>
?????????<version>3.1</version>
?????</dependency>
</dependencies>
</project>
contentSearch-biz:
<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>
<parent>
?????<groupId>?com.companyName.contentSearch</groupId>
?????<artifactId>contentSearch</artifactId>
?????<version>1.0</version>
</parent>
<artifactId>contentSearch-biz</artifactId>
<packaging>jar</packaging>
<version>1.0</version>
<name>contentSearch-biz</name>
<url>http://maven.apache.org</url>
<dependencies>
?????<dependency>
?????????<groupId>junit</groupId>
?????????<artifactId>junit</artifactId>
?????????<version>3.8.1</version>
?????????<scope>test</scope>
?????</dependency>
?????<dependency>
?????????<groupId>?com.companyName.contentSearch?</groupId>
?????????<artifactId>contentSearch-dal</artifactId>
?????????<version>1.0</version>
?????????<scope></scope>
?????</dependency>
?????<dependency>
?????????<groupId>com.sun</groupId>
?????????<artifactId>mail</artifactId>
?????????<version>1.4.3</version>
?????????<scope></scope>
?????</dependency>
?????<dependency>
?????????<groupId>com.sun</groupId>
?????????<artifactId>activation</artifactId>
?????????<version>1.1.1</version>
?????????<scope></scope>
?????</dependency>
</dependencies>
</project>
contentSearch-web:
<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>
<parent>
?????<groupId>?com.companyName.contentSearch?</groupId>
?????<artifactId>contentSearch</artifactId>
?????<version>1.0</version>
</parent>
<artifactId>contentSearch-web</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>contentSearch-web Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
?????<dependency>
?????????<groupId>apache.tomcat</groupId>
?????????<artifactId>servlet-api</artifactId>
?????????<version>2.5</version>
?????</dependency>
?????<dependency>
?????????<groupId>apache.commons</groupId>
?????????<artifactId>commons-fileupload</artifactId>
?????????<version>1.2.1</version>
?????</dependency>
?????<dependency>
?????????<groupId>commons-logging</groupId>
?????????<artifactId>commons-logging</artifactId>
?????????<version>1.0.4</version>
?????</dependency>
?????<dependency>
?????????<groupId>apache.tomcat</groupId>
?????????<artifactId>jsp-api</artifactId>
?????????<version>1.0</version>
?????</dependency>
?????<dependency>
?????????<groupId>junit</groupId>
?????????<artifactId>junit</artifactId>
?????????<version>3.8.1</version>
?????????<scope>test</scope>
?????</dependency>
?????<dependency>
?????????<groupId>framework</groupId>
?????????<artifactId>struts2-core</artifactId>
?????????<version>2.1.8</version>
?????</dependency>
?????<dependency>
?????????<groupId>framework</groupId>
?????????<artifactId>xwork-core</artifactId>
?????????<version>2.1.6</version>
?????</dependency>
?????<dependency>
?????????<groupId>framework</groupId>
?????????<artifactId>spring-core</artifactId>
?????????<version>2.5.6</version>
?????</dependency>
?????<dependency>
?????????<groupId>framework</groupId>
?????????<artifactId>spring-web</artifactId>
?????????<version>2.5.6</version>
?????</dependency>
?????<dependency>
?????????<groupId>framework</groupId>
?????????<artifactId>spring-context</artifactId>
?????????<version>2.5.6</version>
?????</dependency>
?????<dependency>
?????????<groupId>framework</groupId>
?????????<artifactId>spring-beans</artifactId>
?????????<version>2.5.6</version>
?????</dependency>
?????<dependency>
?????????<groupId>framework</groupId>
?????????<artifactId>freemarker</artifactId>
?????????<version>2.3.15</version>
?????</dependency>
?????<dependency>
?????????<groupId>framework</groupId>
?????????<artifactId>struts2-spring-plugin</artifactId>
?????????<version>2.1.8</version>
?????</dependency>
?????<dependency>
?????????<groupId>?com.companyName.contentSearch?</groupId>
?????????<artifactId>contentSearch-biz</artifactId>
?????????<version>1.0</version>
?????</dependency>
?????<dependency>
?????????<groupId>framework</groupId>
?????????<artifactId>struts2-json-plugin</artifactId>
?????????<version>2.1.8</version>
?????</dependency>
</dependencies>
<build>
?????<finalName>contentSearch-web</finalName>
?????<plugins>
?????????<plugin>
?????????????<groupId>org.mortbay.jetty</groupId>
?????????????<artifactId>maven-jetty-plugin</artifactId>
?????????????<version>6.1.9</version>
?????????</plugin>
?????</plugins>
</build>
</project>
4.?編寫代碼,打包運行。
mvn clean install
mvn jetty:run
以上只是從構建的角度介紹maven的使用,還有很多其他的特性待以后學習后再做介紹。作為一個優秀的構建工具,maven還是值得推薦的。
?
http://maven.apache.org/guides/?
附上官網上的指南地址。