主頁 > 後端開發 > 常用 Maven 插件大全(速度收藏)

常用 Maven 插件大全(速度收藏)

2020-09-13 05:52:22 後端開發

我們都知道Maven本質上是一個插件框架,它的核心并不執行任何具體的構建任務,所有這些任務都交給插件來完成,例如編譯源代碼是由maven- compiler-plugin完成的,

進一步說,每個任務對應了一個插件目標(goal),每個插件會有一個或者多個目標,例如maven- compiler-plugin的compile目標用來編譯位于src/main/java/目錄下的主原始碼,testCompile目標用來編譯位于src/test/java/目錄下的測驗原始碼,

用戶可以通過兩種方式呼叫Maven插件目標,第一種方式是將插件目標與生命周期階段(lifecycle phase)系結,這樣用戶在命令列只是輸入生命周期階段而已,例如Maven默認將maven-compiler-plugin的compile目標與 compile生命周期階段系結,因此命令mvn compile實際上是先定位到compile這一生命周期階段,然后再根據系結關系呼叫maven-compiler-plugin的compile目標,

第二種方式是直接在命令列指定要執行的插件目標,例如mvn archetype:generate 就表示呼叫maven-archetype-plugin的generate目標,這種帶冒號的呼叫方式與生命周期無關,

認識上述Maven插件的基本概念能幫助你理解Maven的作業機制,不過要想更高效率地使用Maven,了解一些常用的插件還是很有必要的,這可 以幫助你避免一不小心重新發明輪子,關于系列 Maven 教程,可以關注公眾號Java技術堆疊回復Maven獲取,

多年來Maven社區積累了大量的經驗,并隨之形成了一個成熟的插件生態圈,Maven官方有兩個插件串列,第一個列 表的GroupId為org.apache.maven.plugins,這里的插件最為成熟,具體地址為:http://maven.apache.org/plugins/index.html,第二個串列的GroupId為org.codehaus.mojo,這里的插件沒有那么核心,但也有不少十分有用,其地址為:http://mojo.codehaus.org/plugins.html,

接下來筆者根據自己的經驗介紹一些最常用的Maven插件,在不同的環境下它們各自都有其出色的表現,熟練地使用它們能讓你的日常構建作業事半功倍,

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目標通常與生命周期系結運行,

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

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目標可以直接在命令列呼叫,也可以被系結至生命周期,關于系列 Maven 教程,可以關注公眾號Java技術堆疊回復Maven獲取,

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倉庫復制到某個特定的檔案夾下面,

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階段,

maven-help-plugin

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

maven-help-plugin是一個小巧的輔助工具,最簡單的help:system可以列印所有可用的環境變數和Java系統屬性,help:effective-pomhelp: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

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

maven-release-plugin的用途是幫助自動化專案版本發布,它依賴于POM中的SCM資訊,30 個常用的 Maven 命令,這篇推薦大家看一下,

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

release:perform則 是簽出標簽中的RELEASE原始碼,構建并發布,版本發布是非常瑣碎的作業,它涉及了各種檢查,而且由于該作業僅僅是偶爾需要,因此手動操作很容易遺漏一 些細節,maven-release-plugin讓該作業變得非常快速簡便,不易出錯,maven-release-plugin的各種目標通常直接在 命令列呼叫,因為版本發布顯然不是日常構建生命周期的一部分,

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傳入屬性的值,以實作更為靈活的構建,

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引數實作的,

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到遠程倉庫,

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 以查看運行效果,

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加入,

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 進行撤銷,

小結

本文介紹了一些最常用的Maven插件,這里指的“常用”是指經常需要進行配置的插件,事實上我們用Maven的時候很多其它插件也是必須的,例如 默認的編譯插件maven-compiler-plugin和默認的打包插件maven-jar-plugin,但因為很少需要對它們進行配置,因此不在 本文討論范圍,

了解常用的Maven插件能幫助你事倍功半地完成專案構建任務,反之你就可能會因為經常遇到一些難以解決的問題而感到沮喪,本文介紹的插件 基本能覆寫大部分Maven用戶的日常使用需要,如果你真有非常特殊的需求,自行撰寫一個Maven插件也不是難事,更何況還有這么多開放源代碼的插件供 你參考,

本文的這個插件串列并不是一個完整串列,讀者有興趣的話也可以去仔細瀏覽一下Apache和Codehaus Mojo的Maven插件串列,以的到一個更為全面的認識,最后,在線的Maven倉庫搜索引擎如http://search.maven.org/也能幫助你快速找到自己感興趣的Maven插件,

來源博客園:種菜得瓜

地址:www.cnblogs.com/crazy-fox/

推薦去我的博客閱讀更多:

1.Java JVM、集合、多執行緒、新特性系列教程

2.Spring MVC、Spring Boot、Spring Cloud 系列教程

3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

4.Java、后端、架構、阿里巴巴等大廠最新面試題

覺得不錯,別忘了點贊+轉發哦!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/20868.html

標籤:Java

上一篇:java如果處理MySQL5.7拋出類似內容過長自動截斷,int欄位空串時自動轉為0等例外

下一篇:遇到一個問題,怎么在java后臺將一個圖片復制到另一個服務器中

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more