Maven 的核心其實不做什么實際的事情,除了解析一些 XML 文檔,管理生命周期與插件之外。Maven 被設計成將主要的職責委派給一組 Maven 插件,這些插件可以影響 Maven 生命周期,提供對目標的訪問。絕大多數 Maven 的動作發(fā)生于Maven 插件的目標,如編譯源碼,打包二進制代碼,發(fā)布站點和其它構建任務。
一個Maven插件是一個單個或多個目標的集合,Maven插件的例子有一些簡單但核心的插件,像Jar插件,它包含了一組創(chuàng)建JAR文件的目標,Compiler插件,它包含了一組編譯源代碼和測試代碼的目標,或者Surefire插件,它包含一組運行單元測試和生成測試報告的目標。
一個目標是一個明確的任務,它可以作為單獨的目標運行,或者作為一個大的構建的一部分和其它目標一起運行,目標的例子包括Compiler插件中的目標,它用來編譯項目中的所有目標,用來運行單元測試。目標通過配置屬性進行配置,以用來定制行為。例如,Compiler插件的compile目標定義了一組配置參數,它們允許你設置目標JDK版本或者選擇是否用編譯優(yōu)化。
1. help插件
你需要一個工具來幫助你理解一些Maven使用的模型,以及某個插件有什么可用的目標。Maven Help插件能讓你列出活動的Maven Profile,顯示一個實際POM(effective POM),打印實際settings(effective settings),或者列出Maven插件的屬性。 Maven Help 插件有四個目標。前三個目標是—— active-profiles, effective-pom 和effective-settings —— 描述一個特定的項目,它們必須在項目的目錄下運行。 最后一個目標—— describe ——相對比較復雜,展示某個插件或者插件目標的相關信息。
help:active-profiles 列出當前構建中活動的Profile(項目的,用戶的,全局的)。
help:effective-pom 顯示當前構建的實際POM,包含活動的Profile。
help:effective-settings 打印出項目的實際settings, 包括從全局的settings和用戶級別settings繼承的配置。
help:describe 描述插件的屬性。它不需要在項目目錄下運行。但是你必須提供你想要描述插件的 groupId 和 artifactId。
當你開始使用Maven。
你會試圖獲得Maven插件的信息:插件如何工作?配置參數是什么?目標是什么? 你會經常使用 help:describe 目標來獲取這些信息。通過 plugin 參數你可以指定你想要研究哪個插件,你可以傳入插件的前綴(如help 插件就是 maven-help-plugin),或者可以是 groupId:artifact[:version]這里 version 是可選的。
比如, 下面的命令使用 help 插件的目標來輸出Maven Help 插件的信息。
- mvn help:describe -Dplugin=help
通過設置plugin參數來運行describe目標,輸出為該插件的Maven坐標,目標前綴,和該插件的一個簡要介紹。如果你想要 Help 插件輸出完整的帶有參數的目標列表,只要運行帶有參數full的help:describe 目標就可以了,
- mvn help:describe -Dplugin=help -Dfull
該選項能讓你查看插件所有的目標及相關參數。但是有時候這些信息顯得太多了。這時候你可以獲取單個目標的信息,設置 mojo 參數和參數。下面的命令列出了Compiler 插件的compile目標的所有信息(在maven里一個插件目標也被認為是一個mojo)
- mvn help:describe -Dplugin=compiler -Dmojo=compile -Dfull
2. archetype插件
3. exec插件
exec 插件允許你運行 Java 類和其它腳本。 它不是 Maven 核心插件,但它可以從Codehaus3 的 Mojo4 項目得到。想要查看 Exec 插件的完整描述,運行:mvn help:describe -Dplugin=exec -Dfull
這會列出所有 Maven Exec 插件可用的目標。 Help 插件同時也會列出 Exec 插件的有效參數,如果你想要定制 Exec 插件的行為,傳入命令行參數,你應該使用help:describe 提供的文檔作為指南。
Exec 插件讓我們能夠在不往 classpath 載入適當的依賴的情況下,運行這個程序。 在任何其它的構建系統(tǒng)能夠中,我們必須復制所有程序依賴到類似于 lib/ 的目錄,這個目錄包含一個 JAR 文件的集合。
4. dependency插件
maven Dependency 插件來打印出已解決依賴的列表。
mvn dependency:analyze
mvn dependency:resolve
將會打印出最終的你項目編譯所基于的所有依賴的組合
mvn dependency:tree
將打印項目的整個依賴樹想要查看完整的依賴蹤跡,包含那些因為沖突或者其它原因而被拒絕引入的構件,
打開 Maven 的調試標記運行mvn install -X
有一個目標比較有用,就是將maven項目的依賴jar到出來:mvn dependency:copy-dependencies
a. 導出到默認目錄 targed/dependency
從Maven項目中導出項目依賴的jar包:進入工程pom.xml 所在的目錄下,執(zhí)行如下命令:
- mvn dependency:copy-dependencies
或在eclipse中,選擇項目的pom.xml文件,點擊右鍵菜單中的Run As,見下圖紅框中,在彈出的Configuration窗口中,
輸入 dependency:copy-dependencies 后,點擊運行
maven項目所依賴的jar包會導出到targed/dependency目錄中。
b.導出到自定義目錄中
在maven項目下創(chuàng)建lib文件夾,輸入以下命令:即可將maven項目所依賴的jar包都會復制到項目目錄下的lib目錄下
- mvn dependency:copy-dependencies -DoutputDirectory=lib
同時設置依賴級別,通常使用compile級別- mvn dependency:copy-dependencies -DoutputDirectory=lib -DincludeScope=compile
5. surefire插件
Maven Surefire 插件有一個 test 目標,該目標被綁定在了 test 階段。
test 目標執(zhí)行項目中所有能在 src/test/java 找到的并且文件名與 **/Test*.java, **/*Test.java 匹配的所有單元測試 ,
在 Maven Surefire 插件執(zhí)行 JUnit 測試的時候,它同時也在 /target/surefire-reports
目錄下生成 XML 和常規(guī)文本報告。
如果你的測試失敗了,你可以去查看這個目錄,里面有你單元測試生成的異常堆棧信息和錯誤信息。
當Maven 遇到一個測試失敗,它默認的行為是停止當前的構建。 如果你希望繼續(xù)構建項目,即使 Surefire 插件
遇到了失敗的單元測試,你就需要設置 Surefire 的testFailureIgnore 這個配置屬性為 true。
- <project>
- [...]
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-surefire-plugin</artifactId>
- <configuration>
- <testFailureIgnore>true</testFailureIgnore>
- </configuration>
- </plugin>
- </plugins>
- </build>
- [...]
- </project>
這個表達式可以從命令行通過 -D 參數設置。mvn test -Dmaven.test.failure.ignore=true
Maven 提供了跳過單元測試的能力,只需要使用 Surefire 插件的 skip 參數。 在命令行,只要簡單的給任何目標添加
maven.test.skip 屬性就能跳過測試:mvn install -Dmaven.test.skip=true
另一種配置 Maven 跳過單元測試的方法是給你項目的 pom.xml 添加這個配置
- <project>
- [...]
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-surefire-plugin</artifactId>
- <configuration>
- <skip>true</skip>
- </configuration>
- </plugin>
- </plugins>
- </build>
- [...]
- </project>
6. assembly插件
Maven Assembly 插件是一個用來創(chuàng)建你應用程序特有分發(fā)包的插件。 你可以使用 Maven Assembly 插件
以你希望的任何形式來裝配輸出,只需定義一個自定義的裝配描述符,即可生成一個可分發(fā)的JAR文件,該文件包含
了項目的二進制文件和所有的依賴。
要配置 Maven Assembly 插件, 需要在 pom.xml 中的build 配置中添加如下的 plugin 配置。如下圖所示
- <project>
- [...]
- <build>
- <plugins>
- <plugin>
- <artifactId>maven-assembly-plugin</artifactId>
- <configuration>
- <descriptorRefs>
- <descriptorRef>jar-with-dependencies</descriptorRef>
- </descriptorRefs>
- </configuration>
- </plugin>
- </plugins>
- </build>
- [...]
- </project>
添加好這些配置以后,你可以通過運行 mvn assembly:assembly來構建這個裝配。將工程依賴的jar包和工程都打成一個jar打包在 target/***-1.0-jar-with-dependencies.jar 裝配好之后, 我們可以在命令行重新運行 Main 類
java -cp **-1.0-jar-with-dependencies.jar *.*.Main
7. jetty插件
8. tomcat插件
9. source插件
10. compiler插件
用于編譯源代碼,默認在compile階段被調用。兩個goal,compiler:compile/compiler:testCompile
windows平臺默認使用GBK編碼,如果工程編碼為utf8,也需要在compiler插件中指出,否則按GBK編碼,也會出問題
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>3.3</version>
- <configuration>
- <!--源碼的Java版本-->
- <source>1.7</source>
- <!--運行環(huán)境的Java版本-->
- <target>1.7</target>
- <encoding>UTF8</encoding>
- </configuration>
- </plugin>
11、Resource插件
- <filters>
- <filter>${user.home}/asssd.properties</filter>
- </filters>
- <resources>
- <resource>
- <directory>src/main/resources</directory>
- <filtering>true</filtering>
- <includes>
- <include>**/*</include>
- </includes>
- </resource>
- <resource>
- <directory>src/main/java</directory>
- <includes>
- <include>**.xml</include>
- </includes>
- </resource>
- </resources>
運行打包命令時,將src/main/resources中的所有文件和src/main/java目錄下的所有.xml文件打到jar包中。
其中filters過濾器的作用是將所有引用文件中的${變量名稱},替換成antx.properties文件中的變量值。要使用過濾器時,首先需要設置過濾器:
<filters>
<filter>${user.home}/antx.properties</filter>
</filters>
然后再啟動過濾器, true需要過濾,false不需要過濾:
<filtering>true</filtering>