Maven的pom文件那些事

pom.xml文件

<groupId>org.son.nexus</groupId>//項目隸屬的實際項目名
<artifactId>nexus-indexer</artifactId>//實際項目中的一個maven項目模塊名稱
<version>2.0.0</version>//版本號
<packaging>jar</packaging>//當前maven項目打包的方式,默認爲jar

以上的配置會得到一個<artifactId>-<version>.<packaging>格式的包//nexus-indexer-2.0.0.jarjava

<classifier>jdk7</classifier>//用於定義構建輸出的一些附屬的構建。classifier是不能直接定義的,只能存在附加的構件(插件)時,才能(必須)添加。在包名上也會有所提現(nexus-indexer-2.0.0-javadoc.jar)mysql

jar包在倉庫中的路徑規律:groupId/artifactId/version/groupId-versionandroid

依賴倉庫

groupId、artifactId、version爲基本座標spring

type爲依賴類型,默認爲jarsql

scope爲依賴範圍apache

compile:編譯,測試,運行三種classpath都有效服務器

test:只對測試有效框架

provided:編譯和測試有效maven

runtime:測試和運行有效ide

system:系統依賴,依賴的包是從計算機本地導入,與systemPath配合使用

<systemPath>${java.home}/lib/rt.jar</systemPath>

<scope>system</scope>

傳遞性依賴

maven默認就是支持的。

什麼是傳遞性依賴?

好比:如今要導入A.jar包,但A.jar有依賴於B.jar,在maven中就會默認導入B.jar,而不須要手動去導入。

scope最好設爲compile

傳遞性依賴存在一個問題:工程中存在兩個jar分別依賴的是B.jar的不一樣版本jar包,就會出現錯誤。

optional:可選依賴,true 不會傳遞,false會傳遞(默認)

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.10</version>
<optional>true</optional>
</dependency>

當其餘項目C依賴B項目時,mysql-connector-java的依賴不會發生傳遞給C

優勢:

減小衝突,不用的功能不傳遞

一個jar應該只有 一個職責原則

exclusions排除依賴

用於替換某個 依賴中的依賴包做用

<dependencies>
    <dependency>
        <groupId>com.juv</groupId>
        <artifactId>project-B</artifactId>
        <version>1.0.0</version>
        <exclusions>
            <exclusion>//能夠有多個
                <groupId>com.juv</groupId>
                <artifactId>project-C</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>com.juv</groupId>
        <artifactId>project-B</artifactId>
        <version>1.1.0</version>
    </dependency>
</dependencies>

該例子的意思:不想使用project-B中版本的project-C依賴包,而將其環衛1.1.0的project-C包

歸類依賴

場景:存在一羣版本號一致的依賴,想經過一個統一的配置,將其統一配置和修改

<properties>
    <spring>2.5.6</spring>
</properties>

調用方式

<version>${spring}</version>

部署至遠程倉庫

修改工程中的pom文件

<project>
    ....
    <distributionManagement>
         <repository>  //發佈版本構件的倉庫
            <id></id>  //遠程倉庫的惟一標識
            <name></name>   //自定義
            <url></url>   //該倉庫地址
        </repository>
         <snapshotRepository>//快照版本的設置
            <id></id>
            <name></name>
            <url></url>   
        </snapshotRepository>
    </distributionManagement>
    ....
</project>

若是須要認證,則在setting.xml文件中增長一個<server>元素進行配置

在配置完成後,執行mvn clean deploy 就會根據當前版本類型,發佈到相應的倉庫中

快照版本

快照不是正式版本,當設爲帶有SNAPSHOT的version時,即爲快照版本,每次向倉庫部署是,會自動打上時間戳,其餘引用快照相同版本時會自動下載更新

例如:2.1-SNAPSHOT時,則會下載2.1-20091214之類的構件

在maven本地倉庫的groupId/artifactId/version文件路徑下會存在maven-metadata.xml文件,會記錄版本信息

<?xml version="1.0" encoding="UTF-8"?>
<metadata>
  <groupId>com.android.support</groupId>
  <artifactId>multidex</artifactId>
  <version>1.0.0</version>
  <versioning>
    <versions>
      <version>1.0.0</version>
      <version>1.0.1</version>
    </versions>
    <lastUpdated>20141209014044</lastUpdated>
  </versioning>
</metadata>

maven生命週期

maven的生命週期是抽象的,其實際行爲都是由插件來完成的。

maven的生命週期是不作任何實際工做,實際任務都由插件完成。

maven具備三個獨立的生命週期:clean、defeat、site

一、clean生命週期:清理項目,包含三個phase。

1)pre-clean:執行清理前須要完成的工做

2)clean:清理上一次構建生成的文件

3)post-clean:執行清理後須要完成的工做

二、default生命週期:構建項目,重要的phase以下。

1)validate:驗證工程是否正確,全部須要的資源是否可用。
2)compile:編譯項目的源代碼。
3)test:使用合適的單元測試框架來測試已編譯的源代碼。這些測試不須要已打包和佈署。
4)Package:把已編譯的代碼打包成可發佈的格式,好比jar。
5)integration-test:若有須要,將包處理和發佈到一個可以進行集成測試的環境。
6)verify:運行全部檢查,驗證包是否有效且達到質量標準。
7)install:把包安裝到maven本地倉庫,能夠被其餘工程做爲依賴來使用。
8)Deploy:在集成或者發佈環境下執行,將最終版本的包拷貝到遠程的repository,使得其餘的開發者或者工程能夠共享。

三、site生命週期:創建和發佈項目站點,phase以下

1)pre-site:生成項目站點以前須要完成的工做

2)site:生成項目站點文檔

3)post-site:生成項目站點以後須要完成的工做

4)site-deploy:將項目站點發布到服務器

命令行輸入:$mvn clean 其實調用的是clean生命週期的clean階段,執行了pre-clean和clean

而這些命令實際上是由插件提供功能的。

自定義綁定插件

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>//maven官方,官方的能夠省略該標籤
            <artifactId>maven-source-plugin</artifactId>//插件
            <version>2.1.1</version>//沒有version時,會默認下載最新的release版本
          <executions>//配置執行n個任務
                <execution>
                       <id>attach-sources</id>//能夠任意
                       <phase>verify</phase>//綁定到verify生命週期,在此時纔會起做用
                    <goals>
                           <goal>jar-no-fork</goal>//啓用該插件的jar-no-fork功能
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

由於一個插件可能存在多個功能,但咱們並不必定全部的功能都須要,因此設定goal標籤,表示咱們要實現的功能。

插件配置

命令行配置:$mvn install -Dt 插件相關參數 //適用於當每次運行時,這個插件的配置都會變的狀況

pom中全局配置:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
              <source>1.7</source>  //jdk1.7
              <target>1.7</target> //編譯後jdk1.7
            </configuration>
        </plugin>
    </plugins>
</build>

聚合(多模塊)

意義:一次構建全部想要構建的項目

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.son.nexus</groupId>
    <artifactId>nexus-indexer</artifactId>
    <version>2.0.0</version>
    <packaging>pom</packaging>//自己也是一個maven工程
    <modules>
          <module>account-email</module>//想要構建的項目,這裏寫的是當前pom文件下的相對路徑地址
        <module>account-persilist</module>
    </modules>
</project>

聚合pom文件的packaging標籤必定要是pom,其工程就只是一個pom文件,沒有其餘的實現代碼

通常來講模塊處的目錄名應與其artifactId一致

聚合模塊與其餘模塊的目錄結構並不是必定要父子關係

繼承

父pom

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.son.nexus</groupId>
    <artifactId>nexus-indexer</artifactId>
    <version>2.0.0</version>
    <packaging>pom</packaging>//自己也是一個maven工程
     <dependencies>
        <dependency>
            <groupId>com.juv</groupId>
            <artifactId>project-B</artifactId>
            <version>1.0.0</version>
            <exclusions>
                <exclusion>
                    <groupId>com.juv</groupId>
                    <artifactId>project-C</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.juv</groupId>
            <artifactId>project-B</artifactId>
            <version>1.1.0</version>
        </dependency>
    </dependencies>
</project>

父pom的packaging也是pom

子pom

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.son.nexus</groupId>
    <artifactId>nexus-B</artifactId>
    <version>2.0.0</version>
    <packaging>jar</packaging>
    <parent>
        <groupId>org.son.nexus</groupId>
        <artifactId>nexus-C</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>//相對路徑
    </parent>
</project>

子pom的packaging則不必定要是pom,但必定有parent標籤

子類的groupId和version也能夠繼承與父pom文件

<dependencyManagement>標籤

做用:當子類不須要父pom中的某些依賴的時,就可使用。

父pom

<dependencyManagement>
    <dependencies>
        <dependency>
            <artifactId>spring-core</artifactId>
            <groupId>org.springframework</groupId>
            <version>3.1.1.RELEASE</version>
        </dependency>
     </dependencies>
</dependencyManagement>

被<dependencyManagement>標籤所包裹的依賴是不會主動被加載進入子pom中,只有子pom中顯式再次聲明的時候纔會被依賴

子pom

<dependencies>
    <dependency>
        <artifactId>spring-core</artifactId>
        <groupId>org.springframework</groupId>
    </dependency>
</dependencies>

能夠省略version等其餘配置,由於父pom中已經配置過了

若想獲取父pom中全部的dependencyManagement中的構件配置,則在子pom中以下配置

<dependencyManagement>
    <dependencies>
        <dependency>
            <artifactId>account-parent</artifactId>
            <groupId>com.juvenxu.accout</groupId>
            <version>3.1.1.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
     </dependencies>
</dependencyManagement>

配置父pom的一些信息

插件管理

父pom中的插件不想在子類中默認使用

跟依賴管理同樣,被<pluginManagement>包裹的插件配置不會被子pom主動獲取,只有當子pom中聲明瞭該插件的groupId和artifactId後,纔會被繼承

一個pom文件既能夠是聚合也能夠是父pom

反應堆

在聚合構建時,構件模塊的前後順序的排列。

按書寫的前後順序進行構建

加料區

若是同一個項目中存在多個模塊相互依賴時候,version和groupId可使用${project.groupId}(當前模塊的groupId)和${project.verison},這樣就不用不斷的更改了。

<finalName>標籤用來肯定最終包名

  • 以上です(Ending)

  • ありがどう(Thank You)

相關文章
相關標籤/搜索