天天看點

你不得不了解的Maven知識(下)

一、前言

maven的使用将建構項目與添加項目依賴等操作變得更加簡單,如果安裝Maven、配置Maven環境變量、修改Maven為阿裡雲遠端倉庫位址可以參看我上一篇部落格,更多文章可關注微信公衆号【為碼以夢】

https://blog.csdn.net/chen15369337607/article/details/107030961

二、Maven倉庫

在上篇文章中我們介紹了Maven倉庫分為三種:本地倉庫(local)、遠端(remote)和中央倉庫(central)這三種,下面介紹一下這三種倉庫的差別;

1)本地倉庫:Maven 的本地倉庫,在安裝 Maven 後并不會建立,它是在第一次執行 maven 指令的時候才被建立。運作 Maven 的時候,Maven 所需要的任何構件都是直接從本地倉庫擷取的。如果本地倉庫沒有,它會首先嘗試從遠端倉庫下載下傳構件至本地倉庫,然後再使用本地倉庫的構件。預設情況下,不管Linux還是 Windows,每個使用者在自己的使用者目錄下都有一個路徑名為 .m2/respository/ 的倉庫目錄。Maven 本地倉庫預設被建立在 %USER_HOME% 目錄下。要修改預設位置,在 %M2_HOME%\conf 目錄中的 Maven 的 settings.xml 檔案中定義另一個路徑。(如何修改預設本地倉庫位址和如何修改遠端倉庫位址請參考上篇文章)

https://blog.csdn.net/chen15369337607/article/details/107030961

構件:在 Maven 中,任何一個依賴、插件或者項目建構的輸出,都可以稱之為構件。

2)中央倉庫:Maven 中央倉庫是由 Maven 社群提供的倉庫,其中包含了大量常用的庫。中央倉庫包含了絕大多數流行的開源Java構件,以及源碼、作者資訊、SCM、資訊、許可證資訊等。一般來說,簡單的Java項目依賴的構件都可以在這裡下載下傳到。中央倉庫是由 Maven 社群管理不需要配置同時需要通過網絡才能通路。要浏覽中央倉庫的内容,maven 社群提供了一個 URL:http://search.maven.org/#browse。使用這個倉庫,開發人員可以搜尋所有可以擷取的代碼庫。

3)遠端倉庫:如果 Maven 在中央倉庫中也找不到依賴的檔案,它會停止建構過程并輸出錯誤資訊到控制台。為避免這種情況,Maven 提供了遠端倉庫的概念,它是開發人員自己定制倉庫,包含了所需要的代碼庫或者其他工程中用到的 jar 檔案。

舉例說明,使用下面的 pom.xml,Maven 将從遠端倉庫中下載下傳該 pom.xml 中聲明的所依賴的(在中央倉庫中擷取不到的)檔案。

<project xmlns="http://maven.apache.org/POM/4.0.0"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.companyname.projectgroup</groupId>
   <artifactId>project</artifactId>
   <version>1.0</version>
   <dependencies>
      <dependency>
         <groupId>com.companyname.common-lib</groupId>
         <artifactId>common-lib</artifactId>
         <version>1.0.0</version>
      </dependency>
   <dependencies>
   <repositories>
      <repository>
         <id>companyname.lib1</id>
         <url>http://download.companyname.org/maven2/lib1</url>
      </repository>
      <repository>
         <id>companyname.lib2</id>
         <url>http://download.companyname.org/maven2/lib2</url>
      </repository>
   </repositories>
</project>
           

三、Maven 依賴搜尋順序

當我們執行 Maven 建構指令時,Maven 開始按照以下順序查找依賴的庫:

步驟 1 - 在本地倉庫中搜尋,如果找不到,執行步驟 2,如果找到了則執行其他操作。

步驟 2 - 在中央倉庫中搜尋,如果找不到,并且有一個或多個遠端倉庫已經設定,則執行步驟 4,如果找到了則下載下傳到本地倉庫中以備将來引用。

步驟 3 - 如果遠端倉庫沒有被設定,Maven 将簡單的停滞處理并抛出錯誤(無法找到依賴的檔案)。

步驟 4 - 在一個或多個遠端倉庫中搜尋依賴的檔案,如果找到則下載下傳到本地倉庫以備将來引用,否則 Maven 将停止處理并抛出錯誤(無法找到依賴的檔案)。

四、Maven指令

maven 指令用mvn開頭代表是mvn指令,下面列舉一下常用的Maven 指令以及指令的作用;

1)【mvn -help】: help指令作用為擷取Maven的指令清單以及簡單作用解釋(英文的);

2)【mvn -v】: v指令為檢視安裝的Maven版本資訊,還包括Maven的安裝路徑,Java 的版本和路徑,作業系統類别以及作業系統編碼格式等等(我們在上一篇文章中也是通過使用 mvn -v指令來檢查我們的Maven 環境變量是否安裝無誤);

3)【mvn clean】: clean 指令是Maven中Clean生命周期中的一個階段指令,用來清除上一次建構生成的檔案;

4) 【mvn compile】 compile指令是Maven中Default(預設)生命周期中的一個階段指令,用來編譯項目;

5)【mvn package】 package指令也是Maven中Default(預設)生命周期中的一個階段指令,用來将項目打包,打包前會啟動項目的測試代碼以檢查程式是否能正常啟動;

6)【mvn install】 install指令也是Maven中Default(預設)生命周期中的一個階段指令,可以将打包成功的jar包安裝到本地倉庫,供其它項目使用;

通過mvn指令中的clean、compile、package就可以将你完成的項目按照pom檔案中配置的打包方式打包成可執行檔案啦!(一般打包成jar包可以直接通過java指令啟動或者war包通過web容器啟動,如tomcat);剛才在介紹指令的時候說到了Maven的生命周期,下面給大家做個詳細介紹。

五、Maven的生命周期

Maven 有以下三個标準的生命周期:clean:項目清理的處理、default(或 build):項目部署的處理、site:項目站點文檔建立的處理

1)Clean 生命周期

當我們執行 mvn post-clean 指令時,Maven 調用 clean 生命周期,它包含以下階段:

pre-clean:執行一些需要在clean之前完成的工作

clean:移除所有上一次建構生成的檔案

post-clean:執行一些需要在clean之後立刻完成的工作

2)Default (Build) 生命周期

這是 Maven 的主要生命周期,被用于建構應用,包括下面的 23 個階段:

validate(校驗):校驗項目是否正确并且所有必要的資訊可以完成項目的建構過程。

initialize(初始化):初始化建構狀态,比如設定屬性值。

generate-sources(生成源代碼):生成包含在編譯階段中的任何源代碼。

process-sources(處理源代碼):處理源代碼,比如說,過濾任意值。

generate-resources(生成資源檔案):生成将會包含在項目包中的資源檔案。

process-resources (處理資源檔案):複制和處理資源到目标目錄,為打包階段最好準備。

compile(編譯):編譯項目的源代碼。

process-classes(處理類檔案):處理編譯生成的檔案,比如說對Java class檔案做位元組碼改善優化。

generate-test-sources(生成測試源代碼):生成包含在編譯階段中的任何測試源代碼。

process-test-sources(處理測試源代碼):處理測試源代碼,比如說,過濾任意值。

generate-test-resources(生成測試資源檔案):為測試建立資源檔案。

process-test-resources(處理測試資源檔案):複制和處理測試資源到目标目錄。

test-compile(編譯測試源碼):編譯測試源代碼到測試目标目錄.

process-test-classes(處理測試類檔案):處理測試源碼編譯生成的檔案。

test(測試):使用合适的單元測試架構運作測試(Juint是其中之一)。

prepare-package(準備打包):在實際打包之前,執行任何的必要的操作為打包做準備。

package(打包):将編譯後的代碼打包成可分發格式的檔案,比如JAR、WAR或者EAR檔案。

pre-integration-test(內建測試前):在執行內建測試前進行必要的動作。比如說,搭建需要的環境。

integration-test(內建測試):處理和部署項目到可以運作內建測試環境中。

post-integration-test(內建測試後):在執行內建測試完成後進行必要的動作。比如說,清理內建測試環境

verify (驗證):運作任意的檢查來驗證項目包有效且達到品質标準。

install(安裝):安裝項目包到本地倉庫,這樣項目包可以用作其他本地項目的依賴

deploy(部署):将最終的項目包複制到遠端倉庫中與其他開發者和項目共享。

3)Site 生命周期

Maven Site 插件一般用來建立新的報告文檔、部署站點等。

pre-site:執行一些需要在生成站點文檔之前完成的工作

site:生成項目的站點文檔

post-site:執行一些需要在生成站點文檔之後完成的工作,并且為部署做準備

site-deploy:将生成的站點文檔部署到特定的伺服器上

Maven包括的這三個标準生命周期中,其中clean和預設生命周期是開發中最常使用的,而Site生命周期一般可能項目經理比較感興趣,可以生成項目站點,包括依賴資訊,開發人員資訊,版本資訊等等,開發中一般不用;

當執行【mvn compile】指令時,這裡的compile是build生命周期中的一個階段,它會預設執行在compile階段之前的所有階段如validate、initialize、generate-sources、process-sources、generate-resources、process-resources一直到最後執行compile編譯程式。如果執行【mvn package】,則在package階段之前的所有階段預設都會執行;但是不同生命周期的階段不受影響,也就是當我們執行package指令時,并不會執行Clean生命周期中的三個階段;當然我們也可以同時執行不同生命周期中的不同階段指令如【mvn clean package】這種形式,注意先後順序即可。

五、Maven中的插件

當我們執行mvn clean指令時,真正幫我們實作清除target目錄的所有生成建構其實是通過插件來完成的,Maven的生命周期是抽象的,實際需要插件來完成任務,這一過程是通過将插件的目标(goal)綁定到生命周期的具體階段(phase)來完成的。如:将maven-compiler-plugin插件的compile目标綁定到default生命周期的compile階段,完成項目的源代碼編譯:注意所有Maven的pom檔案都繼承于一個超父pom檔案,不管你有沒有顯示聲明這個父檔案,當你在子pom檔案中聲明了和父插件一樣的插件以後,将會覆寫父插件的屬性。一個插件通常可以完成多個任務,每一個任務就叫做插件的一個目标。如執行mvn install指令時,調用的插件和執行的插件目标如下:

你不得不了解的Maven知識(下)
你不得不了解的Maven知識(下)

Maven對一些生命周期的階段(phase)預設綁定了插件目标,因為不同的項目有jar、war、pom等不同的打包方式,是以對應的有不同的綁定關系,其中針對default生命周期的jar包打包方式的綁定關系如下:

你不得不了解的Maven知識(下)

使用者可以根據需要将任何插件目标綁定到任何生命周期的階段,如:将maven-source-plugin的jar-no-fork目标綁定到default生命周期的package階段,這樣,以後在執行mvn package指令打包項目時,在package階段之後會執行源代碼打包,生成如:ehcache-core-2.5.0-sources.jar形式的源碼包。

當然我們也可以通過插件來跳過階段,如當我們執行【mvn package】指令時,也會執行Test階段啟動程式來檢查程式是否能夠正常啟動,但有的時候我們不想在打包程式的時候執行測試階段,而是跳過他,那麼我們就可以通過插件來(當然我們也可以通過其它的方式跳過測試,插件的方式隻是其中一種,另外的方式在後面的文章中進行介紹),如下:

<!-- maven 打包時跳過測試 -->
 <plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-surefire-plugin</artifactId>
     <configuration>
          <skip>true</skip>
      </configuration>
  </plugin>
           

六、一個簡單的pom檔案

以下Pom檔案為建立一個SpringBoot項目生成的預設檔案:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <!-- 簡單說一下每個部分的作用 -->

    <!--繼承的父pom -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.zlc</groupId>
    <artifactId>springbootdemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springbootdemo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>

    <!-- 項目依賴-->
    <!-- 一個查詢依賴的網址: https://mvnrepository.com/-->
    <dependencies>
        <!-- web依賴-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- lombok依賴 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--單元測試依賴-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <!-- Maven插件-->
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
           

七、Maven檔案參考大全

可關注微信公衆号【為碼以夢】回複【Maven】擷取PDF檔案

你不得不了解的Maven知識(下)

八、微信公衆号【為碼以夢】

你不得不了解的Maven知識(下)