Maven的build生命週期和經常使用plugin

簡介

Maven和gradle應該是現代java程序員中使用的最多的兩種構建工具。在它們出現以前,則是ant的天下。java

Maven爲咱們封裝了不少構建中很是有用的操做,咱們只須要執行簡單的幾個mvn命令便可。git

今天咱們要討論一下mvn命令之下的生命週期的構建。程序員

更多精彩內容且看:github

更多內容請訪問 www.flydean.com

lifecycle和Phases

所謂lifecycle,能夠理解爲能夠執行一組命令的集合,用來執行具體的某些操做。apache

Maven默認有三種lifecycle:default,clean和site。default主要用來處理項目的開發,clean主要用來負責項目的清理,site主要用來生成項目的文檔。api

lifecycle是由一個或者多個phase組成的。maven

以default爲例,它大概由23個phases組成,這些phases將會按順序執行來完成default的lifecycle。工具

咱們選取default lifecycle中很是常見的幾個phase來講明一下:單元測試

  • validate - 用來驗證項目是否正確或者項目所須要的信息是否可用。
  • compile - 用來編譯項目代碼
  • test - 執行代碼中的單元測試
  • package - 將編譯後的代碼進行打包,打包可有不少種方式,好比:jar,war等
  • verify - 執行集成測試
  • install - 將項目安裝到本地倉庫中,供有依賴關係的其餘項目使用
  • deploy - 將項目部署到遠程倉庫,以便共享給其餘的用戶

上面的phase執行是有順序的,好比咱們若是執行mvn verify,則會順序執行validate,compile,test和package。區塊鏈

Phases和Goals

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。

經常使用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是和相應的phase相關聯的,在上面的例子中,咱們將copy-dependencies和package相關聯,則在咱們執行mvn package的時候就會自動執行copy-dependencies,從配置文件能夠知道,咱們將會把項目的依賴jar包拷貝到項目的build目錄的lib目錄下。

maven-jar-plugin

有了依賴的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的博客

歡迎關注個人公衆號:程序那些事,更多精彩等着您!

相關文章
相關標籤/搜索