一小時教你學會 Maven 項目的構建與管理(2)

  • 2020 年 3 月 18 日
  • 筆記

Maven翻譯成中文是「專家、內行」。Maven是Apache組織中一個頗為成功的開源項目,Maven主要服務於基於Java平台的項目構建、依賴管理和項目信息管理的優秀工具。

—————–來自小馬哥的故事


四種 Maven 項目創建方式

手動方式構建

Maven項目由一個自己默認的配置,使用者不需要修改那些約定的內容,這就是「約定優於配置」,按照Maven項目目錄約定,手動創建各個文件夾即可,一般不會使用這種方式。

動態web的Maven項目的目錄約定如下圖所示:

命令行

本地磁盤建立一個空目錄C:/maven/hello,命令行進入到hello目錄,執行下面的命令 mvn archetype:generate -DgroupId=com.cloud.hellomaven -DartifactId=hellomaven-service -Dversion=1.0.0-SNAPSHOT -Dpackage=com.cloud.service

執行成功的話會自動在hello中創建符合maven項目約定的目錄結構。

說明

◆ archetype:generate:生成maven項目骨架。

◆ DgroupId指定maven坐標的groupId

◆ DartifactId指定maven坐標的artifactId

◆ Dversion指定maven坐標的version

◆ Dpackage指定maven項目的src下的包名

自動創建的maven項目結構如下:

Eclipse IDE

Eclipse提供了一個很好的插件m2eclipse無縫將Maven和Eclipse集成在一起,配置插件選擇本地maven目錄和配置文件setting.xml即可。

點擊Eclipse菜單欄File->New->Ohter->Maven,選擇Maven Project,一路默認Next,有一步需要填寫Group Id、Artifact Id、Version、選擇打包方式Package(jar、war、pom),選擇編譯環境即可。

完成後目錄結構如下:

Idea IDE

Idea IDE是一款很不錯的開發Maven項目的IDE,創建一個maven web項目的過程如下:

選擇File-New-Project,選擇Maven,勾選Create from archetype,選擇maven-archetype-webapp

點擊Next,填寫Group Id、Artifact Id、Version三項,

點擊Next,選擇Maven home,選擇setting file,

點擊Next,填寫Project name,選擇項目路徑即可,

Finish完成maven web項目創建。

Setting文件配置與POM 文件解析

Setting文件配置

配置用戶範圍和全局範圍的setting.xml

全局範圍: ${maven.conf}/settings.xml文件可以全局定製Maven的行為,對一台機器上的所有用戶有效。

用戶範圍: ${user.home}/.m2/settings.xml,只有當前用戶才會受到該配置影響,還便於Maven的升級,Maven升級新版本時不需要觸動該文件,推薦配置用戶範圍。

設置HTTP代理

公司網絡需要通過安全認證的代理訪問互聯網,這種情況下需要為Maven配置HTTP代理,才能正常訪問外部倉庫下載所需要的資源。

在settings.xml文件中添加代理配置。

 <proxies>      <proxy>        <id>myproxy</id>        <active>true</active>        <protocol>http</protocol>        <host>192.0.0.100</host>        <port>1234</port>        <username>xxxxx</username>        <password>xxxxx</password>        <nonProxyHosts>*.xxx.com|xxx.org</nonProxyHosts>      </proxy>   </proxies>

proxies下可以添加多個proxy節點,默認第一個active為true的會生效。

nonProxyHost表示不需要代理訪問的地址。中間的豎線分隔多個地址,此處可以使用星號作為通配符號。

遠程倉庫的認證

一些遠程倉庫出於安全考慮需要提供用戶名、密碼進行認證才能訪問,這時需要配置認證信息,認證信息必須配置到setting.xml文件中,只放在本機,其他成員不可見,在setting.xml文件中添加server配置,一個servers可以配置一個或者多個server,假設一個id為feiyue-repo的倉庫配置認證如下:

<servers>    <server>     <id>feiyue-repo</id>     <username>repo-username</username>     <password>repo-pwd</password>    </server>  </servers>

setting.xml文件中server元素的id必須與pom.xml文件中需要認證的repository元素的id完全一致。

鏡像

如果倉庫X可以提供倉庫Y存儲的所有內容,則X可以被稱為Y的一個鏡像。鏡像往往能夠提供比中央倉庫更快的服務,配置Maven使用鏡像來代替中央倉庫,編輯setting.xml文件。

<mirrors>   <mirror>        <id>jboss-public-repository-group</id>        <mirrorOf>central</mirrorOf>       <name>JBoss Public Repository Group</name>  <url>http://repository.jboss.org/nexus/content/groups/public</url>   </mirror>  </mirrors>

mirrorOf:值為central,表示該配置為中央倉庫的鏡像,任何對於中央倉庫的請求都會轉至該鏡像;

id:是遠程倉庫的唯一標識。

name:閱讀方便可自定義的名稱。

url:遠程倉庫的地址。

如果需要認證,基於該id配置倉庫認證。

mirrorOf取值如下

*:匹配所有遠程倉庫    external:*匹配所有遠程倉庫,使用localhost的除外,使用file://協議的除外,即匹配不在本機上的遠程倉庫;    rep1,rep2:匹配id=rep1和id=rep2的倉庫,使用逗號分隔多個遠程倉庫;    *,!rep2:匹配所有遠程倉庫,rep2除外,使用感嘆號將倉庫從匹配中排除。

POM文件常用配置解析

parent父項目配置

<parent>      <groupId>com.feiyue.parent</groupId>      <artifactId>feiyue-parent</artifactId>      <version>1.0-SNAPSHOT</version>      <relativePath>../pom.xml</relativePath>  </parent>

project根節點下配置parent節點指定繼承的父項目坐標,groupId、artifactId、version必選,唯一標識父項目,relativePath:可選,父項目的pom.xml文件的相對路徑,默認值是../pom.xml.

Maven首先在當前構建項目的地方尋找父項目的pom,其次在本地文件系統的relativePath位置,然後在本地倉庫,最後在遠程倉庫尋找父項目的pom.

dependency依賴配置

<dependency>  <groupId>xx</groupId>  <artifactId>yy</artifactId>  <version>x.x</version>  <scope> </scope>  <type></type>  <optional></optional>  <exclusions>    <exclusion></exclusion>  </exclusions>  </dependency>

groupId、artifactId、version必選,依賴的基本坐標,找到需要的依賴。

type:依賴的類型,對應於項目坐標中定義的packaging,該元素不必聲明默認為jar.

scope:依賴的範圍

Maven在編譯項目主代碼時使用一套classpath,主代碼中使用到的其他jar以依賴被引入到classpath中;Maven在編譯和執行測試的時候會使用另外一套classpath;實際運行Maven項目的時候,又會使用一套classpath。故Maven項目依賴範圍就是控制依賴於三種classpath(編譯classpath、測試classpath、運行classpath)的關係。

Maven依賴範圍有以下幾種

compile:編譯依賴範圍,沒有指定默認使用該依賴範圍。對於編譯、測試、運行三種classpath都有效。例如:spring-core。

test:測試依賴範圍,只對測試classpath有效,在編譯主代碼或者運行項目是無法使用。例如:junit。

provided:已提供依賴範圍,對於編譯和測試classpath有效,運行時無效。例如:servlet-api

runtime:運行時依賴範圍,對於測試和運行classpath有效,但在編譯主代碼時無效。例如:spring-jdbc。

system:系統依賴範圍,和provided作用一致。但是system範圍的依賴時必須通過systemPath元素顯示第指定依賴文靜的路徑。由於該類依賴不是通過Maven倉庫解析的,而且往往與本機系統綁定,可能造成不可抑制,應謹慎使用。

import:只使用在dependencyManagement中,表示從其他的pom中導入depency的配置,不會對三種classpath產生實際的影響。

optional:標記依賴是否可選

exclusions:用來排除傳遞性依賴

pluginManagement默認插件配置

配置到project-build節點中,配置供子項目引用的插件。

<pluginManagement>      <!--使用的插件列表-->      <plugins>          <!--plugin元素包含描述插件所需要的信息-->          <plugin>              <!--插件在倉庫里的groupId-->              <groupId></groupId>              <!--插件在倉庫里的artifactId-->              <artifactId></artifactId>              <!--被使用的插件的版本-->              <version></version>              <!--是否從該插件下載Maven擴展(例如打包和類型處理器)默認為false,由於性能原因,只有在真需要下載時,該元素才被設置成true。-->              <extensions></extensions>              <!--在構建生命周期中執行一組目標的配置。每個目標可能有不同的配置。-->              <executions>                  <!--execution元素包含了插件執行需要的信息-->                  <execution>                      <!--執行目標的標識符,用於標識構建過程中的目標,或者匹配繼承過程中需要合併的執行目標-->                      <id></id>                      <!--綁定了目標的構建生命周期階段,如果省略,目標會被綁定到源數據里配置的默認階段-->                      <phase></phase>                      <!--配置的執行目標-->                      <goals></goals>                      <!--配置是否被傳播到子POM-->                      <inherited></inherited>                      <!--作為DOM對象的配置-->                      <configuration></configuration>                  </execution>              </executions>              <!--項目引入插件所需要的額外依賴-->              <dependencies>                  <!--參見dependency元素配置-->                  <dependency>                  </dependency>              </dependencies>              <!--任何配置是否被傳播到子項目-->              <inherited></inherited>              <!--作為DOM對象的配置-->              <configuration></configuration>          </plugin>      </plugins>  </pluginManagement>

repositories遠程倉庫的配置

很多情況默認的中央倉庫無法滿足項目需求,需要配置其他遠程倉庫,如JBoss Maven庫,需要在Pom.xml文件中配置。

<repositories>   <repository>    <id>jboss-maven2-release-repository</id>    <name>JBoss Repository</name>    <url>http://repository.jboss.org/maven2/</url>    <releases>     <enabled>true</enabled>     <checksumPolicy>ignore</checksumPolicy>     <updatePolicy>daily</updatePolicy>    </releases>    <snapshots>     <enabled>false</enabled>     <checksumPolicy>fail</checksumPolicy>     <updatePolicy>always</updatePolicy>    </snapshots>    <layout>default</layout>   </repository>  </repositories>

在repositories元素下可以聲明一個或多個遠程倉庫。

id:任何一個倉庫聲明的id必須是唯一的,Maven自帶中央倉庫id為central,如果其他倉庫聲明id也是central,就會覆蓋中央倉庫的配置。

url:指向倉庫的地址,一般該地址是基於http協議,用戶可以瀏覽器中打開倉庫地址瀏覽構件。

releases:支持發佈版本下載。

snapshots:支持快照版本下載,enabled=true時開啟releases和snapshots還有2個子元素。

checksumPolicy:配置Maven檢查檢驗和文件的策略。當構建被部署到倉庫中時,會同時部署對應的校驗和文件,在下載構件的時候,Maven會驗證校驗和文件,如果校驗和驗證失敗,會根據checksumPolicy的值進行選擇。默認值是warn-Maven會在執行構建時輸出警告信息,可用值還有fail-Maven遇到校驗和錯誤時就讓構建失敗;ignore-使Maven完全忽略校驗和錯誤。

updatePolicy:配置Maven從遠程倉庫檢查更新的頻率,默認值是daily。可用值有daily-每天檢查一次、always-每次構建都會檢查更新、interval:X-每個X分鐘檢查一次更新、never-從不檢查更新。 layout:值為default表示倉庫的布局是Maven2及Maven3的默認布局。

本文由 小馬哥 創作,採用 知識共享署名4.0 國際許可協議進行許可 本站文章除註明轉載/出處外,均為本站原創或翻譯,轉載前請務必署名 最後編輯時間為: 2017/11/23 09:23