1.Maven的安裝
1.1Windows 2000/xp下的安裝
1. 解壓縮maven-2.0.2-bin.zip到你希望安裝Maven 2.0.2的所在目錄。這裏假設你選擇了C:\ProgramFiles\Apache Software Foundation\maven-2.0.2.
2. 將C:\Program Files\Apache Software Foundation\maven-2.0.2\bin目錄加入到你的%path%環境變量中。
3. 同時,確認JAVA_HOME是否正確設置成功。
4. 運行 mvn --version 確認是否安裝成功。
顯示Maven version: 2.0.2 則表示安裝成功。
1.2基於Unxi-based的操作系統(Linux,Solaris and Mac OS X)
1. 解壓縮發佈包到你希望安裝Maven 2.0.2的所在目錄。這裏假設你選擇了/usr/local/maven-
2. 將/usr/local/maven-2.0.2/bin目錄加入到你的path環境變量中,例如:PATH=/usr/local/maven-2.0.2y/bin: $PATH。
3. 同時,確認JAVA_HOME是否正確設置成功。
4. 運行 mvn --version 確認是否安裝成功。
顯示Maven version: 2.0.2 則表示安裝成功。
2.Maven2.0的一些優點:
--標準的項目佈局和項目結構生成器
--多項目支持(只對開發環境相同的項目)
--在開發者需要的時候及時地下載新的插件和功能部件(主要的好處)
--多項目支持(只對開發環境相同的項目)
--在開發者需要的時候及時地下載新的插件和功能部件(主要的好處)
--標準的依賴管理機制
--生成最新項目信息的網站
--集成了源代碼控制軟件:CVS和Subversion
--生成最新項目信息的網站
--集成了源代碼控制軟件:CVS和Subversion
2.1項目標準化(提供預定義的目錄模板)
Maven一個重要特性是定義了項目的標準模板,官方說法是最佳實踐。好的目錄結構可以使開發人員更容易理解項目,爲以後的維護工作也打下良好的基礎。Maven2根據業界公認的最佳目錄結構,爲開發者提供了缺省的標準目錄模板。Maven2的標準目錄結構如下:
使用目錄模板,可以使pom.xml更簡潔。因爲Maven2已經根據缺省目錄,預定義了相關的動作,而無需人工的干預。以resources目錄爲例:
- src/main/resources,負責管理項目主體的資源。在使用Maven2執行compile之後,這個目錄中的所有文件及子目錄,會複製到target/classes目錄中,爲以後的打包提供了方便。
- src/test/resources,負責管理項目測試的資源。在使用Maven2執行test-compile之後,這個目錄中的所有文件及子目錄,會複製到target/test-classes目錄中,爲後續的測試做好了準備。
可以通過命令:mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app創建一個單一的maven項目。創建好的項目,具有了特定的項目結構。這個項目結構是參考業界的最佳實踐而成,爲後面使用統一的maven命令打下了基礎,如測試mvn test、打包mvn package(在打包時需要指定web.xml,規範的結構可以不用指定)等,無需寫一行腳本,就可以方便的實現衆多功能。Maven還提供其它一些類型模板,可以通過添加-DarchetypeArtifactId={type}創建,如-DarchetypeArtifactId=maven-archetype-site,生成site類型的項目。
有了這個標準,項目間能方便的進行交流,你也很容易瞭解其它使用maven項目的結構。對於企業來說,引入maven就自然引入了規範,這可比費時費力的寫文檔,定規範有效的多了。
2.2文檔和報告
使用mvn site可以快速生成項目站點,apache很多開源項目站點都採用maven生成,會出現built by maven字樣的圖標。
而maven提供的針對如junit,checkstyle,pmd等的插件,能夠方便的進行測試和檢查並能直接生成報告。使用都很簡單,如mvn surefire-report:report 就能自動進行junit測試,並生成junit報告,mvn pmd:pmd生成pmd報告。具體使用可以在http://maven.apache.org/plugins/index.html找到。
2.3類庫管理
Maven一個很重要的特色就是類庫管理。通過在pom.xml中定義jar包版本和依賴,能夠方便的管理jar文件。以下是一個簡單的jar定義片斷:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.1</version>
<type>jar</type>
<scope>runtime</scope>
</dependency>
這個片斷告訴我們,依賴的jar包groupId爲org.hibernate,artifactId爲hibernate,版本爲3.1,scope爲runtime。在實際項目中,會將M2_REPO(maven本地倉庫地址)/ org/hibernate / hibernate /3.1/ hibernate -3.1.jar放入classpath。
同時maven會通過pom.xml管理jar包間的依賴。比如上面的hibernate-3.1.jar同級目錄肯定會有一個hibernate -3.1.pom,在這個pom文件中指定了這個jar對其它一些jar的依賴。而這個pom文件是遠程倉庫提供,無需進行修改,執行maven相關命令就會自動根據相關依賴去下載jar包。這樣只需定義對hibernate的依賴而無需關心相關jar,在構建項目上方便了很多。
因爲pom文件對jar的管理,也產生了一個很吸引人的特性:項目文件很小。以往一個web項目中,jar文件都要放入WEB-INF/lib下,並放入cvs(svn)中,很容易就達到幾十M。而通過maven,只需一個pom.xml,在執行mvn eclipse:eclipse時再去遠程倉庫下載,項目文件一般只需幾百K。
<dependency>中還引入了<scope>,它主要管理依賴的部署。目前<scope>可以使用5個值:
compile,缺省值,適用於所有階段,會隨着項目一起發佈。
provided,類似compile,期望JDK、容器或使用者會提供這個依賴。如servlet.jar。
runtime,只在運行時使用,如JDBC驅動,適用運行和測試階段。
test,只在測試時使用,用於編譯和運行測試代碼。不會隨項目發佈。
system,類似provided,需要顯式提供包含依賴的jar,Maven不會在Repository中查找它。
2.4發佈管理
使用maven可以方便的進行項目發表管理。在項目開發到一定階段,可以使用mvn package打包,它會自動先運行mvn test,跑所有的testcase,只有全部通過才能正確打包。生成的war包(如果項目的packaging爲war)在target目錄下。這個war包與使用ant腳本生成一樣,但無需一行腳本,這也是maven對比ant的優勢之一。使用mvn install將編譯和打包好的文件發佈到distributionManager指定的遠程repository。使用mvn deploy可以自動管理項目版本。
3.常用的命令
您可以在Maven安裝目錄下的conf目錄中,或者項目自身中修改Maven遠程存儲庫的選擇。POM是“項目對象模型”的縮寫。
創建完項目後,我們可以往項目裏添加代碼並使用Maven的所有全新技巧。注意以下命令必須在pom.xml文件所在的目錄中運行。
--mvn test:運行應用程序中的單元測試
--mvn package:依據項目生成jar文件
--mvn install,把包安裝在本地的repository中,可以被其他工程作爲依賴來使用
--mvn site:生成項目相關信息的網站
--mvn clean:清除目標目錄中的生成結果
--mvn eclipse:eclipse:生成Eclipse項目文件
--mvn test:運行應用程序中的單元測試
--mvn package:依據項目生成jar文件
--mvn install,把包安裝在本地的repository中,可以被其他工程作爲依賴來使用
--mvn site:生成項目相關信息的網站
--mvn clean:清除目標目錄中的生成結果
--mvn eclipse:eclipse:生成Eclipse項目文件
--mvn deploy,在整合或者發佈環境下執行,將最終版本的包拷貝到遠程的repository,使得其他的開發者或者工程可以共享。
可以通過對目標及相位的組合使得一個命令完成多個功能,比如:
mvn clean dependency:copy-dependencies package
關於常用命令的詳解,見參考資料。
4.第一個例子
參見《Maven入門--概念與實例》
D:\maven\demo>mvn archetype:create -DgroupId=ce.demo.mvn -DartifactId=app
該工程的groupId是ce.demo.mvn,那麼該工程的源文件將放在Java包ce.demo.mvn中。artifactId是app,那麼該工程根目錄的名稱將爲app。
該工程的groupId是ce.demo.mvn,那麼該工程的源文件將放在Java包ce.demo.mvn中。artifactId是app,那麼該工程根目錄的名稱將爲app。
D:\maven\demo>mvn archetype:create -DgroupId=ce.demo.mvn -DartifactId=webapp -DarchetypeArtifactId=maven-archetype-webapp
此命令與創建app的命令的不同之處是,多設置了一個屬性archetypeArtifacttId,該屬性的值爲maven-archetype-webapp。即告訴Maven,將要創建的工程是一個Web應用工程。創建app工程時沒有使用該屬性值,是由於archetype默認創建的是應用程序工程。詳細的解釋及命令參數見http://maven.apache.org/plugins/
不用擔心如何從WEB-INF/lib目錄中得到依賴項,在依賴屬性值被設置成compile的情況下,Maven會自動包含依賴項。也可以將以下代碼添加到pom.xml文件中來改變war文件的名稱:
將本地的存儲庫放在一臺web服務器上也同樣是個便利之舉,這樣整個開發團隊就能從此獲益,每個人都沒有必要去管理自己的存儲庫了。改變Maven的存儲庫路徑只需簡單地編輯其安裝目錄下conf文件夾下面的settings.xml文件即可。(詳情見私服的架設)
5.文檔編制
對於如何創建和編制文檔,maven有一個簡單的示例命令:
mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-site
|
執行了以上命令後,我們將得到一個目錄結構:
你現在可以看到一個$basedir/src/site目錄,以及它包含的一些站點描述文件(site.xml,site_fr_xml),和各種maven支持的文檔格式相對應的目錄和示例文檔都已經產生。
以上的創建只是示例,我們自己創建時就沒有命令行使用了,只能按照上面的目錄結構創建我們需要的文檔mvn site。並在文檔中寫入我們工程的信息。 ,創建完成後,運行
關於文檔編制的詳細說明,見參考資料。
6.依賴管理
一個簡單的例子。比如我們要添加一個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。根據這個文件可以知道groupId爲log4j,artifactId爲log4j,version當然要用最新的。scope我們設置爲compile。這樣我們使用mvn compile 編譯工程時,會看到mvn下載了log4j到我們的本地倉庫。
7.配置存儲庫
要求項目的每個開發者必須在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> //此處按實際地址寫,也有可能是//http://mirrors.ibiblio.org/pub/mirrors/maven2/org,看出錯報告調整。對於找不到的jar包要寫出他的真實路徑。
</repository>
<repository>
<id>PlanetMirror</id>
<name>Planet Mirror</name>
<url>http://public.planetmirror.com/pub/maven/</url>
</repository>
</repositories>
當下載某些jar包時,會自動把相關依賴的包都下載下來。
如下面所示,會自動下載對應文件夾中pom.xml文件上所要求的包。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jpa</artifactId>
<version>2.0</version>
<scope>test</scope> //scope爲compile時,在執行mvn package時,會將該包拷貝到target\{projectName}\WEB-INF\lib\目錄下
</dependency>
若在下載過程中出現java.net.SocketException: Connection reset錯誤,估計是該連接存在,但是下載不了。換別的網址或換個版本下載吧。若出現Failed to resolve artifact則估計是根本就不存在該連接。查看一下實際下載的地址是否存在。
Maven是基於中央倉庫的編譯,即把編譯所需要的資源放在一箇中央倉庫裏,如jar,tld,pom,等。當編譯的時候,maven會自動在倉庫中找到相應的包,如果本地倉庫沒有,則從設定好的遠程倉庫中下載到本地。這一切都是自動的,而ant需要自己定義了。這個好處導致的結果就是,用maven編譯的項目在發佈的時候只需要發佈源碼,小得很,而ant的發佈則要把所有的包一起發佈,顯然maven又勝了一籌。
編譯時,出錯的測試代碼,只能顯示到如下程度:
Running jp.co.benic.usp.webapp.action.USPJ320ActionTest
Tests run: 2, Failures: 0, Errors: 2, Skipped: 0, Time elapsed: 0.266 sec <<< FAILURE!
Running jp.co.benic.usp.webapp.action.USPJ510ActionTest
Tests run: 4, Failures: 0, Errors: 4, Skipped: 0, Time elapsed: 0.515 sec <<< FAILURE!
若想看完整的錯誤信息,需要到target\surefire-reports目錄下,看相關的錯誤日誌文件。
對於在下載jar時,不想下載他所自帶的依賴的某些包,可以用<dependency>
<exclusions>
<exclusion>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
</exclusion>
</exclusions>
<exclusion>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
</exclusion>
</exclusions>
</dependency>將指定的包過濾掉。
缺點:編譯的過程沒有日誌輸出。(手動設置?)
8.私服的架設
自己建個私服是不錯的主意。其實也簡單,隨便拿臺http服務器,把${user.home}/.m2/ 目錄傳上去就行了
在pom文件中,把私服的http url寫在官網的前面。
在pom文件中,把私服的http url寫在官網的前面。
<repositories>
<repository>
<id>springside</id>
<url>http://www.springside.org.cn/maven2</url>
</repository>
<repository>
<id>maven</id>
<name>slowly office site</name>
<url>http://repo1.maven.org/maven2</url>
</repository>
</repositories>
<repository>
<id>springside</id>
<url>http://www.springside.org.cn/maven2</url>
</repository>
<repository>
<id>maven</id>
<name>slowly office site</name>
<url>http://repo1.maven.org/maven2</url>
</repository>
</repositories>
9.如何部署jar到自己的遠程repository
(但因爲目前只支持scp這種遠程拷貝方法,而不知道如何在windows中使用scp,顧此處沒有實現)
在pom.xml中添加如下內容:
<distributionManagement>
<repository>
<id>mycompany-repository</id>
<name>MyCompany Repository</name>
<url>scp://repository.mycompany.com/repository/maven2</url>
</repository>
</distributionManagement>
同樣在用戶的settings.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>
10.如何使用Maven2打包你的Web應用程序?
解決方法:
pom.xml的設置:
打包類型設置爲“war”:
<packaging>war</packaging>
如果項目的layout不是Maven2默認的,可通過修改plugin的配置進行設置,例如WebRoot路徑的設置如下:
<build>
<!-- war包名稱 -->
<finalName>mywebapp</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<!-- 設置WebContent目錄爲Web目錄 -->
<warSourceDirectory>WebContent</warSourceDirectory>
</configuration>
</plugin>
</plugins>
</build>
打包命令行:mvn clean:clean package
使用maven2打包時,可以過濾掉不想被打包的文件或文件夾。只要在pom.xml文件中做如下設置即可
<build>
<filters>
<filter>src/main/filters/filter.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
11.Maven和eclipse工具的合作
當有了以上的工程目錄,無論是webapp工程,還是app,我們都希望在集成開發環境中開發。Maven如何和IDE集成。現在我們就來進行講解。
11.1首先要讓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.
11.2生成eclipse的工程文件。
使用命令行
mvn eclipse:eclipse
|
這樣通過在eclipse的菜單上選擇File >Import >Existing Projects into Workspace,就可以將工程導入eclipse中。
通過以上2個步驟,我們就可以利用eclipse來進行開發工作了。
11.3Eclipse插件mavenide
同時在eclipse中我們可以下載一個maven的插件,用來輔助eclipse進行maven工程的開發工作。這個插件名稱叫做mavenide。
這個插件可使用以下更新站點:http://m2eclipse.codehaus.org/
並且非常方便的是,這裏還提供了一個flash的演示來介紹如何安裝此插件,這個flash演示的觀看地址在:
要正常使用此插件請注意以下問題:
eclipse使用3.1或以上版本。
Mavenide的插件爲0.0.5不要安裝錯誤了。
通過筆者在安裝好此插件的一些使用後,看到了此插件的以下一些特性。
1.可以方便的添加依賴。
2.在編輯完pom.xml<sp>