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本質(zhì)上是一個插件框架,它的核心并不執(zhí)行任何具體的構(gòu)建任務(wù),所有這些任務(wù)都交給插件來完成。

創(chuàng)建 jar 文件

創(chuàng)建 war 文件

編譯代碼文件

進(jìn)行代碼單元測試

創(chuàng)建項目文檔

創(chuàng)建項目報告

一個插件通常提供了一組目標(biāo),可使用以下語法來執(zhí)行:

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

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

mvn compiler:compile

插件類型

類型 描述
構(gòu)建插件 在生成過程中執(zhí)行,并在 pom.xml 中的<build/> 元素進(jìn)行配置
報告插件 在網(wǎng)站生成期間執(zhí)行,在 pom.xml 中的 <reporting/> 元素進(jìn)行配置

常用插件

Maven官方有兩個插件列表:

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

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

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

插件 描述
clean 編譯后的清理目標(biāo),刪除目標(biāo)目錄
compiler 編譯 Java 源文件
surefile 運行JUnit單元測試,創(chuàng)建測試報告
jar 從當(dāng)前項目構(gòu)建 JAR 文件
war 從當(dāng)前項目構(gòu)建 WAR 文件
javadoc 產(chǎn)生用于該項目的 Javadoc
antrun 從構(gòu)建所述的任何階段運行一組 Ant 任務(wù)

插件使用

用戶可以通過兩種方式調(diào)用Maven插件目標(biāo)。

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

例如Maven默認(rèn)將maven-compiler-plugin的compile目標(biāo)與compile生命周期階段綁定,因此命令mvn compile實際上是先定位到compile這一生命周期階段,然后再根據(jù)綁定關(guān)系調(diào)用maven-compiler-plugin的compile目標(biāo)。

第二種方式是直接在命令行指定要執(zhí)行的插件目標(biāo)。

例如mvn archetype:generate 就表示調(diào)用maven-archetype-plugin的generate目標(biāo),這種帶冒號的調(diào)用方式與生命周期無關(guān)。

插件

  • maven-jar-plugin

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

  • maven-antrun-plugin

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

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

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

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

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

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

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

  • 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目標(biāo)可以直接在命令行調(diào)用,也可以被綁定至生命周期

  • maven-dependency-plugin

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

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

    dependency:tree能進(jìn)一步的描繪項目依賴樹

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

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

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

  • maven-enforcer-plugin

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

例如給項目引入了外部的SNAPSHOT依賴而導(dǎo)致構(gòu)建不穩(wěn)定,使用了一個與大家不一致的Maven版本而經(jīng)常抱怨構(gòu)建出現(xiàn)詭異問題。

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

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

除了標(biāo)準(zhǔn)的規(guī)則之外,你還可以擴(kuò)展該插件,編寫自己的規(guī)則。maven-enforcer-plugin的enforce目標(biāo)負(fù)責(zé)檢查規(guī)則,它默認(rèn)綁定到生命周期的validate階段。

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

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

    有效settings同理,特別是當(dāng)你發(fā)現(xiàn)自己配置的settings.xml沒有生效時,就可以用help:effective-settings來驗證。

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

  • maven-release-plugin

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

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

    release:perform則是簽出標(biāo)簽中的RELEASE源碼,構(gòu)建并發(fā)布。版本發(fā)布是非?,嵥榈墓ぷ鳎婕傲烁鞣N檢查,而且由于該工作僅僅是偶爾需要,因此手動操作很容易遺漏一些細(xì)節(jié)。

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

  • 默認(rèn)的編譯插件maven-compiler-plugin
  • 默認(rèn)的打包插件maven-jar-plugin

例子

它支持各種打包文件格式,包括zip、tar.gz、tar.bz2等等,通過一個打包描述文件(該例中是src/main/assembly.xml),它能夠幫助用戶選擇具體打包哪些文件集合、依賴、模塊、和甚至本地倉庫文件,每個項的具體打包路徑用戶也能自由控制。如下就是對應(yīng)上述需求的打包描述文件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使用打包描述文件,并綁定生命周期階段使其自動執(zhí)行打包操作:

默認(rèn)情況下,maven-assembly-plugin內(nèi)置了幾個可以用的assembly descriptor:

  • bin : 類似于默認(rèn)打包,會將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, 區(qū)別是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>
                <!-- 表示復(fù)制的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>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容