閱讀899 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《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就不多說了,除此之外,從外到內,首先是repositoriespluginRepositories,其中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

  上一篇:go  怎麼估算空間利用率?新研發傳感器分分鍾搞定!
  下一篇:go  [leveldb] 初步探索 leveldb