maven插件合集

1. 添加插件

類似於添加依賴, 通過 GAV 來指定插件, 其中對於maven官方插件, 可以省略 GroupId

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-clean-plugin</artifactId>
            <version>3.0.0</version>
        </plugin>
    </plugins>
</build>

2. 插件版本控制

與控制依賴版本類似, 可以通過引用屬性和 pluginManagement 對項目中的插件版本進行統一管理.

注意 pluginManagement 元素需要放在 build 元素之下

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <artifactId>maven-clean-plugin</artifactId>
                <version>3.0.0</version>
            </plugin>
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.0.2</version>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.7.0</version>
            </plugin>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.20.1</version>
            </plugin>
            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.2.0</version>
            </plugin>
            <plugin>
                <artifactId>maven-install-plugin</artifactId>
                <version>2.5.2</version>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

3. 插件行爲修改

3.1. configuration

大多數插件都可通過 元素對插件進行配置, 詳細設置屬性參見文檔

某些插件還支持使用聲明的屬性進行配置

如可聲明 <maven.compiler.source> 和 <maven.compiler.target> 屬性來設置 compiler 的編譯級別

3.2. 設置編譯級別

maven 默認編譯版本爲 1.5, 如果需要使用更高版本, 應該顯式配置 compile 插件, 並聲明使用 1.8 的編譯版本

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.3</version>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <encoding>UTF-8</encoding>
    </configuration>
</plugin>

也可以在 maven 的 setting.xml 中設置, 這樣使用該 maven 的所有項目都會使用 1.8 , 不需在項目 pom 中聲明

<profiles>
    <profile>     
        <id>JDK-1.8</id>       
        <activation>       
            <activeByDefault>true</activeByDefault>       
            <jdk>1.8</jdk>       
        </activation>       
        <properties>       
            <maven.compiler.source>1.8</maven.compiler.source>       
            <maven.compiler.target>1.8</maven.compiler.target>       
            <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>       
        </properties>       
    </profile> 
</profiles>

3.3. 資源目錄與過濾

大部分生命週期, 將 resources: resources 目標綁定到 process-resources 階段,

這個目標會將資源目錄 src/main/resources 的文件, 複製到輸出目錄 traget/classes , 如果設置了過濾規則, 這個目標還會將資源文件中的某些內容做出處理, 替換掉其中的一些變量值

比如resources 下有一個 jdbc.xml, 記錄了數據庫URL 和登錄信息, 內容如下:

<bean id = "dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">  
    <property name="jdbcUrl" value="${jdbc.mysql.url}" />  
    <property name="username" value="${jdbc.mysql.username}" />  
    <property name="password" value="${jdbc.mysql.password}" />  
</bean> 

其中的數據庫具體信息, 都用一個 ${…} 表達式表示.

而則在另外一個properties 文件中, 定義了這些變量具體的值

jdbc.mysql.url=jdbc:mysql://192.168.3.224:3306/demo
jdbc.mysql.username=root
jdbc.mysql.password=123456

maven 的資源過濾, 可以在構建過程中, 自動讀取properties 文件中的值, 並填入到 jdbc.xml 文件中的對應位置.

maven 默認不會進行資源過濾, 需要在項目pom.xml 中進行如下配置才能實現資源過濾 :

定義過濾器
定義資源目錄, 並顯示聲明需要過濾, 可以定義多個資源目錄, 並單獨聲明是否需要過濾

<build>
    <!-- 定義過濾器, 即需要的屬性值的來源 -->
    <filters>
        <filter>../conf.properties</filter>
    </filters>

    <!-- 定義資源目錄 -->
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <!-- 包含目錄下, 以及下級目錄的所有文件 -->
            <includes>
                <include>**/*</include>
            </includes>
            <!-- 該資源目錄是否使用資源過濾 -->
            <filtering>true</filtering>
            <!-- 可以爲每個資源目錄單獨設置輸出目錄 -->
            <targetPath>target/conf</targetPath>
        </resource>

        <!-- 可以爲每個資源目錄單獨設置輸出目錄 -->
        <resource>
            <directory>src/main/img</directory>
            <targetPath>target/img</targetPath>
        </resource>
        <resource>
            <directory>src/main/xml</directory>
            <targetPath>target/xml</targetPath>
        </resource>
    </resources>
</build>    

3.4. 跳過單元測試

默認情況下, 構建時會執行單元測試, 如果希望不經測試直接構建, 可以設置跳過單元測試

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <skip>true</skip>
    </configuration>
</plugin>

3.5. 忽略失敗的測試

默認情況下, 測試失敗後會中止構建過程, 如果希望測試失敗後不影響構建, 可以將失敗的測試忽略

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <testFailureIgnore>true</testFailureIgnore>
    </configuration>
</plugin>

4.插件列表

Maven官方有兩個插件列表:

第一個列表的GroupId爲org.apache.maven.plugins,這裏的插件最爲成熟,具體地址爲:http://maven.apache.org/plugins/index.html。

第二個列表的GroupId爲org.codehaus.mojo,這裏的插件沒有那麼核心,但也有不少十分有用,其地址爲:http://mojo.codehaus.org/plugins.html。

5. maven-antrun-plugin

http://maven.apache.org/plugins/maven-antrun-plugin/

maven-antrun-plugin能讓用戶在Maven項目中運行Ant任務。用戶可以直接在該插件的配置以Ant的方式編寫Target,然後交給該插件的run目標去執行。

在一些由Ant往Maven遷移的項目中,該插件尤其有用。

此外當你發現需要編寫一些自定義程度很高的任務,同時又覺得Maven不夠靈活時,也可以以Ant的方式實現之。maven-antrun-plugin的run目標通常與生命週期綁定運行。

6. maven-archetype-plugin

http://maven.apache.org/archetype/maven-archetype-plugin/

Archtype指項目的骨架,Maven初學者最開始執行的Maven命令可能就是mvn archetype:generate,這實際上就是讓maven-archetype-plugin生成一個很簡單的項目骨架,幫助開發者快速上手。

可能也有人看到一些文檔寫了mvn archetype:create,但實際上create目標已經被棄用了,取而代之的是generate目標,該目標使用交互式的方式提示用戶輸入必要的信息以創建項目,體驗更好。

maven-archetype-plugin還有一些其他目標幫助用戶自己定義項目原型,例如你由一個產品需要交付給很多客戶進行二次開發,你就可以爲他們提供一個Archtype,幫助他們快速上手。

7. maven-assembly-plugin

http://maven.apache.org/plugins/maven-assembly-plugin/

maven-assembly-plugin的用途是製作項目分發包,該分發包可能包含了項目的可執行文件、源代碼、readme、平臺腳本等等。

maven-assembly-plugin支持各種主流的格式如zip、tar.gz、jar和war等,具體打包哪些文件是高度可控的。

例如用戶可以按文件級別的粒度、文件集級別的粒度、模塊級別的粒度、以及依賴級別的粒度控制打包,此外,包含和排除配置也是支持的。

maven-assembly-plugin要求用戶使用一個名爲assembly.xml的元數據文件來表述打包,它的single目標可以直接在命令行調用,也可以被綁定至生命週期。

8. maven-dependency-plugin

http://maven.apache.org/plugins/maven-dependency-plugin/

maven-dependency-plugin最大的用途是幫助分析項目依賴

dependency:list能夠列出項目最終解析到的依賴列表

dependency:tree能進一步的描繪項目依賴樹

dependency:analyze可以告訴你項目依賴潛在的問題

如果你有直接使用到的卻未聲明的依賴,該目標就會發出警告。

maven-dependency-plugin還有很多目標幫助你操作依賴文件,例如dependency:copy-dependencies能將項目依賴從本地Maven倉庫複製到某個特定的文件夾下面。

9. maven-enforcer-plugin

http://maven.apache.org/plugins/maven-enforcer-plugin/

在一個稍大一點的組織或團隊中,你無法保證所有成員都熟悉Maven,那他們做一些比較愚蠢的事情就會變得很正常。

例如給項目引入了外部的SNAPSHOT依賴而導致構建不穩定,使用了一個與大家不一致的Maven版本而經常抱怨構建出現詭異問題。

maven-enforcer-plugin能夠幫助你避免之類問題,它允許你創建一系列規則強制大家遵守,包括設定Java版本、設定Maven版本、禁止某些依賴、禁止SNAPSHOT依賴。

只要在一個父POM配置規則,然後讓大家繼承,當規則遭到破壞的時候,Maven就會報錯。

除了標準的規則之外,你還可以擴展該插件,編寫自己的規則。maven-enforcer-plugin的enforce目標負責檢查規則,它默認綁定到生命週期的validate階段。

10. maven-help-plugin

http://maven.apache.org/plugins/maven-help-plugin/

maven-help-plugin是一個小巧的輔助工具。

最簡單的help:system可以打印所有可用的環境變量和Java系統屬性。

help:effective-pom和help:effective-settings最爲有用,它們分別打印項目的有效POM和有效settings,有效POM是指合併了所有父POM(包括Super POM)後的XML,

當你不確定POM的某些信息從何而來時,就可以查看有效POM。

有效settings同理,特別是當你發現自己配置的settings.xml沒有生效時,就可以用help:effective-settings來驗證。

此外,maven-help-plugin的describe目標可以幫助你描述任何一個Maven插件的信息,還有all-profiles目標和active-profiles目標幫助查看項目的Profile。

11. maven-release-plugin

http://maven.apache.org/plugins/maven-release-plugin/

maven-release-plugin的用途是幫助自動化項目版本發佈,它依賴於POM中的SCM信息。

release:prepare用來準備版本發佈,具體的工作包括檢查是否有未提交代碼、檢查是否有SNAPSHOT依賴、升級項目的SNAPSHOT版本至RELEASE版本、爲項目打標籤等等。

release:perform則是簽出標籤中的RELEASE源碼,構建併發布。版本發佈是非常瑣碎的工作,它涉及了各種檢查,而且由於該工作僅僅是偶爾需要,因此手動操作很容易遺漏一些細節。

maven-release-plugin讓該工作變得非常快速簡便,不易出錯。maven-release-plugin的各種目標通常直接在命令行調用,因爲版本發佈顯然不是日常構建生命週期的一部分。

12. maven-resources-plugin

http://maven.apache.org/plugins/maven-resources-plugin/

爲了使項目結構更爲清晰,Maven區別對待Java代碼文件和資源文件,maven-compiler-plugin用來編譯Java代碼,maven-resources-plugin則用來處理資源文件。

默認的主資源文件目錄是src/main/resources,很多用戶會需要添加額外的資源文件目錄,這個時候就可以通過配置maven-resources-plugin來實現。

此外,資源文件過濾也是Maven的一大特性,你可以在資源文件中使用${propertyName}形式的Maven屬性,然後配置maven-resources-plugin開啓對資源文件的過濾,

之後就可以針對不同環境通過命令行或者Profile傳入屬性的值,以實現更爲靈活的構建。

13. maven-surefire-plugin

http://maven.apache.org/plugins/maven-surefire-plugin/

可能是由於歷史的原因,Maven 2/3中用於執行測試的插件不是maven-test-plugin,而是maven-surefire-plugin。

其實大部分時間內,只要你的測試類遵循通用的命令約定(以Test結尾、以TestCase結尾、或者以Test開頭),就幾乎不用知曉該插件的存在。

然而在當你想要跳過測試、排除某些測試類、或者使用一些TestNG特性的時候,瞭解maven-surefire-plugin的一些配置選項就很有用了。

例如 mvn test -Dtest=FooTest 這樣一條命令的效果是僅運行FooTest測試類,這是通過控制maven-surefire-plugin的test參數實現的。

14. 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到遠程倉庫。

15. exec-maven-plugin

http://mojo.codehaus.org/exec-maven-plugin/

exec-maven-plugin很好理解,顧名思義,它能讓你運行任何本地的系統程序,

在某些特定情況下,運行一個Maven外部的程序可能就是最簡單的問題解決方案,這就是exec:exec的用途,當然,該插件還允許你配置相關的程序運行參數。

除了exec目標之外,exec-maven-plugin還提供了一個java目標,該目標要求你提供一個mainClass參數,然後它能夠利用當前項目的依賴作爲classpath,在同一個JVM中運行該mainClass。

有時候,爲了簡單的演示一個命令行Java程序,你可以在POM中配置好exec-maven-plugin的相關運行參數,然後直接在命令運行 mvn exec:java 以查看運行效果。

16. jetty-maven-plugin

http://wiki.eclipse.org/Jetty/Feature/Jetty_Maven_Plugin

在進行Web開發的時候,打開瀏覽器對應用進行手動的測試幾乎是無法避免的,這種測試方法通常就是將項目打包成war文件,然後部署到Web容器中,再啓動容器進行驗證,這顯然十分耗時。

爲了幫助開發者節省時間,jetty-maven-plugin應運而生,它完全兼容 Maven項目的目錄結構,能夠週期性地檢查源文件,一旦發現變更後自動更新到內置的Jetty Web容器中。

做一些基本配置後(例如Web應用的contextPath和自動掃描變更的時間間隔),你只要執行 mvn jetty:run ,然後在IDE中修改代碼,代碼經IDE自動編譯後產生變更,

再由jetty-maven-plugin偵測到後更新至Jetty容器,這時你就可以直接測試Web頁面了。

需要注意的是,jetty-maven-plugin並不是宿主於Apache或Codehaus的官方插件,因此使用的時候需要額外的配置settings.xml的pluginGroups元素,將org.mortbay.jetty這個pluginGroup加入。

17. 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 進行撤銷。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章