淺談Maven的build生命周期和常用plugin
簡介
Maven為我們封裝了很多構(gòu)建中非常有用的操作,我們只需要執(zhí)行簡單的幾個mvn命令即可。
今天我們要討論一下mvn命令之下的生命周期的構(gòu)建。
lifecycle和Phases
所謂lifecycle,可以理解為可以執(zhí)行一組命令的集合,用來執(zhí)行具體的某些操作。
Maven默認(rèn)有三種lifecycle:default,clean和site。default主要用來處理項目的開發(fā),clean主要用來負(fù)責(zé)項目的清理,site主要用來生成項目的文檔。
lifecycle是由一個或者多個phase組成的。
以default為例,它大概由23個phases組成,這些phases將會按順序執(zhí)行來完成default的lifecycle。
我們選取default lifecycle中非常常見的幾個phase來說明一下:
- validate - 用來驗證項目是否正確或者項目所需要的信息是否可用。
- compile - 用來編譯項目代碼
- test - 執(zhí)行代碼中的單元測試
- package - 將編譯后的代碼進行打包,打包可有很多種方式,比如:jar,war等
- verify - 執(zhí)行集成測試
- install - 將項目安裝到本地倉庫中,供有依賴關(guān)系的其他項目使用
- deploy - 將項目部署到遠(yuǎn)程倉庫,以便共享給其他的用戶
上面的phase執(zhí)行是有順序的,比如我們?nèi)绻麍?zhí)行mvn verify,則會順序執(zhí)行validate,compile,test和package。
Phases和Goals
Phases是一種任務(wù)的集合,它是由一個或者多個Goals組成的。Goals可以包含在Phases里面執(zhí)行,也可以單獨用命令執(zhí)行。
那么Goals又是從哪里來的呢?Goals是定義在maven中的plugin中的。
我們看下面一張直觀的圖:
下圖列出了現(xiàn)有l(wèi)ifecycle中的phase,和相應(yīng)phase所對應(yīng)的plugin。
我們可以看到基本每個phase都和一個plugin中的golas是相對于應(yīng)的。
除了使用命名直接指定要執(zhí)行的phase以外,還可以直接指定goals:
mvn clean dependency:copy-dependencies package
上面的命令中clean和package是phase,而copy-dependencies則是goals。
常用plugin介紹
這里我們介紹兩個非常常用的maven plugin,maven-dependency-plugin和maven-jar-plugin。
maven-dependency-plugin
maven中的依賴jar包是存放在maven的本地倉庫中的,如果項目中依賴了某些jar包,在部署的時候還需要這些依賴的jar包拷貝出來,非常不方便,有了maven-dependency-plugin,則可以借用它的copy-dependencies來將項目的依賴jar包拷貝出啦,如下所示:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.1.2</version> <executions> <execution> <id>copy</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory> ${project.build.directory}/lib </outputDirectory> </configuration> </execution> </executions> </plugin>
goals是和相應(yīng)的phase相關(guān)聯(lián)的,在上面的例子中,我們將copy-dependencies和package相關(guān)聯(lián),則在我們執(zhí)行mvn package的時候就會自動執(zhí)行copy-dependencies,從配置文件可以知道,我們將會把項目的依賴jar包拷貝到項目的build目錄的lib目錄下。
maven-jar-plugin
有了依賴的lib,可以將main程序打包成為一個可執(zhí)行的jar包。這時候我們就需要使用到maven-jar-plugin。
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.0</version> <configuration> <archive> <manifest> <mainClass>com.flydean.MavenClass</mainClass> </manifest> </archive> </configuration> </plugin>
為了生成可執(zhí)行的jar包,我們需要在MANIFEST.MF文件中添加mainClass文件的路徑,這樣在執(zhí)行jar包的時候,無需額外的參數(shù)即可運行。
遺憾的是,如果我們的class文件用到了外部jar包的依賴時候,jar包直接運行會出錯,因為找不到所依賴的jar包。
在介紹maven-dependency-plugin的時候,我們已經(jīng)把所用到的lib拷貝出來了,這里我們可以直接使用:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.0</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>com.flydean.MavenClass</mainClass> </manifest> </archive> </configuration> </plugin>
多加了兩個addClasspath的參數(shù),我們將打包好的jar包解壓縮。
可以看到里面多了一個MANIFEST.MF的文件:
Manifest-Version: 1.0
Created-By: Maven Jar Plugin 3.2.0
Build-Jdk-Spec: 14
Class-Path: lib/lombok-1.18.10.jar lib/logback-classic-1.2.3.jar lib/log
back-core-1.2.3.jar lib/slf4j-api-1.7.25.jar
Main-Class: com.flydean.MavenClass
這個文件里面包含了一些jar包的元數(shù)據(jù),并且里面添加了Class-Path和Main-Class文件,這時候執(zhí)行運行jar包就可以直接執(zhí)行了。
以上就是淺談Maven的build生命周期和常用plugin的詳細(xì)內(nèi)容,更多關(guān)于Maven的build生命周期和常用plugin的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java并發(fā)編程之CountDownLatch的使用
CountDownLatch是一個倒數(shù)的同步器,常用來讓一個線程等待其他N個線程執(zhí)行完成再繼續(xù)向下執(zhí)行,本文主要介紹了CountDownLatch的具體使用方法,感興趣的可以了解一下2023-05-05Java遠(yuǎn)程連接Linux服務(wù)器并執(zhí)行命令及上傳文件功能
這篇文章主要介紹了Java遠(yuǎn)程連接Linux服務(wù)器并執(zhí)行命令及上傳文件功能,本文是小編整理的代碼筆記,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-05-05基于HTTP協(xié)議實現(xiàn)簡單RPC框架的方法詳解
RPC全名(Remote?Procedure?Call),翻譯過來就是遠(yuǎn)程過程調(diào)用,本文將為大家介紹如何基于HTTP協(xié)議實現(xiàn)簡單RPC框架,感興趣的小伙伴可以了解一下2023-06-06SpringBoot2.0+阿里巴巴Sentinel動態(tài)限流實戰(zhàn)(附源碼)
這篇文章主要介紹了SpringBoot2.0+阿里巴巴Sentinel動態(tài)限流實戰(zhàn)(附源碼),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Springboot整合Druid實現(xiàn)對訪問的監(jiān)控方式
這篇文章主要介紹了Springboot整合Druid實現(xiàn)對訪問的監(jiān)控方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05