maven倉庫和鏡像


本文主要是針對《maven實戰》書中關鍵知識點的學習記錄,未免有紕漏或描述不到之處,建議購買閱讀原書

本文涉及一些maven倉庫和鏡像中一些簡單的概念

簡介

對於maven來說,倉庫只分為2類,本地倉庫遠程倉庫。maven的規則是優先在本地倉庫進行尋找,如果本地倉庫沒有,那么便從遠程倉庫進行獲取。如果二者都沒有,那么會報錯。
比較多的情況是,maven會因為網絡的原因,而倉庫里並沒有下載到jar包,而只有.jar.lastupdate.pom這2個文件。而查看pom.xml文件的時候也不會報錯。那么久需要刪除本地倉庫中,這個包的目錄,重新下載。

私服也屬於是遠程倉庫,私服的目的是為了節約網絡帶寬,而在局域網內搭建的一個maven服務器。

本地倉庫

當沒有修改本地maven配置的時候,默認會在當前用戶目錄下的.m2/repository/下作為本地的倉庫。在maven安裝目錄的conf下有個settings.xml的文件,可以對本地倉庫的路徑進行設置。

<settings>
	<localRepository>D:/maven/maven-repository/</localRepository>
</settings>

注意,其實還有一種settings是可以只針對當前用戶的,就是在.m2/settings.xml,不過這個xml文件一般是不存在,需要自己手工的去創建。而conf目錄下的settings文件,是一個全局的配置,是針對於所有的用戶。

遠程倉庫

本地倉庫像是我們自己的書房,我們在自己的書房里去尋找某本書,發現沒有,那么久是去書店或在網上去購買。在maven世界中,書店或網上商城,都可以看做是遠程倉庫。
遠程倉庫中使用比較多的是central倉庫(也是默認倉庫),此外還有一些如Jboss的遠程倉庫,具體要根據項目的實際情況來設置。
maven默認使用central倉庫,如果還需要使用其他倉庫,則需要再pom.xml中進行類似下面的配置

<repositories>
	<repository>
		<id>spring-milestones</id>
		<name>Spring Milestones</name>
		<url>https://repo.spring.io/milestone</url>
		<snapshots>
			<enabled>false</enabled>
		</snapshots>
	</repository>
</repositories>

注意里面的snapshot的值為false,表示不從倉庫中下載快照版本。因為snapshot是經常發生變化的,而我們實際使用的包,往往都希望是穩定的,這樣對於我們的工程來講是比較安全。

遠程倉庫的更新

與snapshot有類似作用的一個標簽是release,表示對發行版本的下載。默認是true。而snapshot和release這2個標簽,都有2個子元素。

<snapshots>
	<enabled>true</enabled>
	<updatePolicy>daily</updatePolicy>
	<checksumPolicy>ignore</checksumPolicy>
</snapshot>

updatePolicy表示檢查更新的策略,默認是每天更新一次,其他值包括never從不檢查更新;always每次構建時都檢查更新;interval X, 每隔x分鍾檢查一次
checksumPolicy是針對於校驗和,當文件被部署到遠程倉庫中時,會生成一份校驗和的文件,有點類似數字簽名,來代表這個文件沒有被修改過。在maven下載的時候,會根據校驗和文件來進行校驗,如果校驗失敗,那么會根據這個屬性來決定是否要進行警告。ignore則表示不進行警告,還有warn表示構建時給予警告,而fail表示會讓構建變為失敗。

遠程倉庫的認證

一般我們像私服都會是公示自己內部構建的,那么有的私服倉庫可能不適用於其他部門,那么會有一個賬戶密碼的認證。這個配置信息是存在在settings.xml中的。值得注意的是,里面的這個id,需要和你在pom.xml中配置的id要一致。

<servers>
	<server>
		<id>my-proj</id>
		<username>repo-my</username>
		<password>123123</password>
	</server>
</servers>

部署到遠程倉庫

在工程的pom.xml文件內,需要進行配置,而這個配置是distributionManagement元素。

<distributionManagement>
	<repository>
		<id>proj-my</id>
		<name>123</name>
		<url>http://xxx</url>
	</repository>
	<snapshotRepository>
		<id>proj-my</id>
		<name>123</name>
		<url>http://xxx</url>
	</snapshotRepository>
</distributionManagement>

snapshotRepository表示是快照版本要發布的倉庫地址。一般這種部署都是需要認真的,而認證的配置就是上面說提到的。
真的要進行部署的時候,就執行mvn clean deploy 即可。

快照版本

試想,有2個部門因為某項緊急的任務需要合作,2個部門的工作需要同時展開,工作中需要將自己的功能代碼發布到局域網內的私服倉庫中去。如果maven沒有快照的機制,那么可能在每次其中一個部門發布一個版本的時候,那么就需要通知另外的部門,將pom.xml文件中的版本號去進行修改。
顯然,這是一件很麻煩的事情。
快照版本要解決的就是類似這樣,可能會頻發發布版本,而又不需要去修改pom.xml的情形。在發布到私服的過程中,maven會自動將snapshot進行替換,打上時間戳。那么另外的一個部門,在進行獲取的時候,就可以根據時間戳來獲取到最新的文件,這個檢查默認是每次執行一次。
快照的版本應該只在組織內部或模塊間的依賴中使用,因為快照是十分不穩定的版本,可能今天構建時可以了,但到了明天就不行。

依賴解析

  • 當依賴的范圍是system時,直接從本地文件系統解析構件
  • 根據依賴坐標計算倉庫路徑,先嘗試從本地尋找,本地沒有,則從遠程倉庫去獲取
  • 在本地倉庫不存在的情況下
    • 如果依賴的構件是顯示的發布版本,例如1.2.1或者1.2.-beta-1這種,則便利所有遠程倉庫,發現則下載。
    • 如果是RELEASE或LATEST,則基於更新策略,讀取所有遠程倉庫的元數據groupId/artifactId/version/maven-metadata.xml,與本地倉庫對應的元數據進行合並,得到RELEASE或LATEST的真實值
    • 如果是SNAPSHOT,讀取所有遠程倉庫的元數據groupId/artifactId/version/maven-metadata.xml,與本地倉庫對應的元數據進行合並,得到SNAPSHOT的真實值
    • 如果最后解析得到的構件版本是時間戳格式的快照(e.g. 1.4.1-20191101.121403-3),則復制時間戳格式的文件至非時間戳格式。如SNAPSHOT。

鏡像

鏡像的作用和cdn很類似,因為GFW的關系,很多外國的倉庫訪問速度很慢或者無法訪問,那么就可以借助一些國內的一些大公司提供的鏡像地址來加快文件的下載,個人用的比較多的是阿里的鏡像地址。

<mirrors>
   <mirror>
        <id>alimaven</id>
        <mirrorOf>central</mirrorOf>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
    </mirror>
</mirrors>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM