相信每一個java開發人員對maven都不陌生,它和git,svn,idea同樣,伴隨着咱們開發的每一分鐘。
但你在大多數時候,只是在使用它,你真的認識它,瞭解它,熟悉它嗎?
今天我來分享一點,我在項目中使用maven總結出的東西java
倉庫,是用來存放東西的地方,maven倉庫也是同樣,用來存放咱們會用到的一些構件
Maven 倉庫能幫助咱們管理構件(主要是JAR),它就是放置全部JAR文件(WAR,ZIP,POM等等)的地方。
Maven 倉庫有兩種類型:git
運行 Maven 的時候,Maven 所須要的任何構件都是直接從本地倉庫獲取的。若是本地倉庫沒有,它會首先嚐試從遠程倉庫下載構件至本地倉庫,而後再使用本地倉庫的構件。web
在本地倉庫中已存在的構件,包括從遠程倉庫獲取的以及本地項目install進去的項目,都是最早優先級被被項目使用的spring
本地倉庫默認路徑爲 本機用戶下: .m2/respository/ 文件夾,也能夠在settings.xml中指定本地倉庫路徑apache
<localRepository>/path/to/local/repo</localRepository>
中央倉庫是maven最核心的倉庫,也是默認使用的倉庫。中央倉庫由 Maven 社區提供,包含了絕大多數流行的開源Java構件,以及源碼、做者信息、SCM、信息、許可證信息等。通常來講,簡單的Java項目依賴的構件均可以在這裏下載到。
中央倉庫Nexustomcat
後面找時間單獨寫一篇發佈日記網絡
因爲中央倉庫的開源等條件限制,不少構件並不會發佈到中央倉庫,不少組織或單位就定製了本身的倉庫,包含了所須要的代碼庫或者其餘工程中用到的構件。mvc
emsp; 在平常項目開發中,不一樣項目,可能須要用到不一樣的遠程倉庫來下載構件,咱們一般使用一下兩種方式來維護遠程倉庫地址:app
emsp; 默認狀況下,遠程倉庫使用的就是中央倉庫,但受限於國內網絡環境,咱們一般使用國內鏡像倉庫,好比阿里雲Maven倉庫。maven
<mirrors> <mirror> <id>aliyunmaven</id> <name>aliyun maven</name> <url>https://maven.aliyun.com/repository/public/</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors>
屬性 | 描述 |
---|---|
id | 鏡像標識(惟一) |
name | 鏡像描述 |
url | 倉庫地址 |
mirrorOf | 倉庫匹配模式 |
屬性 | 描述 |
---|---|
central | 指向中央倉庫的構件匹配到本倉庫 |
* | 匹配全部構件到本倉庫 |
repo1,repo2 | 匹配倉庫repo1和repo2,使用逗號分隔多個遠程倉庫 |
*,!repo1: | 匹配除repo1外全部遠程倉庫,使用感嘆號將倉庫從匹配中排除 |
須要注意的是,因爲鏡像倉庫徹底屏蔽了被鏡像倉庫,當鏡像倉庫不穩定或者中止服務的時候,Maven仍將沒法訪問被鏡像倉庫,於是將沒法下載構件。
<repository> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> </repository>
<repository> <id>activiti-repos2</id> <name>Activiti Repository 2</name> <url>https://app.camunda.com/nexus/content/groups/public</url> </repository>
<repository> <id>springsource-repos</id> <name>SpringSource Repository</name> <url>http://repo.spring.io/release/</url> </repository>
<repository> <id>central-repos</id> <name>Central Repository</name> <url>http://repo.maven.apache.org/maven2</url> </repository>
<repository> <id>central-repos1</id> <name>Central Repository 2</name> <url>http://repo1.maven.org/maven2/</url> </repository>
<repository> <id>activiti-repos</id> <name>Activiti Repository</name> <url>https://maven.alfresco.com/nexus/content/groups/public</url> </repository>
經過<repositories></repositories>配置庫,這樣配置的庫僅適用於當前項目。
repositorie的主要參數
屬性 | 描述 |
---|---|
id | 庫的ID |
url | 庫的URL |
releases | 是否啓用releases Release版本則表明穩定的版本,發行版本 |
snapshots | 是否啓用snapshots Snapshot版本表明不穩定、尚處於開發中的版本,快照版本 |
樣例:
<repositories> <repository> <id>aliyunmaven</id> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories>
項目在向倉庫推送構件或者拉取構件時,有些倉庫須要認證,故須要爲指定倉庫id配置 認證信息
在settings.xml中配置認證信息
<servers> <server> <id>ossrh</id> <username>qwerwer</username> <password>asdfasdfasdfe2234dsed+23sdfsfaseafd</password> </server> </servers>
在一些較大的項目中,咱們一般須要將項目合理的拆分紅多個不一樣的子模塊,以便於統一的配置管理,代碼複用,方便程序的維護與開發。
父模塊必須使用 pom 的方式打包以下:
<packaging>pom</packaging>
在父模塊中定義要管理的子模塊
<modules> <module>childA</module> <module>childB</module> </modules>
在maven父子關係中,子項目會集成父類大部分配置的。對於咱們在項目中須要使用的構件,咱們可使用兩種方式來引入:
由於繼承關係,兩種方式引入的構件,均可以用來在子項目中使用,但用法有區別,也有各自的優點。
使用dependencies在父pom中引入構件,此種方式引入的jar能夠在全部子模塊中使用,使用相同配置,並不須要從新引用,適用於共用構件,舉個 :
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> </dependency> </dependencies>
使用dependencymanagement在父pom中引入構件,此種方式引入的jar,若子模塊須要使用,則須要從新在<dependencies>標籤中使用,父類提供統一的版本控制,舉個 :
<dependencyManagement> <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> </dependency> </dependencies> </dependencyManagement>
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies>
使用maven中,最讓咱們頭疼的就是jar包的版本,構件以前相互嵌套,不一樣版本相互依賴,不相兼容,會致使咱們在開發中遇到不少奇奇怪怪的問題。
瞭解版本控制,能夠幫咱們在遇到麻煩時,快速定位問題。
Maven使用groupId(通常是組織的域名倒寫)+ artifactId(庫自己的名稱) + version(版本)來定義座標,經過xml來作配置文件。
Maven我會在後面的筆記中,手把手教您一步步上傳本身的項目到maven中央倉庫
Maven 在 pom.xml 中引入jar包,當Maven解析該依賴時,還須要引入該依賴pom中所依賴的構件以及構件中依賴的構件。這必然會形成同一構件的不用版本同時出如今項目中。
A -> B -> C -> D(V1) F -> G -> D(V2)
若某項目想使用構件D,並存在以上依賴關係時,優先使用D(V2),其暴露深度更短。
若是A-B-X(1.0) ,A-C-X(2.0) 這樣的路徑長度同樣怎麼辦呢?這樣的狀況下,maven會根據pom文件聲明的順序加載,若是先聲明瞭B,後聲明瞭C,那就最後的依賴就會是X(1.0)。
子pom內聲明的優先於父pom中的依賴。
咱們在項目中,可使用 <exclusions>標籤來過濾掉不須要的依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency>
舉個 :
<properties> <spring-framework-version>4.3.7.REALEASE</spring-framework-version> </properties>
在引入依賴時使用:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring-framework-version}</version> <scope>compile</scope> </dependency>
更多好玩好看的內容,歡迎到個人博客交流,共同進步 WaterMin
喜歡聽相聲的朋友,也能夠來個人 YouTube,來聽郭老師的相聲 秋釀