Maven和gradle應該是現代java程序員中使用的最多的兩種構建工具。在它們出現以前,則是ant的天下。java
Maven爲咱們封裝了不少構建中很是有用的操做,咱們只須要執行簡單的幾個mvn命令便可。git
今天咱們要討論一下mvn命令之下的生命週期的構建。程序員
更多精彩內容且看:github
更多內容請訪問 www.flydean.com
所謂lifecycle,能夠理解爲能夠執行一組命令的集合,用來執行具體的某些操做。apache
Maven默認有三種lifecycle:default,clean和site。default主要用來處理項目的開發,clean主要用來負責項目的清理,site主要用來生成項目的文檔。api
lifecycle是由一個或者多個phase組成的。maven
以default爲例,它大概由23個phases組成,這些phases將會按順序執行來完成default的lifecycle。工具
咱們選取default lifecycle中很是常見的幾個phase來講明一下:單元測試
上面的phase執行是有順序的,好比咱們若是執行mvn verify,則會順序執行validate,compile,test和package。區塊鏈
Phases是一種任務的集合,它是由一個或者多個Goals組成的。Goals能夠包含在Phases裏面執行,也能夠單獨用命令執行。
那麼Goals又是從哪裏來的呢?Goals是定義在maven中的plugin中的。
咱們看下面一張直觀的圖:
下圖列出了現有lifecycle中的phase,和相應phase所對應的plugin。
咱們能夠看到基本每一個phase都和一個plugin中的golas是相對於應的。
除了使用命名直接指定要執行的phase之外,還能夠直接指定goals:
mvn clean dependency:copy-dependencies package
上面的命令中clean和package是phase,而copy-dependencies則是goals。
這裏咱們介紹兩個很是經常使用的maven plugin,maven-dependency-plugin和maven-jar-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是和相應的phase相關聯的,在上面的例子中,咱們將copy-dependencies和package相關聯,則在咱們執行mvn package的時候就會自動執行copy-dependencies,從配置文件能夠知道,咱們將會把項目的依賴jar包拷貝到項目的build目錄的lib目錄下。
有了依賴的lib,能夠將main程序打包成爲一個可執行的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>
爲了生成可執行的jar包,咱們須要在MANIFEST.MF文件中添加mainClass文件的路徑,這樣在執行jar包的時候,無需額外的參數便可運行。
遺憾的是,若是咱們的class文件用到了外部jar包的依賴時候,jar包直接運行會出錯,由於找不到所依賴的jar包。
在介紹maven-dependency-plugin的時候,咱們已經把所用到的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的參數,咱們將打包好的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包的元數據,而且裏面添加了Class-Path和Main-Class文件,這時候執行運行jar包就能夠直接執行了。
本文介紹了maven構建時候的生命週期,並介紹了兩個常常會使用到的plugin。
本文的例子[https://github.com/ddean2009/
learn-java-base-9-to-20](https://github.com/ddean2009/...
本文做者:flydean程序那些事本文連接:http://www.flydean.com/apache-maven-lifecycle/
本文來源:flydean的博客
歡迎關注個人公衆號:程序那些事,更多精彩等着您!