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
例子
-
maven-assembly-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>