Maven核心概念和平常實踐

1、Maven

1.1 爲何寫Maven

工欲善其事,必先利其器。現在Java相關開發,基本離不開Maven、Gradle、MAT、Hudson之類的玩意,因此把本文看成工具篇吧,後續有空再整理其餘工具。java

1.2 概述

Maven是優秀的構建工具,但不只僅是能構建,還有着強大的倉庫管理、項目管理相關的功能。我這介紹這一句話,像詳細瞭解它的全部描述或者構建工具的介紹,請自行百度谷歌或參考官網。spring

1.3 安裝

依賴JDK:下載JDK的壓縮包,解壓,配置環境變量JAVA_HOME=安裝目錄、PATH=$JAVA_HOME/bin:$PATH 即完成。
安裝Maven:一樣下載Maven的壓縮包,解壓,配置MAVEN_HOME=安裝目錄、PATH=$MAVEN_HOME/bin:$PATH 即完成。
檢查JDK : java -version 。 檢查Maven: mvn -version。
安裝後須要瞭解的是:Maven項目最核心就是pom.xml文件(建立項目後纔有),須要在項目中配置的就是配置在pom文件中,還有少數全局配置是配置在maven安裝目錄中conf下的setting.xml中。apache

1.4 經常使用Maven網站

注:國內鏡像也有好些,能夠本身找。由於周邊大多數人都用了開源中國的鏡像,因此我這邊也推薦它。ui

1.5 建立Maven項目

(1)瞭解建立符合maven規範的項目結構,即src/main/java、src/main/resources那套。
(2)建立pom.xml文件。
(3)命令行能夠經過Archetype命令生成項目骨架。Eclipse等IDE集成Maven後也能夠建立Maven項目(推薦!!! )。
(4)經常使用命令
圖片描述url

1.6 Pom文件變量屬性

maven定義了不少變量,常見的maven屬性,瞭解下本身可用,閱讀其餘項目的時候可看懂。
${basedir} 項目根目錄
${project.name}項目名
${project.version}項目版本號
${project.groupId}項目groupId
${project.build.directory} target目錄
${project.build.finalName} 打包的名字spa

2、依賴管理

2.1 概述

經過在pom.xml配置依賴座標,Maven會自動幫咱們下載依賴的構件。
Maven的依賴主要是經過groupId、artifactId和version三者一塊兒來肯定一個構件的座標。

2.2 例子

<dependencies>
    <dependency>
        <groupId>junit</groupId>         <!-- groupId 公司和組織的標識 -->
        <artifactId>junit</artifactId>   <!-- artifactId 項目或者模塊ID,在該groupID下必須惟一 -->
        <version>4.10</version>          <!-- version 版本號,帶SNAPSHOT爲快照版本 -->
        <scope>test</scope>              <!-- scope 依賴範圍,默認爲compile -->
        <exclusions>                     <!-- exclusions 用來排除傳遞性依賴 -->
           <exclusion>                   <!-- exclusions指定排除的依賴的groupId和artifactId -->
           ....
           </exclusion>
        </exclusions>
    </dependency>
<dependencies>

圖片描述

2.3 關於dependencyManagement

這個標籤主要起到依賴統一管理的做用。通常maven開發多個項目的時候,都會建立一個parent父模塊來配置pom文件統一管理公用的東西,(下面聚合和繼承就是講這部分)。在dependencyManagement下也是經過在dependencies標籤下配置依賴的,但它上面在dependencies標籤配置不一樣。

不一樣之處是:在dependencyManagement中配置了,項目並不會直接下載依賴的構件,而是要在子模塊或者當前模塊的dependencies中進行配置,代表當前模塊須要用到的依賴,但此時就不用再指定版本號了。dependencyManagement也是以此來確保各個模塊對相同構件能夠用同一版本,也就利於統一升級版本號等等。

<dependencyManagement> <!-- 能夠把它當作構件的版本聲明,並不會引起下載 -->
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>3.2.5.RELEASE</version>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependencies>    <!-- 必須配置它纔會進行依賴下載 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
    </dependency>
</dependencies>

3、倉庫

3.1 本地倉庫

本地倉庫沒啥好說的,在maven安裝目錄下的conf/setting.xml中配置localRepository就能夠指定路徑。默認路徑則是在用戶根目錄下的.m2/repository。
做用:maven編譯模塊的時候,依賴的模塊都會按照本地->遠程(通常是私服)->中央的順序依次查找構件。日常開發的模塊也是經過mvn install安裝到本地倉庫,其餘編譯時才能使用;而若是跟其餘人合做開發則要經過deploy發佈到遠程倉庫。發佈後,別人下載依賴也會將經過遠程或者中央倉庫下載來的構件保存到別人的本地倉庫。

<localRepository>D:\repository</localRepository>

3.2 遠程倉庫

通常在項目中,會在<repositories>標籤下配置遠程倉庫,能夠配置多個,但id必須惟一。中央倉庫默認的id爲central,能夠不用配置;但若是有其餘倉庫用這個id,則會覆蓋中央倉庫。(不過,像通常公司都會本身搭建私服,因此也能夠把central覆蓋成咱們私服的倉庫,咱們也這樣作)。
在pom.xml中配置遠程倉庫的例子以下:

<repositories>
     <repository>
         <id>repo.springsource.org</id>
         <name>repo.springsource.org-releases</name>
         <url>http://repo.springsource.org/libs-milestone-local</url>
         <snapshots>
             <enabled>false</enabled>
         </snapshots>
    </repository>
    <repository>
        <id>nexus</id>   <!-- 私服倉庫 -->
        <name>TeamNexusRepository</name>
        <url>http://localhost:8081/nexus/content/groups/public</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
        <layout>default</layout>
    </repository>
    ...
</repositories>

另外還能夠指定插件的倉庫:

<pluginRepositories> 
    <pluginRepository> 
        <id>nexus</id>
        <name>TeamNexusRepository</name>
        <url>http://localhost:8081/nexus/content/groups/public</url> 
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </pluginRepository>
</pluginRepositories>

在pom.xml中配置的遠程倉庫,只會在pom文件對應的模塊有效,即便配置在parent的pom中用來被繼承,那也只是當前項目各個模塊有效。若是多個項目實際上都想用同樣的遠程倉庫(實際場景就是私服),那須要在setting.xml中利用profile來進行配置。
在setting.xml中配置遠程倉庫的例子以下:

<profiles>
    <profile>
      <id>nexus</id>
      <repositories>
        <repository>
          <id>central</id>
          <url>http://localhost:8081/nexus/content/groups/public/</url>
        </repository>
      </repositories>
      <pluginRepositories>
        <pluginRepository>
          <id>central</id>
          <url>http://localhost:8081/nexus/content/groups/public/</url>
        </pluginRepository>
      </pluginRepositories>
    </profile>
</profiles>

<activeProfiles> <!-- 激活profile -->
    <activeProfile>nexus</activeProfile>
</activeProfiles>

3.3 倉庫鏡像

除了以上配置以外,咱們還能夠在setting.xml裏面配置倉庫的鏡像,通常用於當訪問某個倉庫的時候,可能因爲網絡不一樣或者其餘緣由須要轉換到另一個地址,這個時候就能夠配置這個倉庫的鏡像。例如你想覆蓋中央倉庫的默認地址,能夠在setting.xml裏面這樣配置:

<mirrors>     
     <mirror>     
       <id>maven-net-cn</id>     
       <name>MavenChinaMirror</name>     
       <url>http://maven.net.cn/content/groups/public/</url>     
       <mirrorOf>central</mirrorOf>     
     </mirror>     
</mirrors>

這裏經過<mirrorOf>標籤指定爲central倉庫作鏡像,就是訪問central的url再也不是國外那個地址,而會被轉爲咱們配置的鏡像地址http://maven.net.cn/content/groups/public/ (也能夠配置爲私服地址等等), 而若是想爲全部的倉庫作鏡像那麼能夠改成 <mirrorOf>*</mirrorOf>。
在個人項目中,因爲通常會把central設置爲咱們的私服倉庫,因此大部分狀況下也就不用配置鏡像了。若是確實有多個倉庫的話,那確實能夠用<mirrorOf>*</mirrorOf>的方式指向私服。

3.4 發佈到倉庫

<distributionManagement>
    <repository>
        <id>nexus</id>
        <name>releases</name>
        <url>http://localhost:8081/nexus/content/groups/public/</url>
    </repository>
    <snapshotRepository>
        <id>nexus</id>
        <name>snapshots</name>
        <url>http://localhost:8081/nexus/content/groups/public/</url>
    </snapshotRepository>
</distributionManagement>

4、插件

4.1 概述

4.2 生命週期

4.3 常見插件

4.4 例子

4.5 關於pluginManagement

這個標籤跟dependencyManagement標籤同樣,也是爲了起到統一管理的做用,只是它統一管理了插件。跟依賴管理同樣,通常也會在parent父模塊來配置pom來配置pluginManagement,統一描述好插件以後,在子模塊中就不用完整的配置插件已經綁定的生命週期和執行目標等等,只須要指定插件的groupId 和 artifactId就能夠完成插件的引用。下面給出例子。
父模塊(parent模塊)的pom.xml中配置:

<build>
    <pluginManagement>
        <plugins>
           <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-source-plugin</artifactId>
              <version>2.4</version>
              <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>jar-no-fork</goal>
                    </goals>
                </execution>
              </executions>
            </plugin>
          </plugins>
    </pluginManagement>
    <!-- 若是父模塊這裏配置的話,則全部子模塊都會引用該插件!!因此通常只用於通用插件。
    <plugins>  
       <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-source-plugin</artifactId>
       </plugin>
    </plugins>
    -->
</build>

其餘子模塊須要單獨引用插件的,能夠在pom.xml中配置:

<build>
    <plugins>
       <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-source-plugin</artifactId>
       </plugin>
    </plugins>
</build>

5、聚合和繼承

5.1 繼承

先說繼承吧,其實繼承就是爲了抽出相同的東西,而後給項目的其餘模塊一塊兒共用,而不用每一個模塊的pom.xml文件都寫不少重複的東西。若是光說重複的工做量也就算了,有個重點是相似spring-core這種多個模塊均可能用到的依賴,若是每一個模塊都本身配置本身的依賴和版本好,那很容易就會犯錯或者依賴的版本不一致致使錯誤等等。所以,在拆分多模塊開發的時候,儘可能考慮使用繼承。

如何使用Maven繼承呢?
(1)創建一個文件夾,只建立一個pom.xml文件便可。
(2)而後把各個模塊通用的東西寫到這個pom.xml中,如屬性定義,工廠定義,依賴座標定義等等。
(3)把這個pom.xml中的<packaging>的值設置爲pom。
(4)在各個子模塊中使用<parent>標籤指明本身使用的父項目。

關於父模塊的依賴配置注意兩點:
(1)通常都是經過<dependencyManagement>來配置全部依賴及其版本號,而後子模塊,在本身的pom文件中聲明依賴便可,不用再指定版本,以確保統一。
(2)父項目中何時直接配置<dependencies>呢?就是肯定每一個子模塊基本都會用的依賴,統一配置,不用每一個子模塊再單獨去配的,好比junit、log4j這種。

5.2 聚合

聚合的做用在於能夠把一個項目的多個模塊一塊兒配置,這樣能夠一次性編譯、安裝和發佈多個模塊。
通常項目都會把聚合和繼承都會放到同一個pom.xml文件進行管理。

如何使用Maven聚合呢?
(1)創建一個文件夾,只建立一個pom.xml文件。
(2)而後在這個pom.xml文件中,把這個pom.xml中的<packaging>的值設置爲pom和配置<modules>標籤便可。

若是其餘模塊跟父pom.xml是同一層的話,以下圖:
圖片描述
則模塊的配置方式爲:

<modules>
    <module>hello-world</module>
    <module>hello-spring</module>
</modules>

6、插件開發

待更新

相關文章
相關標籤/搜索