最近在做maven plugin自定義開發方面的研究,順帶把maven相對較系統的回顧了一遍,這個系列的筆記算是一些對maven2.0在軟件開發各個生命周期中的使用小結吧。
所謂“萬事開頭難”,開發一個java
application一開始最難的部分就是開始,如此多的邏輯概念的堆積,java代碼,資源文件,應用依賴.jar應該如何組織存放?unit
testing應該在什么時候執行?項目應該如何build?documented?tested?deployed?
很多工具可以提供項目的build,比如眾所周知的ant。這邊不做具體說明和對比,我只羅列出maven能給我們帶來什么,官方網站給出的benefits list如下:
The benefits of Maven 2.0 are numerous, as it does more than merely build your projects. If you are just starting a new Java project
and you need to get started fast, Maven 2.0 will have you up an running in minutes.
The following are some of the advantages of Maven 2.0:
Standardized project layout and project structure generator.
Standardized dependency-management mechanism.
Multiple project support.
Instant downloads of new plugins and features as the developer needs them.
Website generation for up-to-date project information.
Integration with source control: CVS and Subversion.
maven帶來了標準工程組織結構,標準工程發布管理機制,多重項目支持(模塊化規劃工程),插件的自主開發接口及可插拔安裝,website生成及實時項目信息同步更新,通過與與svn或cvs的集成實現代碼版本控制。下面開始介紹maven的使用介紹。
Getting Started:
假設現在開始一個java application的開發,我們可以應用maven來快速構建應用的程序結構,而不需要按以往的習慣在ide中手動進行層級創建,(maven的安裝不做介紹)
在命令窗口輸入命令:
1 mvn archetype:create -DgroupId=com.as -DartifactId=my-app
執行,你會發現maven已經為我們創建了名稱為my-app的項目,其中項目結構如下:
1 my-app
2 |----src
3 |----main
4 |------java
5 |--------com
6 |----------as
7 |----test
8 |------java
9 |--------com
10 |----------as
這個結構包含了兩個資源目錄樹:java application code和unit test code。在工程根目錄下maven創建了pom.xml文件,是項目的最基本部分(the meat and potatoes )。
pom.xml是一系列的操作集合,用來告訴maven怎么build項目和引入項目build所需要的外部依賴及執行其他特殊操作。默認的,maven會加載junit依賴,來鼓勵開發人員對程序代碼測試實現。
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
3
4 <modelVersion>4.0.0</modelVersion>
5 <groupId>com.as</groupId>
6 <artifactId>my-app</artifactId>
7 <packaging>jar</packaging>
8 <version>1.0-SNAPSHOT</version>
9 <name>Maven Quick Start Archetype</name>
10 <url>http://maven.apache.org</url>
11 <dependencies>
12 <dependency>
13 <groupId>junit</groupId>
14 <artifactId>junit</artifactId>
15 <version>3.8.1</version>
16 <scope>test</scope>
17 </dependency>
18 </dependencies>
19 </project>
之前的操作已經創建了一個新的項目,并按maven提供的標準程序結構組織各個層次的代碼存放目錄。還是在命令窗口,切入到工程目錄,以下羅列出maven的基本操作命令及說明:
1 mvn test: 運行應用的所有單元測試。
2 mvn package: 創建打包應用的.jar文件.(pom.xml文件配置為packaging操作為jar操作)
3 mvn install: 安裝工程生成jar文件到maven倉庫,以提供其他應用依賴應用。
4 mvn site: 生成項目信息網站。
5 mvn clean: 清除應用編譯存放目錄。
6 mvn eclipse:eclipse: 將應用功能轉化為eclipse可以直接導入的工程。
現在我們來創建一個基于java語言的web應用,在命令窗口輸入:
1 mvn archetype:create -DgroupId=com.as -DartifactId=my-webapp -DarchetypeArtifactId=maven-archetype-webapp
生成的項目目錄結構如下:
my-webapp
|----src
|------main
|----resources
|----webapp
|----WEB-INF
和之前創建的項目有所不同的是創建一些將被打包到war中的資源目錄,并且pom.xml文件中,packaging操作被指定為war而不是之前的jar。而且我們不用去擔心在打包成war的時候如何
將所有依賴拷貝到WEB-INF/lib目錄下,maven會自動的處理這一切。另外,通過修改pom.xml中的build元素的finalName元素值,可以修改打包的war的名稱。
Dependency Management :
之前的創建操作,讓我們快速擁有了程序架構,那么回過頭來關心下maven是如何來管理應用所用到的依賴。
應用添加一個依賴是通過在pom.xml中新增dependencies元素的子元素dependency來實現。maven在下次build的時候會讀
取新增的dependency信息并從遠程或本地倉庫中下載并加載到工程的build path.比如我們要新增個依賴:quartz
,那么我們只需要在dependencies中增加如下格式的依賴定義:
1 <dependency>
2 <groupId>quartz</groupId>
3 <artifactId>quartz</artifactId>
4 <version>1.5.1</version>
5 <scope>compile</scope>
6 </dependency>
可以不用去關心quartz本身會再用到什么依賴,maven會自動把依賴所用的所有依賴都一起下載到你的本地倉庫,并配置到你的工程build path。另外,在之前的junit依賴中,maven設置了
其scope為test,那么意味著,maven只會在test phase中加載junit這個依賴。下面羅列出依賴的scope在各個階段的定義:
1 compile: 默認值,說明依賴資源必須存在于各個build階段或任務。
2 test: 只在test階段加載。
3 runtime: 依賴資源只在運行時加載。
4 provided: 依賴在運行時加載,但是不會出現在打出的包里。類似你要把某個依賴當作jdk的一個部分或者application server classpath.
Configuring Repositories:
項目中的每個開發人員各自定義項目依賴倉庫,貌似不是很方便且有點繁瑣,為此,maven提供了在同個pom.xml文件中同時定義多個依賴倉庫的功能。在下面的pom.xml文件配置片段中,
設置了兩個依賴倉庫配置,默認的倉庫依賴路徑為Ibiblio,另外添加了個鏡像倉庫路徑作為備選,比如設置為本地局域網內的某個服務器地址,詳細配置如下:
<repositories>
<repository>
<id>Ibiblio</id>
<name>Ibiblio</name>
<url>http://www.ibiblio.org/maven/</url>
</repository>
<repository>
<id>intranet</id>
<name>intranet mirror</name>
<url>http://192.168.1.120/maven2</url>
</repository>
</repositories>
Building Multiple Projects using a Parent pom.xml:
當一個項目分成多個模塊子項目進行開發規劃的時候,maven提供了通過parent pom.xml文件來進行多樣工程配置綁定。
maven的依賴檢查機制將分析檢查各個子項目所用到的依賴并按互相依賴的順序build各個子項目。下面舉個例子來說明:
parent pom.xml:
1 <project>
2 <modelVersion>4.0.0</modelVersion>
3 <groupId>com.as</groupId>
4 <version>1.0-SNAPSHOT</version>
5 <artifactId>my-app</artifactId>
6 <packaging>pom</packaging>
7 <modules>
8 <module>Common</module>
9 <module>Utilities</module>
10 <module>Application</module>
11 <module>WebApplication</module>
12 </modules>
13 </project>
在這里,假設WebApplication需要確定是否包含了其他三個子項目的所有依賴,所以,把其他三個子項目按依賴的形式進行配置到WebApplication中;并且Utilities依賴于Common,
Application依賴于Common,Utilities。即體現開發中遇到的各個子模塊項目存在相互依賴的情況。接下來,對各個子項目的pom.xml進行配置如下:
Utilities:
<dependencies>
<dependency>
<groupId>com.as</groupId>
<artifactId>Common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
Application:
<dependencies>
<dependency>
<groupId>com.as</groupId>
<artifactId>Common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.as</groupId>
<artifactId>Utilities</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
WebApplication:
<dependencies>
<dependency>
<groupId>com.as</groupId>
<artifactId>Common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.as</groupId>
<artifactId>Utilities</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.as</groupId>
<artifactId>Application</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
這樣,只需要在parent pom.xml中添加各個模塊項目的配置,來說明它們是當前build的一部分。
<parent>
<groupId>com.as</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
Common, Utilities, Application, 和WebApplication目錄于parent pom.xml文件存在于同個目錄下。在parent pom.xml同級目錄下執行maven package命令的時候,
各個子模塊項目就會按順序進行build任務了。
Plugins and Reports:
maven2.0提供了方便的plugin注冊入口。有點遺憾的是,很多maven1.x 的plugin不能在maven2.0上運行,不過,現在maven2.0的plugin已經很豐富了,所以,這個問題也就不再是問題了。
下面是配置jdk 5的編譯參數的plugin配置:
<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>
另外一個使用比較頻繁的maven plugin就是maven reporting plugin了,當執行mvn site命令時,這個plugin將發揮它的作用,配置使用如下:
<reporting>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
</plugin>
</plugins>
</reporting>
Maven Plugin Matrix(http://docs.codehaus.org/display/MAVEN/Maven+Plugin+Matrix) ,可以搜索到相關plugin可以在說明版本的maven上使用的詳細信息。
Maven and Eclipse:
如果你按之前的說明操作,創建了一個新的項目,生成了項目的程序目錄結構,你只要在項目的根目錄路徑下,在命令窗口中執行mvn
eclipse:eclipse,就能把當前項目轉化為在eclipse
ide中可以import到workspace的項目了,這樣,在eclipse ide中,就可以很方便的進行進一步的代碼實現了。
Conclusion:
maven2.0提供了很多有用且高效的功能,特別是提供程序標準目錄結構,這樣,在開發的時候就不但可以很方便的把一個項目移動到另個項目,而且可以不用太關心程序目錄結構和項目編譯說明,maven已經提供了標準 :)
實際應用中,maven也提供了各種build system的自定義擴展,maven可以方便的進行 run
nightly,deploy,并分布發送通知信息,從文檔方面來說,maven提供了實時的項目信息site生成,每次build完畢,配置自動進行
site信息和項目實際開發進程更新同步.
maven2.0帶來的可升級的build配置,方面使用,項目管理,在今后,更多的maven給出的build技術方面的標準的采用,意味著更多的效率,更多的方便。
更詳細的信息可以在maven的官方網站得到。
推薦學習maven的書籍: better builds with maven (雖然個人感覺文筆不怎么樣,但是,算是市面上唯一比較全面的maven使用介紹比較全的書吧)
版權聲明:轉載時請以超鏈接形式標明文章原始出處和作者信息及本聲明.