《maven實戰》讀書筆記5——maven倉庫和鏡像
什麼是maven倉庫
要理解什麼是maven倉庫,需要先理解什麼是maven構件。
什麼是maven構件呢?在本書中解釋是:
在maven的世界中,任何一個maven依賴、插件和maven項目構建的輸出都是maven的構件。
那麼我個人的理解就是我們創建項目時需要的jar包、插件包以及項目打包後的文件,等等這些。
這本書中有一個對於maven倉庫的比喻,我覺得很是貼切,所以對於maven倉庫的解釋我覺得完全可以引用。
書中以圖書來比喻maven構件,而maven倉庫則是個人書房、實體書店以及網上書店,書房和書店是用來放書的房間,而maven倉庫就是用來放maven構件的目錄。
maven倉庫的分類
根據上邊所述,maven倉庫就是用來放maven構建的目錄,那麼對於我們和計算機打交道的人就知道,一種是本地目錄,還有一種是非本地目錄。
本地目錄自然就是我們當前操作的這台計算機的某個目錄,而非本地目錄就是通過網絡連接的服務器的某個目錄。
本地的那個目錄叫本地倉庫,遠程的目錄稱作遠程目錄。
那麼構建一個maven項目使用maven倉庫的過程,也大概就像一個找書看的過程。
我們構建maven項目時需要根據pom.xml的配置來引用相應的maven構件,就相當於我們需要看什麼書的時候去找書。
如果自己有書房,想看書的時候自然會先去書房找一下,如果沒有,則可能去實體書店或者網上書店買書,買回來以後放入書房。
同樣的,在maven項目需要maven構件的時候,也會先到本地倉庫(書房)找一下有沒有這個構件,如果沒有,則會根據配置(相當於你所知道的實體店地址或網店的網址)去相應的遠程倉庫下載,下載完以後放入本地倉庫。
既然把遠程倉庫類比為實體書店和網店,那麼就自然而然的需要知道遠程倉庫也是有多種的。
遠程倉庫大體上可分為中央倉庫、私服和其他公共庫。
中央倉庫,個人理解就是maven提供的那個最原始的倉庫;私服就是一個小範圍的、可以供一部分人用,但又不是完全公開的那種倉庫;而其他公共庫就是除開maven中央庫之外的、其他公司或機構提供的可以被所有人訪問的倉庫。
一般來說,本地庫類似於書房,可以最快的拿到需要的書;私服類似於實體書店,如果不需要很久就能到書店的話,也能很快拿到書;而遠程庫就相當於網店,下單後需要一定的快遞時間才能到貨。
maven倉庫的配置
理解了什麼是maven倉庫以及分類後,接下來就需要知道具體怎麼用了。在這裏,我就下意識的以為能看到這裏的都是知道maven基礎使用的,也都應該知道maven的setting.xml文件。
本地倉庫配置
倉庫分為了本地倉庫和遠程倉庫,對於倉庫的配置也是分為了本地倉庫和遠程倉庫,本地倉庫的配置比較簡單,在setting.xml中如下:
<localRepository>F:\repo_new1</localRepository>
也就是在localRepository中填上本地maven倉庫目錄的路徑。
遠程倉庫配置
而maven倉庫的配置就是在setting.xml文件中,以下是我的某個setting.xml中對maven遠程倉庫的的配置,這裏配的就是一個私服:
<profiles> <profile> <id>nexus</id> <repositories> <repository> <id>repo1</id> <url>https://192.168.0.224:8081/nexus/content/groups/public</url> <releases> <enabled>true</enabled> <updatePolicy>daily</updatePolicy> <checksumPolicy>ignore</checksumPolicy> </releases> </repository> <repository> <id>repo2</id> <url>https://192.168.0.224:8081/nexus/content/groups/public-snapshots</url> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>repo3</id> <url>https://192.168.0.65:8082/nexus/content/groups/public</url> <releases> <enabled>true</enabled> </releases> </pluginRepository> <pluginRepository> <id>repo4</id> <url>https://192.168.0.65:8082/nexus/content/groups/public-snapshots</url> <snapshots> <enabled>true</enabled> </snapshots> </pluginRepository> </pluginRepositories> </profile> </profiles>
對於上邊的配置,profiles、profile以及開始的那個id就不多說了,除此之外,從外到內,首先是repositories
和pluginRepositories
,其中repositories標簽裏的是主要項目依賴構建的倉庫配置,pluginRepositories裏的是插件依賴構建的倉庫配置。
每個repositories裏可以包含幾個repository,即具體倉庫的配置。在repository裏有id和url,id需保證唯一性,url就是具體的倉庫的地址。
如我上邊例子中,除開id和url外還有兩個不一樣的屬性,一個是releases,一個是snapshots,releases指的是發布版的倉庫,snapshots指的是快照版的倉庫。
在第一個releases中又配置了三個屬性,一個是enable,值為true代表開啟,false代表關閉。
還有一個屬性是updatePolicy,代表從中央倉庫更新構建的頻率,如daily,代表每天。updatePolicy的值有多個,具體的這裏不說。
另外一個就是checksumPolicy,代表下載構建的時候是否要校驗文件的正確性,上述例子中ignore指的是忽略。這個屬性也是有多個值,具體的這裏略過。
而與repositories類似,pluginRepositories裏可以包含幾個pluginRepository,具體的其他屬性也和上邊說的一樣。
maven鏡像
maven鏡像我在實際使用的時候其實一直都有配置,網上大多的解釋也都是說鏡像相當於一個代理,或者說網絡加速器,用來加速對於maven倉庫的訪問。
之所以這樣說,是因為配置了某個鏡像指向我們配置的某個maven倉庫後,我們再去訪問這個maven倉庫,就會被這個鏡像攔截,轉而去訪問這個鏡像配置的地址,這樣做的目的一般就是為了提高速度。
根據我個人理解,這個鏡像應該是采用了網絡加速機製再指向實際的maven倉庫地址,而這個倉庫地址是否就是我們自己配置的和這個鏡像關聯的maven倉庫,其實並沒有太大的關係。
上邊這句聽起來似乎有些繞口,那麼不妨通過一個例子來進行理解,就如我的setting.xml中鏡像的配置:
<mirrors> <mirror> <id>releases</id> <mirrorOf>*</mirrorOf> <url>https://maven.aliyun.com/nexus/content/groups/public/</url> </mirror> <mirror> <id>snapshots</id> <mirrorOf>repo1</mirrorOf> <url>https://maven.aliyun.com/nexus/content/groups/public/</url> </mirror> <mirror> <id>maven.oschina.net1</id> <mirrorOf>repo2</mirrorOf> <url>https://maven.aliyun.com/nexus/content/groups/public/</url> </mirror> <mirror> <id>alimaven</id> <mirrorOf>central</mirrorOf> <url>https://maven.aliyun.com/nexus/content/groups/public/</url> </mirror> </mirrors>
以上配置基本是我setting.xml文件中的鏡像配置了,但是隻是為了說明鏡像的配置才配置了這麼多。
鏡像配置的基本格式就是上邊這樣,由一個mirrors
標簽包含多個mirror
標簽,每一個mirror就是一個具體的鏡像。
每個mirror都有一個id,這是鏡像的唯一標示,也需要保證唯一性。
url就是具體的鏡像的地址,就像上網配置代理一樣。
這裏需要著重說明的是mirrorOf
,正是有了這個屬性,才使我們配置的鏡像和我們配置的倉庫地址關聯起來,這個mirrorOf
實際上對應的就是上邊所配置的倉庫的id,例如這裏的<mirrorOf>repo1</mirrorOf>
就是對應上邊倉庫配置那裏的<id>repo1</id>
,當我們訪問id為repo1的倉庫時,就會被這個鏡像攔截,繼而訪問這個鏡像實際要訪問的maven倉庫的地址。例如我這裏,不管repo1配置的倉庫是什麼,最終實際上訪問的都是aliyun的maven倉庫。
這裏需要注意的是,我上邊配置了四個鏡像,而實際上真正生效的隻有第一個,因為第一個的mirrorOf值是通配符*
,代表所有倉庫都走這裏,所以下邊幾個就不會走了。
還需要注意的是最後一個mirrorOf是central
,這個也有特殊意義,代表的是maven默認的中央倉庫的id。
在鏡像的實際配置中,其實不止我配置的那幾個屬性,例如還有name等,這些有時候不是必要的,所以我就略過了。
最後更新:2017-11-13 18:04:29