Maven
最初的目的是在Jakarta Turbine項目中使構建處理簡單化。幾個項目之間使用到的Ant
build文件差異很小,各個JAR都存入CVS。因此希望有一個標準的方法構建各個工程,清晰的定義一個工程的組成,一個容易的方法去發布項目信息并且
去提供一種在各個項目之間共享JAR包。
結果出現了一種功能能用于構建和管理任何基于java的工程。Maven小組希望他們已經做到了一些事情,這將有助于Java開發者更容易的完成每天的工作并且有助于理解任何基于java的項目。
Maven的目標¶
- 使構建過程更容易
- 提供統一構建系統
- 提供高質量的項目信息
- 提供開發的最佳實踐指南
- 能無縫的加入新的特性
對Maven的錯誤理解¶
- Maven是一個站點和文檔制作工具。
- Maven擴展了Ant,使其能下載到各種依賴包
- Maven是一系列可重用的Ant腳本
Maven的版本¶
Maven現在主要有Maven 1.x和Maven 2.x,其中現在最新版本是Maven 2.02。
Maven 2完成了對Maven 1的重寫。重寫的首要目的是要提供了強大的Jave構建和包含API的項目,允許Maven被植入任何地方,尤其是高級別的產品如IDEs、質量工具、報告工具等這些。Maven 2構建生命周期的概念正式化,其比Maven更易擴展。
因此現在我們主要研究的就是Maven 2。
Maven的安裝¶
Windows 2000/xp下的安裝¶
- 解壓縮maven-2.0.2-bin.zip到你希望安裝Maven 2.0.2的所在目錄。這里假設你選擇了C:\ProgramFiles\Apache Software Foundation\maven-2.0.2.
- 將C:\Program Files\Apache Software Foundation\maven-2.0.2\bin目錄加入到你的%path%環境變量中。
- 同時,確認JAVA_HOME是否正確設置成功。
- 運行 mvn --version 確認是否安裝成功。
顯示Maven version: 2.0.2 則表示安裝成功。
基于Unxi-based的操作系統(Linux,Solaris and Mac OS X)¶
- 解壓縮發布包到你希望安裝Maven 2.0.2的所在目錄。這里假設你選擇了/usr/local/maven-
- 將/usr/local/maven-2.0.2/bin目錄加入到你的path環境變量中,例如:PATH=/usr/local/maven-2.0.2y/bin: $PATH。
- 同時,確認JAVA_HOME是否正確設置成功。
- 運行 mvn --version 確認是否安裝成功。
顯示Maven version: 2.0.2 則表示安裝成功。
Maven主要功能¶
Maven是一種對項目的管理工具,它提供了一種方式來管理以下項目中涉及到的工作內容,同時以下也是Maven的主要功能:
- 構建項目(Builds)
- 文檔編制(Documentation)
- 報告(Reporting)
- 依賴管理(Dependencies)
- 配置管理(SCMs)
- 發布管理(Releases)
構建項目¶
首先創建一個Maven工程。Maven可用于構建java應用工程和java web應用工程。
web項目¶
mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-webapp -DarchetypeArtifactId=maven-archetype-webapp
目錄結果如下:
my-webapp
|-- pom.xml
`-- src
`-- main
|-- webapp
| |-- WEB-INF
| | `-- web.xml
| `--index.jsp
`-- resources
其他的目錄則需要自己補充。
其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.mycompany.app</groupId>
<artifactId>my-webapp</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>Maven Webapp Archetype</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>
<build>
<finalName>my-webapp</finalName>
</build>
</project>
java應用程序¶
mvn archetype:create -DgroupId=com.mycompany.ap -DartifactId=my-app
命令正確執行后,生成如下目錄:
my-app
|-- pom.xml
`-- src
|-- main
| `-- java
| `-- com
| `-- mycompany
| `-- app
| `-- App.java
`-- test
`-- java
`-- com
`-- mycompany
`-- app
`-- AppTest.java
其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.mycompany.ap</groupId>
<artifactId>my-app</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>Maven Quick Start Archetype</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>
Maven項目的標準目錄介紹¶
Maven提倡使用一個共同的標準目錄結構,使開發人員能在熟悉了一個Maven工程后,對其他的Maven工程也能清晰了解。這樣做也省去了很多設置的麻煩。
以下的文檔介紹是Maven希望的目錄結構,并且也是目錄創建工程是采用的目錄結構。Maven推薦大家盡可能的遵守這樣的目錄結構。
src/main/java - 應用程序/庫源碼
src/main/resources - 應用程序/庫資源
src/main/filters - 資源的filter文件
src/main/assembly - assembly描述符
src/main/config - 配置文件
src/main/webapps - Web應用程序源碼
src/test/java - 測試源碼
src/test/resources - 測試資源
src/test/filters - 測試資源的filter
src/site - 站點
LICENSE.txt - 項目許可
README.txt - 項目readmine
在頂級目錄上是工程的描述文件pom.xml(如果使用Ant則還包括其他屬性文件,maven.xml或build.xml),另外還包括提供給最終用戶的文件,如,README.txt, LICENSE.txt等等。
頂級目錄還包括兩個子目錄:src,target。頂級目錄下可能出現的其他目錄僅僅是CVS或.svn和其他多模塊工程的工程目錄,最好不要再有其他目錄。
Target目錄是所有工程編譯構建的輸出目錄。
Src目錄包含所有工程的源碼文件,配置文件,資源文件等等。它下面的子目錄一般包含main(主要的工程源文件),test(測試文件),site(項目站點文件)。
項目構建的生命周期的介紹¶
Maven 2是圍繞著構建生命周期概念設計的。這意味著,構建或者發布的過程已經被清晰的定義了。
當我們使用Maven構建工程時,我們只需要了解幾個Maven定義好的命令即可,其他的工作則交給POM來完成。
以下給出Maven提供的構建生命周期列表:
validate 驗證項目是否正確,所有必要信息是否可用。
generate-sources 生成編譯所需的任意源碼。
process-sources 處理源碼,比如過濾一些數值。
generate-resources 生成包里所需包含的資源。
process-resources 處理資源,并拷貝到目標目錄中,以便打包。
compile 編譯項目源碼
process-classes 對編譯生成的文件進行后期處理。比如,對Java類的字節碼進行修改。
generate-test-sources 生成編譯所需的任意測試代碼
process-test-sources 處理測試代碼,比如過濾一些數值。
generate-test-resources 生成測試用資源
process-test-resources 處理資源,并拷貝到測試用的目標目錄中。
test-compile 編譯測試代碼,放到測試目標目錄
test 用合適的單元測試框架來運行測試。這些測試不應當要求代碼被打包或部署。
package 把編譯好的代碼打包成可以發布的格式,例如JAR
pre-integration-test 執行集成測試之前必須完成的動作,比如,設置集成測試所需的環境。
integration-test 執行集成測試。如果需要,會事先把包部署到集成測試所需的運行環境中。
post-integration-test 執行集成測試之后必須完成的動作,比如運行環境的清理。
verify 檢查包是否合法,是否滿足特定的質量要求
install 把包安裝在本地倉庫中,以便作為本地其他項目的依賴。
deploy 在集成或發布環境中完成部署,并且把最終的包拷貝到遠程倉庫中,以便被其他開發人員和工程所共享。
因此,當我們構建一個項目時,只需要了解自己希望做什么,然后執行以上對應的生命周期即可。
例如,我們希望編譯我們的工程。在命令行狀態下進入到工程的pom.xml文件所在的目錄中,使用命令:mvn compile;希望構建打包我們的工程,使用mvn package即可。
當然了,maven的構建生命周期也是可以擴展和自定義的,這里就先不做介紹了。
pom.xml介紹¶
pom.xml包含了一個項目的項目對象模型(POM)。項目對象模型(POM)是Maven工作的基本單元。請記住,這個是非常重要的,因為POM包含了工程的非常重要的信息塊,并且基本上包含了和項目相關的任何要素。
讓我們熟悉一下pom.xml包含的基本項:
- poject 這是pom.xml的頂級元素。
- modelVersion 這是元素指出了這個POM使用的是那個版本的對象模型。這個模型的版本自身么是經常改變的,但這種改變是為了使模型更加的穩定。
- groupId 這個元素指出創建這個工程的組織或團隊的唯一標識,并且這個也是一個項目的關鍵標識,推薦使用這個組織或團隊的完整域名。例如:org.apache.maven.plugins是為Maven plug-ins定義的groupId。
- artifactId
這個元素指出這個工程的主要制品的基本名稱。一個工程的主要制品如果是jar文件,次要制品如果是源碼包,則次要制品的名稱的一部分也使用
artifactId。典型的制品名稱使用這樣的格
式:<artifactId>-<version>.<extension>(例如,myapp-
1.0.jar)。
- packaging 這個元素指出制品的類型(例如:JAR,WAR,EAR等等)。這個元素不僅僅指示出制品的類型,同時也指示出工程構建過程中的部分生命周期。Packaging的默認值是JAR。
- version 這個元素指出這個項目產生的制品的版本號,Maven在幫助開發人員管理版本號時走了很長的路,以后你將經常看到SNAPSHOT在一個版本中,這個表示一個工程仍然在開發狀態。
- name 這個元素指出這個工程顯示的名稱。這個常用于Maven產生的文檔中。
- url 這個員算指出在哪里能發現工程的站點。這個常用于Maven產生的文檔中。
- desription 這個元素提供了這個工程基本的描述。這個也常用于Maven產生的文檔中。
以上只是pom.xml中的一些基本項,完整的pom.xml的元素介紹請參考:
http://maven.apache.org/maven-model/maven.html
文檔編制¶
文檔創建:¶
對于如何創建和編制文檔,maven有一個簡單的示例命令:
mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-site
執行了以上命令后,我們將得到這樣一個目錄結構:
my-app
|-- pom.xml
`-- src
|-- site
|-- apt
| |-- format.apt
| `-- index.apt
|-- fml
| `-- faq.fml
|-- fr
| |-- apt
| | |-- format.apt
| | `-- index.apt
| |-- fml
| | `-- faq.fml
| `-- xdoc
| `-- xdoc.xml
|-- site.xml
|-- site_fr.xml
`-- xdoc
`-- xdoc.xml
你現在可以看到一個$basedir/src/site目錄,以及它包含的一些站點描述文件(site.xml,site_fr_xml),和各種maven支持的文檔格式相對應的目錄和示例文檔都已經產生。
以上的創建只是示例,我們自己創建時就沒有命令行使用了,只能按照上面的目錄結構創建我們需要的文檔,并在文檔中寫入我們工程的信息。
讓我們再來看看maven所支持的文檔格式。
文檔格式¶
Maven支持3種文檔格式:
- Xdoc format 這個是一種簡單快捷的,基于original Anakia format的文件格式。
- APT format “Almost Plain Text”,(接近普通文本格式),這是一種允許你采用接近普通文本格式的方式簡單的寫出類似于wiki格式的結構性文檔。
如果你對此很感興趣,請參考完整的APT format的書寫規范
http://maven.apache.org/guides/mini/guide-apt-format.html
- FML formate 這個是一種FAQ結構形式的文檔格式。
了
解了以上的文檔格式,我們就可以按照以上文檔格式的要求,選用我們喜歡的文檔格式編寫我們的文檔。當編寫完成后,我們需要生成所有文檔。這里生成文
檔,maven的處理是生成站點(site),也就是身成html頁面,這樣所有對此項目感興趣的人員都可以通過訪問此站點來了解所有的信息。生成站點的
命令是:
mvn site
文檔國際化¶
當然,你可能早就想到文檔國際化的問題,這里maven也早就處理了。在pom.xml中
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<configuration>
<locales>en,fr</locales>
</configuration>
</plugin>
</plugins>
...
</project>
注意到<locales>en,fr</locales>了嗎?這里就支持了英語(en)和法語
(fr)兩種語言的文檔。請注意以下生成的目錄,由于英語是在第一個,屬于默認語言,所以$basedir/src/site目錄下并沒有en的文件夾,
而有fr的文件夾,而且這個文件夾里包含了maven支持的文檔格式相對應的目錄和示例文檔。
報告設置¶
Maven有多個報告能添加在你的文檔站點中,來顯示項目當前的狀態,這些報告采用插件的形式可在項目中配置。
為了為你的文檔站點增加這些報告,必須增加reporting部分在pom.xml中,下面這個為標準的項目信息報告插件在pom.xml中的配置。
<project>
...
<reporting>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
</plugin>
</plugins>
</reporting>
...
Maven在執行mvn site命令時,除了產生開發人員編制的文檔信息外,根據pom.xml中設置的報告,會同時生成這個項目信息的報告文檔。并且這個是默認的生成項。
這個默認的生成項將根據項目的信息生成以下報告:
- 持續集成信息(Continuous Integration)
- 依賴性信息(Dependencies)
- 發布追蹤信息(Issue Tracking)
- 郵件列表信息(Mailing Lists)
- 工程協議信息(Project License)
- 項目團隊信息(Project Team)
- 源碼庫信息(Source Repository)
根據筆者測試,以上信息均是在pom.xml進行設置的。
<ciManagement>
<system/>
<url/>
<notifiers>
<notifier>
<type/>
<sendOnError/>
<sendOnFailure/>
<sendOnSuccess/>
<sendOnWarning/>
<address/>
<configuration/>
</notifier>
</notifiers>
</ciManagement>
依賴性信息根據以下配置信息有關
<dependencies>
<dependency>
<groupId/>
<artifactId/>
<version/>
<type/>
<classifier/>
<scope/>
<systemPath/>
<exclusions>
<exclusion>
<artifactId/>
<groupId/>
</exclusion>
</exclusions>
<optional/>
</dependency>
</dependencies>
issue追蹤信息
<issueManagement>
<system/>
<url/>
</issueManagement>
郵件列表信息
<mailingLists>
<mailingList>
<name/>
<subscribe/>
<unsubscribe/>
<post/>
<archive/>
<otherArchives/>
</mailingList>
</mailingLists>
筆者在pom.xml中設置以上信息后,運行 mvn site 總會報錯。如果哪位了解到報錯原因請告訴我,謝謝。zhangxl@sintal.cn
工程協議信息
<licenses>
<license>
<name/>
<url/>
<distribution/>
<comments/>
</license>
</licenses>
項目團隊信息
<organization>
<name/>
<url/>
</organization>
<developers>
<developer>
<id/>
<name/>
<email/>
<url/>
<organization/>
<organizationUrl/>
<roles/>
<timezone/>
<properties/>
</developer>
</developers>
<contributors>
<contributor>
<name/>
<email/>
<url/>
<organization/>
<organizationUrl/>
<roles/>
<timezone/>
<properties/>
</contributor>
</contributors>
源碼庫信息
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
默認情況下這些文檔將生成在$basedir/src/site目錄下。
需要得到其他的報告,則需要配置其他的報告插件。
要想了解更多的信息,請參考以下網頁:http://cvs.peopleware.be/training/maven/maven2/morePlugins.html
依賴管理¶
這里我們通過使用外部依賴(external dependencies)來大家對maven的依賴管理有一個簡單而具體的了解。
當我們在做一個工程的時候,不可能一切都是從空白開始,對于我們做Web應用的來說,使用框架已經司空見慣,而這種對框架的引入使用對于Maven來說,就是工程的依賴。而我們的工程要進行測試,則不能少了對Junit框架的依賴。
依
賴管理是maven的一個主要特征,這個是對于用戶來說,是Maven令人振奮的一個最著名的特征。對于一個單一的工程來說,依賴管理沒有什么困難的,但
是當你開始處理多個模塊的工程或由10多個甚至上百個模塊組成的應用程序時, Maven能幫助你輕松穩定的控制這些大量的依賴。
在pom.xml中dependencies部分列出了所有外部依賴,詳細描述了在編譯時,測試時,運行時是否需要這個依賴。現在,假定我們的工程只有對Junit的依賴。它的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.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>Maven Quick Start Archetype</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文件可以看出,定義一個外部依賴(external
dependencies)至少需要4個元素:groupId, artifactId, version, and
scope。對于groupId, artifactId,
version的意思,和前面我們在創建工程時提到的這幾個元素的意義相同,這里就不再重復介紹,scope元素指出你的工程如何使用依賴,并且它的值有
compile,test和runtime等等。想要了解更多的依賴說明的信息,請看:http://maven.apache.org/maven-model/maven.html
要想了解完整的依賴機制,請看:http://maven.apache.org/guides/introduction/introduction-to-dependency-management.html
有了這些依賴信息,Maven將能在工程構建時引用依賴。
引用的過程是:
- 在本地倉庫(默認的本地倉庫地址為:~/.m2/repository)中查找此依賴是否存在。
- 如果在本地倉庫中未發現,則在遠程倉庫中下載此依賴,并下載到本地倉庫中。
- 通過以上兩個步驟就能找到依賴。如果遠程倉庫無法訪問,則可以設置其他遠程倉庫。具體請看:http://maven.apache.org/guides/introduction/introduction-to-repositories.html
一個簡單的例子。比如我們要添加一個log4j到我們的工程中。
首
先.需要了解log4j的groupId, artifactId, and
version信息。可在google上搜索“site:www.ibiblio.org maven2
log4j”。這樣在搜索結果里可以找到/maven2/log4j/log4j (or
/pub/packages/maven2/log4j/log4j)這樣的目錄,在這個目錄中有一個文件叫做maven-metadata.xml。這
個文件內容如下所示:
<metadata>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.1.3</version>
<versioning>
<versions>
<version>1.1.3</version>
<version>1.2.4</version>
<version>1.2.5</version>
<version>1.2.6</version>
<version>1.2.7</version>
<version>1.2.8</version>
<version>1.2.11</version>
<version>1.2.9</version>
<version>1.2.12</version>
</versions>
</versioning>
</metadata>
這樣我們能找到groupId為log4j,artifactId為log4j,version當然要用最新的,選擇1.2.12。scope我們設置為compile。
這樣我們使用mvn compile 編譯工程時,會看到mvn下載了log4j到我們的本地倉庫。
配置管理¶
Maven的配置管理是作為一個單獨的Maven子項目在做。叫做SCM。他是這樣介紹的:
MavenSCM
支持Maven 2.x插件(例如,maven-release-plugin)和其他工具(例如,Continuum,這個是一個和maven
2.x結合很好的一個持續集成工具。),Maven
SCM提供給他們一個公共的API去做配置管理的各種操作。當然了要執行配置管理操作,當然少不了配置工具了。Maven
SCM給出了一個列表,說明Maven SCM現在所支持的配置管理工具。
完全支持的配置管理工具:
- CVS
- Subversion
- Perforce
- StarTeam
當你選中了上面的一個配置管理工具,你就可以利用Maven 2.x的插件或者集成管理工具進行配置管理了。
持續集成工具continuum¶
continuum是Maven的一個子項目。他是一個構建基于java的工程的持續集成服務器。他支持以下多種工程類型:
- Maven 1
- Maven 2
- Ant
- Shell scripts
continuum有以下特征
- 緊密整合Maven 2.x
- 緊密整合Maven SCM
- 更易用的基于網絡的設置和界面
- 基于Quartz(Quartz-based)的時間計劃表設置
- 添加新項目十分方便
- 郵件通知
- 其他IM通知:IRC, Jabber, MSN
- 責備機制(Blame Mechanism)
在以下連接處下載此軟件:http://maven.apache.org/continuum/download.html
解壓縮continuum-1.0.2-bin.zip到你希望安裝Continuum 1.0.2的所在目錄。
運行:
- bin/linux/run.sh 如果是UNIX平臺
- bin/solaris/run.sh 如果是Solaris平臺
- bin/win32/run.bat 如果是Windows平臺
- bin/macosx/run.sh 如果是MacOS X平臺.
- bin/plexus.sh 如果是其他平臺
當服務器啟動成功后,打開瀏覽器訪問:http://localhost:8080/continuum/
注意:由于continuum判斷一個工程是否構建成功,是使用一個命令行返回值。而windows平臺的用戶,這個返回值有問題。因此需要修改以下maven 2的bin/mvn.bat文件。這里可以直接從以下地址下載修改后的文件替換掉即可:http://maven.apache.org/continuum/scripts/mvn.bat
添加一個項目到continuum¶
要添加一個maven 2的項目到continuum,需要寫入一個pom url或者導入一個pom.xml,當然導入的這個pom.xml文件中包含了continuum需要的各種信息。
我們來看看導入的pom.xml文件中具體需要包含哪些項:
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
開發者信息(The developers)¶
<ciManagement>
<system>continuum</system>
<notifiers>
<notifier>
...
</notifier>
</notifiers>
</ciManagement>
集成后所有的通知人信息(The notifiers)¶
<notifier>
<type>mail</type>
<configuration>
<address>dev@maven.apache.org</address>
</configuration>
<notifier>
<notifier>
<type>irc</type>
<configuration>
<host>irc.codehaus.org</host>
<port>6667</port>
<channel>#maven</channel>
</configuration>
</notifier>
構建工程¶
- 按照定制的時間構建
- 點擊本項目上的build按鈕進行構建。
發布管理¶
要發布(Releases)一個項目,需要在pom.xml和setting.xml中分別配置。在pom.xml中
<distributionManagement>
<repository>
<id>mycompany-repository</id>
<name>MyCompany Repository</name>
<url>scp://repository.mycompany.com/repository/maven2</url>
</repository>
</distributionManagement>
在setting.xml中
<settings>
...
<servers>
<server>
<id>mycompany-repository</id>
<username>jvanzyl</username>
<!-- Default value is ~/.ssh/id_dsa -->
<privateKey>/path/to/identity</privateKey> (default is ~/.ssh/id_dsa)
<passphrase>my_key_passphrase</passphrase>
</server>
</servers>
...
</settings>
通過以上的設置,項目將可以發布到遠程倉庫,遠程服務器。
項目發布現在支持scp,ftp和scpexe等方式。
Setting.xml文件是一個maven的配置文件。它有下面的功能:
- 配置本地倉庫
- 配置訪問網絡的代理服務器
- 安全和部署的設置。
- 為倉庫設置景象
想要了解更多這個文件的信息可以參考一下以下文章:http://maven.apache.org/guides/mini/guide-configuring-maven.html
運行發布的命令¶
mvn deploy
Maven和eclipse工具的合作¶
當有了以上的工程目錄,無論是webapp工程,還是app,我們都希望在集成開發環境中開發。Maven如何和IDE集成。現在我們就來進行講解。
首先要讓eclipse知道Maven 2的repository(倉庫)的路徑。因此要設置一個M2_REPO的變量為classpath。可以使用命令行的方式來設置:
mvn -Declipse.workspace=<path-to-eclipse-workspace> eclipse:add-maven-repo
還可以在eclipse中定義一個新的classpath變量通過在eclipse的菜單上選擇Window> Preferences. 選擇Java > Build Path > Classpath Variables page.
接下來,生成eclipse的工程文件。使用命令行
mvn eclipse:eclipse
這樣通過在eclipse的菜單上選擇File >Import >Existing Projects into Workspace,就可以將工程導入eclipse中。
通過以上2個步驟,我們就可以利用eclipse來進行開發工作了。
Eclipse插件mavenide¶
同時在eclipse中我們可以下載一個maven的插件,用來輔助eclipse進行maven工程的開發工作。這個插件名稱叫做mavenide。
這個插件可使用以下更新站點:http://m2eclipse.codehaus.org/
并且非常方便的是,這里還提供了一個flash的演示來介紹如何安裝此插件,這個flash演示的觀看地址在:
http://m2eclipse.codehaus.org/Installing_Maven_2.0_plugin_for_Eclipse.html
要正常使用此插件請注意以下問題:
- Mavenide的插件為0.0.5不要安裝錯誤了。
通過筆者在安裝好此插件的一些使用后,看到了此插件的以下一些特性。
- 可以方便的添加依賴。
- 在編輯完pom.xml文檔后,會自動檢查此文檔的格式是否正確。
- 可以將mvn的一些命令通過擴展工具的方式在eclipse中輕松執行。
心得體會¶
揚長避短使用Maven 2¶
轉載自 http://www.javaeye.com/topic/162217
架設私服¶
比如Spring 2.5.1,可能剛release,repo1.maven.org/maven2/不一定有。你可以install到你的私服去。
結合Ant¶
很多maven不靈活的地方,可以用ant來解決
開發OSGI的Bundle,就必須定義meta-inf信息。也可以定義自己的格式。
不要使用maven2相關的ide插件¶
多使用命令行。比如,先 mvn eclipse,然后導入到eclipse工程。有更新,執行 mvn eclipse,再刷新工程就可以。
我非常反對過多的依賴IDE。單元測試比較難做,無法做到持續集成!
題外話:我個人強烈傾向于調式用mvn jetty:run,數據庫用hsqldb,便于使用dbunit。畢竟,現在可以用spring,jpa/hibernate做到數據庫無關性和應用服務器無關性。
依賴關系要設計好¶
即jar和jar之間的關系,package和package之間的關系。開發前,設計的時候就要規劃好,不能什么都靠工具。工具不是萬能的。
尤其是開發OSGI bundle的時候,依賴關系一定要先設計好,一定要保證單向依賴性!
實際上,我使用maven,中間也遇到了一些問題,總的說來,幫助還是非常大。尤其是,新來的開發人員搭建開發、測試環境、持續集成的時候,效果非常明顯!
我也承認maven2是好的思路,但是實現得不好。最重要的是,在新的工具出現前,我們只能選擇它。不過,可以結合IVY,ant,盡可能的揚長避短。
Maven中的中文編碼問題¶
在Windows下,默認編碼是GBK,所以需要在pom中增加屬性:
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
第一個在filter拷貝文件時用,第二個在編譯時用。第二個屬性是在 http://maven.apache.org/plugins/maven-compiler-plugin/ 翻到的
Maven2主要配置文件¶
pom.xml和settings.xml。
POM是Maven的核心對象模型,對于項目,一般只需要pom.xml就行了。
settings.xml配置在Maven2中存在兩種級別:
用戶級,針對操作系統登錄用戶而言。一般在$home/.m2/,對于windows用戶,就是目錄:C:\Documents and Settings\用戶名\.m2\settings.xml。
全局級:一般在%M2_HOME%/conf/settings.xml,M2_HOME是Maven2的根目錄環境變量名。
maven2具體應用¶
1.下載maven2
http://maven.apache.org/download.html
2.設置二環境變量:解壓,如解壓在D:\mvntest,然后設置系統環境變量M2_HOME=D:\apache-maven-2.0.8 ,path變量里添加D:\apache-maven-2.0.8\bin,方便Maven在任何目錄下運行。
3.mvn -h可以查看幫助
如執行mvn --version可以查看版本信息
mvn --version
可以顯示類似這樣的信息:
Maven version: 2.0.8
Java version: 1.6.0
OS name: "windows xp" version: "5.1" arch: "x86" Family: "windows"
4.創建一個新項目:
Maven2的運行命令是mvn,常用命令為:
創建Maven項目:mvn archetype:create
編譯源代碼:mvn compile
編譯測試代碼:mvn test-compile
運行測試:mvn test
產生site:mvn site
打包:mvn package
在本地Repository中安裝jar:mvn install
清除產生的項目:mvn clean
清除產生的項目:mvn clean
例如:創建一個新項目:
mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app
Maven指南¶
http://www.sonatype.com/books/maven-book/reference_zh/public-book.html
另一個Maven2簡明教程¶
安裝和配置
把maven-2.0.4-bin.zip解壓到D:maven-2.0.4。
下面就是配置環境變量了,這和1.0的版本是一樣的。(1)MAVEN_HOME:D:maven-2.0.4 (2)在Path 中加入%MAVEN_HOME%bin¶
這樣配置就OK了。然后,我建立了如下目錄:E:appmavenApp,當然這些可以隨便建立,呵呵。
下面說一些Maven1.x和Maven2.x的不同(一些摘自一些網友文章)
------------------------------------
Maven2 把配置文件壓縮成了pom.xml和settings.xml
兩個文件,簡潔了不少。POM是Maven的核心對象模型,在Maven2中POM已由project.xml轉移到pom.xml中使用,版本也由3升
級為4。對于項目,一般只需要pom.xml就行了。在Maven2中不需要也不提倡使用maven.xml
生命周期的引入
在Maven2中有了明確的生命周期概念,而且都提供與之對應的命令,使得項目構建更加清晰明了。主要的生命周期階段:¶
validate,驗證工程是否正確,所有需要的資源是否可用。
compile,編譯項目的源代碼。
test-compile,編譯項目測試代碼。
test,使用已編譯的測試代碼,測試已編譯的源代碼。
package,已發布的格式,如jar,將已編譯的源代碼打包。
integration-test,在集成測試可以運行的環境中處理和發布包。
verify,運行任何檢查,驗證包是否有效且達到質量標準。
install,把包安裝在本地的repository中,可以被其他工程作為依賴來使用
deploy,在整合或者發布環境下執行,將最終版本的包拷貝到遠程的repository,使得其他的開發者或者工程可以共享。
generate-sources,產生應用需要的任何額外的源代碼,如xdoclet。
新增Dependency Scope
在POM 4中,<dependency>中還引入了<scope>,它主要管理依賴的部署。目前<scope>可以使用5個值:¶
compile,缺省值,適用于所有階段,會隨著項目一起發布。
provided,類似compile,期望JDK、容器或使用者會提供這個依賴。如servlet.jar。
runtime,只在運行時使用,如JDBC驅動,適用運行和測試階段。
test,只在測試時使用,用于編譯和運行測試代碼。不會隨項目發布。
system,類似provided,需要顯式提供包含依賴的jar,Maven不會在Repository中查找它。
下面說些基本設置,打開D:/maven-2.0.4/conf/settings.xml
1.
改變<localRepository>E:/app/m2/repository</localRepository>
目的:改變本地的數據倉庫目錄(存放從遠程下載的jar包),如果不改變也可以,如不改變,缺省目錄為:C:Documents and
Settings主機名.m2repository
2. 配置代理,主要目的是為了能從遠程下載jar包,根據實際的網路情況進行配置吧。因為我現在單位是有代理服務器的,如果不配置,就不能從遠程下載jar包了。我的配置如下(注意:如果你的網絡沒有代理服務器,就不用配置這個步驟)
<proxy>
<id>optional</id>
<active>true</active>
<protocol>http</protocol>
<host>192.168.17.100</host>
<port>8889</port>
<nonProxyHosts>192.168.*.*</nonProxyHosts>
</proxy>
常用goal¶
下面就是一些goal命令了,這里和Maven1有不少不同,常用的命令有:
- 創建Maven的普通java項目:mvn archetype:create -DgroupId=com.codeline.commons -DartifactId=pjoName
- 創
建Maven的Web項目:mvn archetype:create -DgroupId=com.mycompany.app
-DartifactId=my-webapp -DarchetypeArtifactId=maven-archetype-webapp
- 編譯源代碼:mvn compile (或者:mvn compiler:compile)
- 編譯測試代碼:mvn test-compile
- 運行測試:mvn test
- 產生site:mvn site
- 打包:mvn package
- 在本地Repository中安裝jar:mvn install
- 清除產生的項目:mvn clean
- 生成eclipse項目:mvn eclipse:eclipse
- 生成idea項目:mvn idea:idea
- 組合使用goal命令,如只打包不測試:mvn -Dtest package
- 編譯測試的內容:mvn test-compile
- 只打jar包: mvn jar:jar
- 只測試而不編譯,也不測試編譯:mvn test -skipping compile -skipping test-compile (這里要特別注意 -skipping 的靈活運用,當然也可以用于其他組合命令)
- 清除eclipse的一些系統設置:mvn eclipse:clean
配置存儲庫¶
要
求項目的每個開發者必須在conf目錄中配置存儲庫是不方便的,所以Maven可以同時查看多個存儲庫并且將它們全部配置在pom.xml文件中。讓我們
看看一個例子,它展示了如何在應用程序用使用多個存儲庫。在以下從pom.xml文件摘錄的片斷中,我們設置了兩個存儲庫來讓Maven尋找依賴項。
Ibiblio一直是默認的存儲庫,我們又添加了Planet Mirror作為后援存儲庫。我們也可以讓團隊使用的本地web服務器作為第二個存儲庫。
<repositories>
<repository>
<id>Ibiblio</id>
<name>Ibiblio</name>
<url>http://www.ibiblio.org/maven/</url>
</repository>
<repository>
<id>PlanetMirror</id>
<name>Planet Mirror</name>
<url>http://public.planetmirror.com/pub/maven/</url>
</repository>
</repositories>
一些小問題¶
M2_REPO的問題¶
當
建立一個工程后,執行 mvn eclipse:eclipse
,建立一個maven的工程,用eclipse打開后,發現報如下錯誤:Unbound classpath variable:
'M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar' in project my-webapp
,這是因為在Eclipse 沒有配置 M2_REPO 變量,配置步驟:window >> preferences >>
Java >> Build Path >> Classpath Variables
新建一個 M2_REPO 的變量,變量值指向你系統的Maven2的數據倉庫位置。
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>org.apache.hivemind</groupId>
<artifactId>hivemind-examples</artifactId>
<packaging>jar</packaging>
<version>2.0-alpha-1</version>
<parent>
<groupId>org.apache.hivemind</groupId>
<artifactId>hivemind-project</artifactId>
<version>2.0-alpha-1</version>
<relativePath>../pom.xml</relativePath>
</parent>
<name>HiveMind Examples</name>
<inceptionYear>2003</inceptionYear>
<dependencies>
<dependency>
<groupId>org.apache.hivemind</groupId>
<artifactId>hivemind-framework</artifactId>
<version>2.0-alpha-1</version>
</dependency>
如何安裝Jar(或war)依賴到本地的數據倉庫中?¶
下面具一個如何把dwr.jar包上傳到本地數據倉庫的例子,一看例子,大家就明了了。
1. 下載dwr.jar包到本地,我把它放到了 C:/ (C盤根目錄)
2. 進入“命令行提示符”,進入到C:/,然后執行
mvn install:install-file -Dfile=dwr.jar -DgroupId=dwr.mocha -DartifactId=dwrDart -Dversion=1.0 -Dpackaging=jar
這樣就把dwr傳到了本地倉庫中(我的本地倉庫地址為:E:appm2repository),上傳到倉庫中的jar包名為dwrDart- 1.0.jar,目錄結構為dwr/mocha/dwrDart/1.0/dwrDart-1.0.jar
maven2命令大全¶
validate,驗證工程是否正確,所有需要的資源是否可用。
compile,編譯項目的源代碼。
test-compile,編譯項目測試代碼。
test,使用已編譯的測試代碼,測試已編譯的源代碼。
package,已發布的格式,如jar,將已編譯的源代碼打包。
integration-test,在集成測試可以運行的環境中處理和發布包。
verify,運行任何檢查,驗證包是否有效且達到質量標準。
install,把包安裝在本地的repository中,可以被其他工程作為依賴來使用
deploy,在整合或者發布環境下執行,將最終版本的包拷貝到遠程的repository,使得其他的開發者或者工程可以共享。
generate-sources,產生應用需要的任何額外的源代碼,如xdoclet。
結合Maven2進行J2EE項目構建¶
http://www.javaeye.com/topic/230265
Maven2 的新特性¶
http://www.ibm.com/developerworks/cn/opensource/os-maven2/index.html
maven 配置篇 之 settings.xml¶
http://zyl.javaeye.com/blog/41612
maven 配置篇 之pom.xml¶
配置1: http://zyl.javaeye.com/blog/41754
配置2: http://zyl.javaeye.com/blog/41761