一小時教你學會 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