Maven插件

Maven 插件

參考資料:

http://maven.apache.org/components/plugins
https://blog.csdn.net/HaosCoder/article/details/79524629
https://www.yiibai.com/maven/maven_plugins.html

Maven本質上是一個插件框架,它的核心并不執行任何具體的構建任務,所有這些任務都交給插件來完成。

創建 jar 文件

創建 war 文件

編譯代碼文件

進行代碼單元測試

創建項目文檔

創建項目報告

一個插件通常提供了一組目標,可使用以下語法來執行:

mvn [plugin-name]:[goal-name]

例如,一個 Java 項目可以使用 Maven 編譯器插件來編譯目標,通過運行以下命令編譯

mvn compiler:compile

插件類型

類型 描述
構建插件 在生成過程中執行,并在 pom.xml 中的<build/> 元素進行配置
報告插件 在網站生成期間執行,在 pom.xml 中的 <reporting/> 元素進行配置

常用插件

Maven官方有兩個插件列表:

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

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

以下是一些常見的插件列表:

插件 描述
clean 編譯后的清理目標,刪除目標目錄
compiler 編譯 Java 源文件
surefile 運行JUnit單元測試,創建測試報告
jar 從當前項目構建 JAR 文件
war 從當前項目構建 WAR 文件
javadoc 產生用于該項目的 Javadoc
antrun 從構建所述的任何階段運行一組 Ant 任務

插件使用

用戶可以通過兩種方式調用Maven插件目標。

第一種方式是將插件目標與生命周期階段(lifecycle phase)綁定,這樣用戶在命令行只是輸入生命周期階段而已。

例如Maven默認將maven-compiler-plugin的compile目標與compile生命周期階段綁定,因此命令mvn compile實際上是先定位到compile這一生命周期階段,然后再根據綁定關系調用maven-compiler-plugin的compile目標。

第二種方式是直接在命令行指定要執行的插件目標。

例如mvn archetype:generate 就表示調用maven-archetype-plugin的generate目標,這種帶冒號的調用方式與生命周期無關。

插件

  • maven-jar-plugin

https://www.cnblogs.com/xsblog/p/9311316.html

  • maven-antrun-plugin

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

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

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

  • 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,幫助他們快速上手。

  • maven-assembly-plugin

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

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

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

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

  • maven-dependency-plugin

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

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

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

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

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

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

  • maven-enforcer-plugin

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

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

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

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

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

  • 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。

  • maven-release-plugin

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

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

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

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

  • 默認的編譯插件maven-compiler-plugin
  • 默認的打包插件maven-jar-plugin

例子

它支持各種打包文件格式,包括zip、tar.gz、tar.bz2等等,通過一個打包描述文件(該例中是src/main/assembly.xml),它能夠幫助用戶選擇具體打包哪些文件集合、依賴、模塊、和甚至本地倉庫文件,每個項的具體打包路徑用戶也能自由控制。如下就是對應上述需求的打包描述文件src/main/assembly.xml:

<assembly>
  <id>bin</id>
  <formats>
    <format>zip</format>
  </formats>
  <dependencySets>
    <dependencySet>
      <useProjectArtifact>true</useProjectArtifact>
      <outputDirectory>lib</outputDirectory>
    </dependencySet>
  </dependencySets>
  <fileSets>
    <fileSet>
      <outputDirectory>/</outputDirectory>
      <includes>
        <include>README.txt</include>
      </includes>
    </fileSet>
    <fileSet>
      <directory>src/main/scripts</directory>
      <outputDirectory>/bin</outputDirectory>
      <includes>
        <include>run.sh</include>
        <include>run.bat</include>
      </includes>
    </fileSet>
  </fileSets>
</assembly>

最后,我們需要配置maven-assembly-plugin使用打包描述文件,并綁定生命周期階段使其自動執行打包操作:

默認情況下,maven-assembly-plugin內置了幾個可以用的assembly descriptor:

  • bin : 類似于默認打包,會將bin目錄下的文件打到包中
  • jar-with-dependencies : 會將所有依賴都解壓打包到生成物中
  • src :只將源碼目錄下的文件打包
  • project : 將整個project資源打包
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2.1</version>
    <configuration>
      <descriptors>
        <descriptor>src/main/assembly/assembly.xml</descriptor>
      </descriptors>
    </configuration>
    <executions>
      <execution>
        <id>make-assembly</id>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
  • maven-surefire-plugin 打包時跳過單元測試
<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <skip>true</skip>
    </configuration>
</plugin>

mvn package -Dmaven.test.skip=true
如果單元測試中有輸出中文,eclipse的控制臺里中文可能會變成亂碼輸出,也可以通過這個插件解決,參考配置:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.16</version>
    <configuration>
        <forkMode>once</forkMode>
        <argLine>-Dfile.encoding=UTF-8</argLine>
    </configuration>
</plugin>
  • maven-dependency-plugin

    https://blog.csdn.net/yyoc97/article/details/77689531

    自動拷貝jar包到target目錄, goal 有<goal> 為copy,和 copy-dependencies, 區別是copy是選擇打包哪些依賴, copy-dependencies是排除哪些依賴

    有用命令: mvn dependency:tree 依賴樹

1. copy
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <version>3.0.1</version>
  <configuration>
    <artifactItems>
      <artifactItem>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
      </artifactItem>
    </artifactItems>
    <outputDirectory>target/lib</outputDirectory>
  </configuration>
  <executions>
      <execution>
        <id>copy-dependencies</id>
        <phase>package</phase>
        <goals>
          <goal>copy</goal>
        </goals>
      </execution>
  </executions>
</plugin>
2. copy-dependencies
<plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>compile</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>target/lib</outputDirectory>
                <!-- 表示是否不包含間接依賴的包 -->
                <excludeTransitive>false</excludeTransitive>
                <!-- 表示復制的jar文件去掉版本信息 -->
                <stripVersion>true</stripVersion>
                <!-- 排除打包 -->
                <excludeArtifactIds>
                    spring-boot-devtools,junit
                </excludeArtifactIds>
                <overWriteSnapshots>true</overWriteSnapshots>
            </configuration>
        </execution>
    </executions>
</plugin>
  • maven-shade-plugin

打超級Jar包, 它包含所有的依賴 jar 包。也可以使用該插件解決包沖突問題

 <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.1.0</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>cn.dubby.undertow.demo.HelloWorldServer</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,646評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,595評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,560評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,035評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,814評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,224評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,301評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,444評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,988評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,804評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,998評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,544評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,237評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,665評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,927評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,706評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,993評論 2 374

推薦閱讀更多精彩內容

  • 轉自:http://www.cnblogs.com/crazy-fox/archive/2012/02/09/23...
    晴天哥_王志閱讀 2,256評論 2 27
  • 我們都知道Maven本質上是一個插件框架,它的核心并不執行任何具體的構建任務,所有這些任務都交給插件來完成,例如編...
    付鵬丶閱讀 1,635評論 0 15
  • 經過Maven生命周期的學習,我們知道在Maven core中僅僅定義了抽象的生命周期,具體的實現是由插件完成的,...
    SonyaBaby閱讀 1,287評論 0 3
  • 使用指導 如何添加外部依賴jar包 在Maven工程中添加依賴jar包,很簡單,只要在POM文件中引入對應的<de...
    靜默虛空閱讀 2,809評論 0 13
  • 官方文檔:http://maven.apache.org/guides/introduction/introduc...
    icecrea閱讀 2,111評論 0 2