使用指導
如何添加外部依賴jar包
在Maven工程中添加依賴jar包,很簡單,只要在POM文件中引入對應的<dependency>
標簽即可。
參考下例:
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zp.maven</groupId>
<artifactId>MavenDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>MavenDemo</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit.version>3.8.1</junit.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
<dependency>
標簽最常用的四個屬性標簽:
<groupId>
:項目組織唯一的標識符,實際對應JAVA的包的結構。
<artifactId>
:項目唯一的標識符,實際對應項目的名稱,就是項目根目錄的名稱。
<version>
:jar包的版本號。可以直接填版本數(shù)字,也可以在properties標簽中設置屬性值。
<scope>
:jar包的作用范圍??梢蕴顚慶ompile、runtime、test、system和provided。用來在編譯、測試等場景下選擇對應的classpath。
如何尋找jar包
可以在 http://mvnrepository.com/ 站點搜尋你想要的jar包版本
例如,想要使用log4j,可以找到需要的版本號,然后拷貝對應的maven標簽信息,將其添加到pom .xml文件中。
如何使用Maven插件(Plugin)
要添加Maven插件,可以在pom.xml文件中添加 <plugin>
標簽。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
<configuration>
標簽用來配置插件的一些使用參數(shù)。
如何一次編譯多個工程
在Maven中,允許一個Maven Project中有多個Maven Module
1.創(chuàng)建maven父工程步驟:new-->other-->選擇maven project-->next-->勾選create a simple project-->next-->填寫Group Id、Artifact Id、Version --> packaging選擇pom-->finish。
2.創(chuàng)建maven子工程步驟:選中剛才創(chuàng)建的父工程右鍵-->new-->other-->選擇maven module-->next-->勾選create a simple project-->填寫module name(其實就是artifact id)-->next-->GAV繼承父工程-->packaging選擇你需要的-->finish。
3.完成,刷新父工程;如有多個子工程,繼續(xù)按照第二步驟創(chuàng)建。
這時打開XXX中的pom.xml可以看到其中有以下標簽
<modules>
<module>xxx1</module>
</modules>
選擇編譯XXX時,會依次對它的所有Module執(zhí)行相同操作。
常用Maven插件
maven-antrun-plugin
http://maven.apache.org/plugins/maven-antrun-plugin/
maven-antrun-plugin能讓用戶在Maven項目中運行Ant任務。用戶可以直接在該插件的配置以Ant的方式編寫Target, 然后交給該插件的run目標去執(zhí)行。在一些由Ant往Maven遷移的項目中,該插件尤其有用。此外當你發(fā)現(xiàn)需要編寫一些自定義程度很高的任務,同時又覺 得Maven不夠靈活時,也可以以Ant的方式實現(xiàn)之。maven-antrun-plugin的run目標通常與生命周期綁定運行。
maven-archetype-plugin
http://maven.apache.org/archetype/maven-archetype-plugin/
Archtype指項目的骨架,Maven初學者最開始執(zhí)行的Maven命令可能就是mvn archetype:generate,這實際上就是讓maven-archetype-plugin生成一個很簡單的項目骨架,幫助開發(fā)者快速上手。可能也有人看到一些文檔寫了mvn archetype:create, 但實際上create目標已經(jīng)被棄用了,取而代之的是generate目標,該目標使用交互式的方式提示用戶輸入必要的信息以創(chuàng)建項目,體驗更好。 maven-archetype-plugin還有一些其他目標幫助用戶自己定義項目原型,例如你由一個產品需要交付給很多客戶進行二次開發(fā),你就可以為 他們提供一個Archtype,幫助他們快速上手。
maven-assembly-plugin
http://maven.apache.org/plugins/maven-assembly-plugin/
maven-assembly-plugin的用途是制作項目分發(fā)包,該分發(fā)包可能包含了項目的可執(zhí)行文件、源代碼、readme、平臺腳本等等。 maven-assembly-plugin支持各種主流的格式如zip、tar.gz、jar和war等,具體打包哪些文件是高度可控的,例如用戶可以 按文件級別的粒度、文件集級別的粒度、模塊級別的粒度、以及依賴級別的粒度控制打包,此外,包含和排除配置也是支持的。maven-assembly- plugin要求用戶使用一個名為assembly.xml
的元數(shù)據(jù)文件來表述打包,它的single目標可以直接在命令行調用,也可以被綁定至生命周期。
maven-dependency-plugin
http://maven.apache.org/plugins/maven-dependency-plugin/
maven-dependency-plugin最大的用途是幫助分析項目依賴,dependency:list能夠列出項目最終解析到的依賴列表,dependency:tree能進一步的描繪項目依賴樹,dependency:analyze可以告訴你項目依賴潛在的問題,如果你有直接使用到的卻未聲明的依賴,該目標就會發(fā)出警告。maven-dependency-plugin還有很多目標幫助你操作依賴文件,例如dependency:copy-dependencies能將項目依賴從本地Maven倉庫復制到某個特定的文件夾下面。
maven-enforcer-plugin
http://maven.apache.org/plugins/maven-enforcer-plugin/
在一個稍大一點的組織或團隊中,你無法保證所有成員都熟悉Maven,那他們做一些比較愚蠢的事情就會變得很正常,例如給項目引入了外部的 SNAPSHOT依賴而導致構建不穩(wěn)定,使用了一個與大家不一致的Maven版本而經(jīng)常抱怨構建出現(xiàn)詭異問題。maven-enforcer- plugin能夠幫助你避免之類問題,它允許你創(chuàng)建一系列規(guī)則強制大家遵守,包括設定Java版本、設定Maven版本、禁止某些依賴、禁止 SNAPSHOT依賴。只要在一個父POM配置規(guī)則,然后讓大家繼承,當規(guī)則遭到破壞的時候,Maven就會報錯。除了標準的規(guī)則之外,你還可以擴展該插 件,編寫自己的規(guī)則。maven-enforcer-plugin的enforce目標負責檢查規(guī)則,它默認綁定到生命周期的validate階段。
maven-help-plugin
http://maven.apache.org/plugins/maven-help-plugin/
maven-help-plugin是一個小巧的輔助工具,最簡單的help:system可以打印所有可用的環(huán)境變量和Java系統(tǒng)屬性。help:effective-pom和help:effective-settings最 為有用,它們分別打印項目的有效POM和有效settings,有效POM是指合并了所有父POM(包括Super POM)后的XML,當你不確定POM的某些信息從何而來時,就可以查看有效POM。有效settings同理,特別是當你發(fā)現(xiàn)自己配置的 settings.xml沒有生效時,就可以用help:effective-settings來驗證。此外,maven-help-plugin的describe目標可以幫助你描述任何一個Maven插件的信息,還有all-profiles目標和active-profiles目標幫助查看項目的Profile。
maven-release-plugin
http://maven.apache.org/plugins/maven-release-plugin/
maven-release-plugin的用途是幫助自動化項目版本發(fā)布,它依賴于POM中的SCM信息。release:prepare用來準備版本發(fā)布,具體的工作包括檢查是否有未提交代碼、檢查是否有SNAPSHOT依賴、升級項目的SNAPSHOT版本至RELEASE版本、為項目打標簽等等。release:perform則 是簽出標簽中的RELEASE源碼,構建并發(fā)布。版本發(fā)布是非常瑣碎的工作,它涉及了各種檢查,而且由于該工作僅僅是偶爾需要,因此手動操作很容易遺漏一 些細節(jié),maven-release-plugin讓該工作變得非??焖俸啽?,不易出錯。maven-release-plugin的各種目標通常直接在 命令行調用,因為版本發(fā)布顯然不是日常構建生命周期的一部分。
maven-resources-plugin
http://maven.apache.org/plugins/maven-resources-plugin/
為了使項目結構更為清晰,Maven區(qū)別對待Java代碼文件和資源文件,maven-compiler-plugin用來編譯Java代碼,maven-resources-plugin則用來處理資源文件。默認的主資源文件目錄是src/main/resources
,很多用戶會需要添加額外的資源文件目錄,這個時候就可以通過配置maven-resources-plugin來實現(xiàn)。此外,資源文件過濾也是Maven的一大特性,你可以在資源文件中使用${propertyName}形式的Maven屬性,然后配置maven-resources-plugin開啟對資源文件的過濾,之后就可以針對不同環(huán)境通過命令行或者Profile傳入屬性的值,以實現(xiàn)更為靈活的構建。
maven-surefire-plugin
http://maven.apache.org/plugins/maven-surefire-plugin/
可能是由于歷史的原因,Maven 2/3中用于執(zhí)行測試的插件不是maven-test-plugin,而是maven-surefire-plugin。其實大部分時間內,只要你的測試 類遵循通用的命令約定(以Test結尾、以TestCase結尾、或者以Test開頭),就幾乎不用知曉該插件的存在。然而在當你想要跳過測試、排除某些 測試類、或者使用一些TestNG特性的時候,了解maven-surefire-plugin的一些配置選項就很有用了。例如 mvn test -Dtest=FooTest 這樣一條命令的效果是僅運行FooTest測試類,這是通過控制maven-surefire-plugin的test參數(shù)實現(xiàn)的。
build-helper-maven-plugin
http://mojo.codehaus.org/build-helper-maven-plugin/
Maven默認只允許指定一個主Java代碼目錄和一個測試Java代碼目錄,雖然這其實是個應當盡量遵守的約定,但偶爾你還是會希望能夠指定多個 源碼目錄(例如為了應對遺留項目),build-helper-maven-plugin的add-source目標就是服務于這個目的,通常它被綁定到 默認生命周期的generate-sources階段以添加額外的源碼目錄。需要強調的是,這種做法還是不推薦的,因為它破壞了 Maven的約定,而且可能會遇到其他嚴格遵守約定的插件工具無法正確識別額外的源碼目錄。
build-helper-maven-plugin的另一個非常有用的目標是attach-artifact,使用該目標你可以以classifier的形式選取部分項目文件生成附屬構件,并同時install到本地倉庫,也可以deploy到遠程倉庫。
exec-maven-plugin
http://mojo.codehaus.org/exec-maven-plugin/
exec-maven-plugin很好理解,顧名思義,它能讓你運行任何本地的系統(tǒng)程序,在某些特定情況下,運行一個Maven外部的程序可能就是最簡單的問題解決方案,這就是exec:exec的 用途,當然,該插件還允許你配置相關的程序運行參數(shù)。除了exec目標之外,exec-maven-plugin還提供了一個java目標,該目標要求你 提供一個mainClass參數(shù),然后它能夠利用當前項目的依賴作為classpath,在同一個JVM中運行該mainClass。有時候,為了簡單的 演示一個命令行Java程序,你可以在POM中配置好exec-maven-plugin的相關運行參數(shù),然后直接在命令運行mvn exec:java 以查看運行效果。
jetty-maven-plugin
http://wiki.eclipse.org/Jetty/Feature/Jetty_Maven_Plugin
在進行Web開發(fā)的時候,打開瀏覽器對應用進行手動的測試幾乎是無法避免的,這種測試方法通常就是將項目打包成war文件,然后部署到Web容器 中,再啟動容器進行驗證,這顯然十分耗時。為了幫助開發(fā)者節(jié)省時間,jetty-maven-plugin應運而生,它完全兼容 Maven項目的目錄結構,能夠周期性地檢查源文件,一旦發(fā)現(xiàn)變更后自動更新到內置的Jetty Web容器中。做一些基本配置后(例如Web應用的contextPath和自動掃描變更的時間間隔),你只要執(zhí)行 mvn jetty:run ,然后在IDE中修改代碼,代碼經(jīng)IDE自動編譯后產生變更,再由jetty-maven-plugin偵測到后更新至Jetty容器,這時你就可以直接 測試Web頁面了。需要注意的是,jetty-maven-plugin并不是宿主于Apache或Codehaus的官方插件,因此使用的時候需要額外 的配置settings.xml
的pluginGroups元素,將org.mortbay.jetty這個pluginGroup加入。
versions-maven-plugin
http://mojo.codehaus.org/versions-maven-plugin/
很多Maven用戶遇到過這樣一個問題,當項目包含大量模塊的時候,為他們集體更新版本就變成一件煩人的事情,到底有沒有自動化工具能幫助完成這件 事情呢?(當然你可以使用sed之類的文本操作工具,不過不在本文討論范圍)答案是肯定的,versions-maven- plugin提供了很多目標幫助你管理Maven項目的各種版本信息。例如最常用的,命令 mvn versions:set -DnewVersion=1.1-SNAPSHOT 就能幫助你把所有模塊的版本更新到1.1-SNAPSHOT。該插件還提供了其他一些很有用的目標,display-dependency- updates能告訴你項目依賴有哪些可用的更新;類似的display-plugin-updates能告訴你可用的插件更新;然后use- latest-versions能自動幫你將所有依賴升級到最新版本。最后,如果你對所做的更改滿意,則可以使用 mvn versions:commit 提交,不滿意的話也可以使用 mvn versions:revert 進行撤銷。
更多詳情請參考https://maven.apache.org/plugins/
常用Maven命令
生命周期 | 階段描述 |
---|---|
mvn validate | 驗證項目是否正確,以及所有為了完整構建必要的信息是否可用 |
mvn generate-sources | 生成所有需要包含在編譯過程中的源代碼 |
mvn process-sources | 處理源代碼,比如過濾一些值 |
mvn generate-resources | 生成所有需要包含在打包過程中的資源文件 |
mvn process-resources | 復制并處理資源文件至目標目錄,準備打包 |
mvn compile | 編譯項目的源代碼 |
mvn process-classes | 后處理編譯生成的文件,例如對Java類進行字節(jié)碼增強(bytecode enhancement) |
mvn generate-test-sources | 生成所有包含在測試編譯過程中的測試源碼 |
mvn process-test-sources | 處理測試源碼,比如過濾一些值 |
mvn generate-test-resources | 生成測試需要的資源文件 |
mvn process-test-resources | 復制并處理測試資源文件至測試目標目錄 |
mvn test-compile | 編譯測試源碼至測試目標目錄 |
mvn test | 使用合適的單元測試框架運行測試。這些測試應該不需要代碼被打包或發(fā)布 |
mvn prepare-package | 在真正的打包之前,執(zhí)行一些準備打包必要的操作。這通常會產生一個包的展開的處理過的版本(將會在Maven 2.1+中實現(xiàn)) |
mvn package | 將編譯好的代碼打包成可分發(fā)的格式,如JAR,WAR,或者EAR |
mvn pre-integration-test | 執(zhí)行一些在集成測試運行之前需要的動作。如建立集成測試需要的環(huán)境 |
mvn integration-test | 如果有必要的話,處理包并發(fā)布至集成測試可以運行的環(huán)境 |
mvn post-integration-test | 執(zhí)行一些在集成測試運行之后需要的動作。如清理集成測試環(huán)境。 |
mvn verify | 執(zhí)行所有檢查,驗證包是有效的,符合質量規(guī)范 |
mvn install | 安裝包至本地倉庫,以備本地的其它項目作為依賴使用 |
mvn deploy | 復制最終的包至遠程倉庫,共享給其它開發(fā)人員和項目(通常和一次正式的發(fā)布相關) |
使用參數(shù)
-Dmaven.test.skip=true
: 跳過單元測試(eg: mcn clean package -Dmaven.test.skip=true)
常見問題
dependencies和dependencyManagement,plugins和pluginManagement有什么區(qū)別?
dependencyManagement是表示依賴jar包的聲明,即你在項目中的dependencyManagement下聲明了依賴,maven不會加載該依賴,dependencyManagement聲明可以被繼承。
dependencyManagement的一個使用案例是當有父子項目的時候,父項目中可以利用dependencyManagement聲明子項目中需要用到的依賴jar包,之后,當某個或者某幾個子項目需要加載該插件的時候,就可以在子項目中dependencies節(jié)點只配置 groupId 和 artifactId就可以完成插件的引用。
dependencyManagement主要是為了統(tǒng)一管理插件,確保所有子項目使用的插件版本保持一致,類似的還有plugins和pluginManagement。