maven(6)仓库
生活随笔
收集整理的這篇文章主要介紹了
maven(6)仓库
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
【0】README
1)本文部分文字轉(zhuǎn)自 “maven實戰(zhàn)”,旨在 review ?“maven(6)倉庫”?的相關知識;
【1】何為 Maven倉庫 1)intro to 構件:在maven中,任何一個依賴,插件或者項目構建的輸出,都可以稱為 構件;任何一個構件都由一組坐標唯一標識;(干貨——構件的定義) 2)倉庫:得益于坐標機制,任何 maven項目 使用任何一個構件的方式都是相同的。在此基礎上,maven 可以在某個位置上統(tǒng)一存儲 所有maven 項目共享的構件,這個統(tǒng)一的位置就是倉庫;(干貨——倉庫的定義)
【2】倉庫的布局 1)倉庫的布局方式:任何一個構件都有其唯一的坐標,根據(jù)這個坐標可以定義其 倉庫中的唯一存儲路徑,這便是 ?maven 的倉庫布局方式;(干貨——倉庫的布局方式定義) 2)路徑與坐標的對應關系:為 groupId/artifactId/artifactId-version.packaging; 3)有興趣的童鞋,可以看看 maven的源碼,其如何 根據(jù)構件信息生成倉庫中的路徑(其實就是一個截取字符串 和 拼接字符串的過程, 和 tomcat 對請求路徑進行解析是同樣的道理)
【3】倉庫的分類 1)倉庫分為兩類: 本地倉庫 和 遠程倉庫; 2)maven 搜尋構件的方法: 當maven 根據(jù)坐標尋找構件的時候,它首先查看本地倉庫,若本地倉庫中有,則直接使用;如果沒有,或者需要查看是否有更新的構建版本的時候,maven 就會去 遠程倉庫查找了;發(fā)現(xiàn)需要的構建后,下載到本地倉庫中再使用;
3)私服(私有服務器):私服是另一種特殊的遠程倉庫,為了節(jié)省帶寬和時間,應該在局域網(wǎng)內(nèi) 架設一個私有的倉庫服務器,用其代理所有外部的遠程倉庫,且內(nèi)部的項目還能部署到私服上共其他項目使用;(干貨——私服的定義)
Attention) A1)除了中央倉庫 (http://repo1.maven.org/maven2/)和 私服作為 遠程倉庫外,還有其他公開的 遠程倉庫:如 ?java .net maven 庫(?http://download.java.net/maven/2?) ? 和 JBoss maven 庫(http://repository.jboss.com/maven/2) A2)maven 倉庫的分類如下:
【3.1】本地倉庫 1)intro:默認case下,每個用戶在自己的用戶目錄都有一個路徑名為 ?~/.me/repository 的倉庫目錄;
2)自定義本地倉庫目錄地址:可以編輯 settings.xml ,設置?localRepository 的值;(你需要從 maven 安裝目錄/conf/ 目錄下 copy setting 到 .m2 目錄下)(干貨——如何自定義本地倉庫) <!-- localRepository| The path to the local repository maven will use to store artifacts.|| Default: ${user.home}/.m2/repository--><localRepository>D:\classical_books\java_set\maven_in_action\local_repo\</localRepository> 3)problem+solution: 3.1)problem:?構件如何進入到本地倉庫中? 一個構件只有在本地倉庫中之后,才能被其他 maven 項目使用; 3.2)solution:執(zhí)行 mvn clean install 命令;
【3.2】遠程倉庫 1)intro:安裝好 maven 后,如果不執(zhí)行maven命令,本地倉庫目錄是不會存在的;當用戶輸入第一條 maven 命令后,maven 才會創(chuàng)建 本地倉庫;然后根據(jù)配置需要,從遠程倉庫下載構件到本地倉庫;
【3.3】中央倉庫(屬于遠程倉庫,https://repo.maven.apache.org/maven2) 1)intro: 中央倉庫是默認的遠程倉庫(遠程倉庫可由多個),maven的安裝自帶了中央倉庫的配置;(D:\classical_books\java_set\maven_in_action\apache-maven-3.3.9\lib\maven-model-builder-3.3.9\org\apache\maven\model\pom.xml 文件內(nèi)容如下) <project><modelVersion>4.0.0</modelVersion><repositories><repository><id>central</id><name>Central Repository</name><url>https://repo.maven.apache.org/maven2</url> <layout>default</layout><snapshots><enabled>false</enabled></snapshots></repository></repositories> 對以上代碼的分析(Analysis):看到 snapshots 里的 enabled 子元素 設置為 false,表示不從該中央倉庫下載 快照版本的構件;
【3.4】私服 1)intro:私服是一種特殊的遠程倉庫,它是架設在局域網(wǎng)中的倉庫服務,私服代理廣域網(wǎng)上的 遠程倉庫,供局域網(wǎng)內(nèi)的 maven 用戶使用; 2)一些無法從 外部倉庫下載到的構件也能從本地上傳到私服上供大家使用,如下圖所示:
【4】遠程倉庫的配置 1)默認的遠程倉庫:是<url>https://repo.maven.apache.org/maven2</url>,如下述代碼所示,該代碼來源于?D:\classical_books\java_set\maven_in_action\apache-maven-3.3.9\lib\maven-model-builder-3.3.9\org\apache\maven\model\pom.xml (即 maven安裝目錄/lib/.....) <!-- START SNIPPET: superpom --> <project><modelVersion>4.0.0</modelVersion><repositories><repository><id>central</id><name>Central Repository</name><url>https://repo.maven.apache.org/maven2</url><layout>default</layout><snapshots><enabled>false</enabled></snapshots></repository></repositories> 對以上代碼的分析(Analysis):在?repositories 元素下,可以使用?repository 子元素聲明一個或多個 遠程倉庫;
2) release 和 snapshot 來說,有3個子元素 enabled + updatePolicy + checksumPolicy; 2.1)子元素 enabled:(true or ?false)表示開啟或關閉 快照版本的下載支持; 2.2)子元素 updatePolicy:(daily, never, always, interval:X):分別表示 每天檢查一次,其他可用的值包括: never 從不檢查更新;always每次構建都檢查更新;interval:X 每個X 分鐘檢查一次更新; 2.3)子元素 checksumPolicy:用來配置 maven 檢查檢驗 和 文件的 策略。當構件被部署到 maven 倉庫中時,會同時部署對應的校驗和文件;(value 可設置為 ignore)
【4.1】 遠程倉庫認證 1)在settings.xml 中配置 倉庫認證信息;(為 id==my-proj 的倉庫配置認證信息) 2)配置認證信息和 配置倉庫信息不同: 倉庫信息可以直接配置在 POM 文件中,但是 認證信息必須配置在 settings.xml 文件中;因為 POM 往往是被提交到代碼倉庫中所有成員訪問的,而settings.xml 是放在本機的; 3)假設需要為一個id==my-proj 的倉庫配置認證信息,修改 settings.xml 如下:
4)maven 使用 settings.xml 文件中的 servers 元素 和server 子元素配置倉庫認證信息; Attention)本機子的本地倉庫就是 其他機子的遠程倉庫;
【4.2】部署至遠程倉庫 1)maven 能將項目生成的構件部署到倉庫中。部署steps 如下: step1)需要編輯 項目的 pom.xml 文件,配置 distributionManagement 元素;
對以上代碼的分析(Analysis): A0)配置 id, name, url 分別作為 遠程倉庫的唯一標識, 名稱 和 地址; A1)distributionManagement?包含 repository 和 snapshotRepository 子元素,前者表示發(fā)布版本構件的倉庫,后者表示快照版本的 倉庫; A2)關鍵是url:它表示 遠程倉庫的地址;
step2)往遠程倉庫部署構件的時候,往往需要認證。 簡而言之,就是需要在 settings.xml 中創(chuàng)建一個 server元素,其 id 與 遠程倉庫的 id 匹配,并配置正確的認證信息;(參見?【6.4.1】 遠程倉庫認證 中的認證內(nèi)容) step3)配置正確后,在命令行運行 mvn clean deploy: maven 就會將項目構建輸出的構件部署到對應的遠程倉庫了;
【5】 快照版本 1)intro:快照版本(SNAPSHOT)是不穩(wěn)定的版本,而發(fā)布版本(RELEASE)是穩(wěn)定的版本;
【6】從倉庫解析依賴的機制 1)intro:當本地倉庫沒有依賴構件的時候,maven 會自動從 遠程倉庫下載;當依賴版本為 快照版本的時候,maven 會自動找到最新的 快照。這背后的 依賴解析機制可以概括如下: mechanism1)當依賴的范圍是 system,maven 直接從 本地文件系統(tǒng)解析構件; mechanism2)根據(jù)依賴坐標計算倉庫路徑后,嘗試直接從 本地倉庫尋找構件,如果發(fā)現(xiàn)相應構件,則解析成功; mechanism3)在本地倉庫不存在相應構件的case下, 如果依賴的版本是顯式的發(fā)布版本構件,如1.2 等,則遍歷所有的遠程倉庫,發(fā)現(xiàn)后,下載并解析使用; mechanism4)如果依賴的版本是 RELEASE OR ?LATEST ,則基于更新策略讀取所有遠程倉庫的 元數(shù)據(jù) groupId/artifactId/maven-metadata.xml,將其與本地倉庫的對應元數(shù)據(jù)合并后,計算出 RELEASE OR ?LATEST 真實的值,然后基于該值檢查本地倉庫 和 遠程倉庫; mechanism5)如果依賴的版本是 SNAPSHOT,則基于更新策略讀取所有遠程倉庫的元數(shù)據(jù)?groupId/artifactId/version/ maven-metadata.xml,將其與 ?本地倉庫的對應元數(shù)據(jù)合并后,得到的最新快照版本的值,然后基于該值檢查本地倉庫,或者從 遠程倉庫下載; mechanism6)如果最后解析得到的 構件版本 是 時間戳格式的快照,如 1.4.1-200911-4.121450-121,則復制其時間戳格式的文件 至 非時間戳格式,如 SNAPSHOT ,并使用該 非 時間戳格式的構件; ....... 此處省略1000字
【7】 鏡像 1)intro:如果倉庫X 可以提供倉庫 Y 存儲的所有內(nèi)容,那么就可以人為 X 是 Y 的一個鏡像;換句話說,任何一個可以從倉庫Y 獲得的構件,都能夠從他的鏡像中獲取;(干貨——鏡像的定義) 2)編輯 settings.xml,配置中央倉庫鏡像 <mirrors><!-- mirror| Specifies a repository mirror site to use instead of a given repository. The repository that| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.|<mirror><id>mirrorId</id><mirrorOf>repositoryId</mirrorOf><name>Human Readable Name for this Mirror.</name><url>http://my.repository.com/repo/path</url></mirror>--></mirrors>
對上述代碼的分析(Analysis):mirrorOf 指定了 中央倉庫的鏡像;
3)鏡像的另一種用法是結合 私服:任何需要的構件都可以從私服獲得,私服就是所有倉庫的鏡像;
4)為了滿足一些復雜的要求,maven 還支持更高級的鏡像配置:
【8】倉庫搜索服務 1)problem+solution: 1.1)problem:如何尋找需要的依賴,因為添加 maven 依賴需要提供所確切的 maven 坐標; 1.2)使用 maven 倉庫搜索服務 ?Sonatype Nexus(https://repository.sonatype.org/) ?http://mvnbrowser.com/ http://mvnrepository.com/?(訪問速度最快)
【1】何為 Maven倉庫 1)intro to 構件:在maven中,任何一個依賴,插件或者項目構建的輸出,都可以稱為 構件;任何一個構件都由一組坐標唯一標識;(干貨——構件的定義) 2)倉庫:得益于坐標機制,任何 maven項目 使用任何一個構件的方式都是相同的。在此基礎上,maven 可以在某個位置上統(tǒng)一存儲 所有maven 項目共享的構件,這個統(tǒng)一的位置就是倉庫;(干貨——倉庫的定義)
【2】倉庫的布局 1)倉庫的布局方式:任何一個構件都有其唯一的坐標,根據(jù)這個坐標可以定義其 倉庫中的唯一存儲路徑,這便是 ?maven 的倉庫布局方式;(干貨——倉庫的布局方式定義) 2)路徑與坐標的對應關系:為 groupId/artifactId/artifactId-version.packaging; 3)有興趣的童鞋,可以看看 maven的源碼,其如何 根據(jù)構件信息生成倉庫中的路徑(其實就是一個截取字符串 和 拼接字符串的過程, 和 tomcat 對請求路徑進行解析是同樣的道理)
【3】倉庫的分類 1)倉庫分為兩類: 本地倉庫 和 遠程倉庫; 2)maven 搜尋構件的方法: 當maven 根據(jù)坐標尋找構件的時候,它首先查看本地倉庫,若本地倉庫中有,則直接使用;如果沒有,或者需要查看是否有更新的構建版本的時候,maven 就會去 遠程倉庫查找了;發(fā)現(xiàn)需要的構建后,下載到本地倉庫中再使用;
3)私服(私有服務器):私服是另一種特殊的遠程倉庫,為了節(jié)省帶寬和時間,應該在局域網(wǎng)內(nèi) 架設一個私有的倉庫服務器,用其代理所有外部的遠程倉庫,且內(nèi)部的項目還能部署到私服上共其他項目使用;(干貨——私服的定義)
Attention) A1)除了中央倉庫 (http://repo1.maven.org/maven2/)和 私服作為 遠程倉庫外,還有其他公開的 遠程倉庫:如 ?java .net maven 庫(?http://download.java.net/maven/2?) ? 和 JBoss maven 庫(http://repository.jboss.com/maven/2) A2)maven 倉庫的分類如下:
【3.1】本地倉庫 1)intro:默認case下,每個用戶在自己的用戶目錄都有一個路徑名為 ?~/.me/repository 的倉庫目錄;
2)自定義本地倉庫目錄地址:可以編輯 settings.xml ,設置?localRepository 的值;(你需要從 maven 安裝目錄/conf/ 目錄下 copy setting 到 .m2 目錄下)(干貨——如何自定義本地倉庫) <!-- localRepository| The path to the local repository maven will use to store artifacts.|| Default: ${user.home}/.m2/repository--><localRepository>D:\classical_books\java_set\maven_in_action\local_repo\</localRepository> 3)problem+solution: 3.1)problem:?構件如何進入到本地倉庫中? 一個構件只有在本地倉庫中之后,才能被其他 maven 項目使用; 3.2)solution:執(zhí)行 mvn clean install 命令;
【3.2】遠程倉庫 1)intro:安裝好 maven 后,如果不執(zhí)行maven命令,本地倉庫目錄是不會存在的;當用戶輸入第一條 maven 命令后,maven 才會創(chuàng)建 本地倉庫;然后根據(jù)配置需要,從遠程倉庫下載構件到本地倉庫;
【3.3】中央倉庫(屬于遠程倉庫,https://repo.maven.apache.org/maven2) 1)intro: 中央倉庫是默認的遠程倉庫(遠程倉庫可由多個),maven的安裝自帶了中央倉庫的配置;(D:\classical_books\java_set\maven_in_action\apache-maven-3.3.9\lib\maven-model-builder-3.3.9\org\apache\maven\model\pom.xml 文件內(nèi)容如下) <project><modelVersion>4.0.0</modelVersion><repositories><repository><id>central</id><name>Central Repository</name><url>https://repo.maven.apache.org/maven2</url> <layout>default</layout><snapshots><enabled>false</enabled></snapshots></repository></repositories> 對以上代碼的分析(Analysis):看到 snapshots 里的 enabled 子元素 設置為 false,表示不從該中央倉庫下載 快照版本的構件;
【3.4】私服 1)intro:私服是一種特殊的遠程倉庫,它是架設在局域網(wǎng)中的倉庫服務,私服代理廣域網(wǎng)上的 遠程倉庫,供局域網(wǎng)內(nèi)的 maven 用戶使用; 2)一些無法從 外部倉庫下載到的構件也能從本地上傳到私服上供大家使用,如下圖所示:
【4】遠程倉庫的配置 1)默認的遠程倉庫:是<url>https://repo.maven.apache.org/maven2</url>,如下述代碼所示,該代碼來源于?D:\classical_books\java_set\maven_in_action\apache-maven-3.3.9\lib\maven-model-builder-3.3.9\org\apache\maven\model\pom.xml (即 maven安裝目錄/lib/.....) <!-- START SNIPPET: superpom --> <project><modelVersion>4.0.0</modelVersion><repositories><repository><id>central</id><name>Central Repository</name><url>https://repo.maven.apache.org/maven2</url><layout>default</layout><snapshots><enabled>false</enabled></snapshots></repository></repositories> 對以上代碼的分析(Analysis):在?repositories 元素下,可以使用?repository 子元素聲明一個或多個 遠程倉庫;
2) release 和 snapshot 來說,有3個子元素 enabled + updatePolicy + checksumPolicy; 2.1)子元素 enabled:(true or ?false)表示開啟或關閉 快照版本的下載支持; 2.2)子元素 updatePolicy:(daily, never, always, interval:X):分別表示 每天檢查一次,其他可用的值包括: never 從不檢查更新;always每次構建都檢查更新;interval:X 每個X 分鐘檢查一次更新; 2.3)子元素 checksumPolicy:用來配置 maven 檢查檢驗 和 文件的 策略。當構件被部署到 maven 倉庫中時,會同時部署對應的校驗和文件;(value 可設置為 ignore)
【4.1】 遠程倉庫認證 1)在settings.xml 中配置 倉庫認證信息;(為 id==my-proj 的倉庫配置認證信息) 2)配置認證信息和 配置倉庫信息不同: 倉庫信息可以直接配置在 POM 文件中,但是 認證信息必須配置在 settings.xml 文件中;因為 POM 往往是被提交到代碼倉庫中所有成員訪問的,而settings.xml 是放在本機的; 3)假設需要為一個id==my-proj 的倉庫配置認證信息,修改 settings.xml 如下:
4)maven 使用 settings.xml 文件中的 servers 元素 和server 子元素配置倉庫認證信息; Attention)本機子的本地倉庫就是 其他機子的遠程倉庫;
【4.2】部署至遠程倉庫 1)maven 能將項目生成的構件部署到倉庫中。部署steps 如下: step1)需要編輯 項目的 pom.xml 文件,配置 distributionManagement 元素;
對以上代碼的分析(Analysis): A0)配置 id, name, url 分別作為 遠程倉庫的唯一標識, 名稱 和 地址; A1)distributionManagement?包含 repository 和 snapshotRepository 子元素,前者表示發(fā)布版本構件的倉庫,后者表示快照版本的 倉庫; A2)關鍵是url:它表示 遠程倉庫的地址;
step2)往遠程倉庫部署構件的時候,往往需要認證。 簡而言之,就是需要在 settings.xml 中創(chuàng)建一個 server元素,其 id 與 遠程倉庫的 id 匹配,并配置正確的認證信息;(參見?【6.4.1】 遠程倉庫認證 中的認證內(nèi)容) step3)配置正確后,在命令行運行 mvn clean deploy: maven 就會將項目構建輸出的構件部署到對應的遠程倉庫了;
【5】 快照版本 1)intro:快照版本(SNAPSHOT)是不穩(wěn)定的版本,而發(fā)布版本(RELEASE)是穩(wěn)定的版本;
【6】從倉庫解析依賴的機制 1)intro:當本地倉庫沒有依賴構件的時候,maven 會自動從 遠程倉庫下載;當依賴版本為 快照版本的時候,maven 會自動找到最新的 快照。這背后的 依賴解析機制可以概括如下: mechanism1)當依賴的范圍是 system,maven 直接從 本地文件系統(tǒng)解析構件; mechanism2)根據(jù)依賴坐標計算倉庫路徑后,嘗試直接從 本地倉庫尋找構件,如果發(fā)現(xiàn)相應構件,則解析成功; mechanism3)在本地倉庫不存在相應構件的case下, 如果依賴的版本是顯式的發(fā)布版本構件,如1.2 等,則遍歷所有的遠程倉庫,發(fā)現(xiàn)后,下載并解析使用; mechanism4)如果依賴的版本是 RELEASE OR ?LATEST ,則基于更新策略讀取所有遠程倉庫的 元數(shù)據(jù) groupId/artifactId/maven-metadata.xml,將其與本地倉庫的對應元數(shù)據(jù)合并后,計算出 RELEASE OR ?LATEST 真實的值,然后基于該值檢查本地倉庫 和 遠程倉庫; mechanism5)如果依賴的版本是 SNAPSHOT,則基于更新策略讀取所有遠程倉庫的元數(shù)據(jù)?groupId/artifactId/version/ maven-metadata.xml,將其與 ?本地倉庫的對應元數(shù)據(jù)合并后,得到的最新快照版本的值,然后基于該值檢查本地倉庫,或者從 遠程倉庫下載; mechanism6)如果最后解析得到的 構件版本 是 時間戳格式的快照,如 1.4.1-200911-4.121450-121,則復制其時間戳格式的文件 至 非時間戳格式,如 SNAPSHOT ,并使用該 非 時間戳格式的構件; ....... 此處省略1000字
【7】 鏡像 1)intro:如果倉庫X 可以提供倉庫 Y 存儲的所有內(nèi)容,那么就可以人為 X 是 Y 的一個鏡像;換句話說,任何一個可以從倉庫Y 獲得的構件,都能夠從他的鏡像中獲取;(干貨——鏡像的定義) 2)編輯 settings.xml,配置中央倉庫鏡像 <mirrors><!-- mirror| Specifies a repository mirror site to use instead of a given repository. The repository that| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.|<mirror><id>mirrorId</id><mirrorOf>repositoryId</mirrorOf><name>Human Readable Name for this Mirror.</name><url>http://my.repository.com/repo/path</url></mirror>--></mirrors>
對上述代碼的分析(Analysis):mirrorOf 指定了 中央倉庫的鏡像;
3)鏡像的另一種用法是結合 私服:任何需要的構件都可以從私服獲得,私服就是所有倉庫的鏡像;
4)為了滿足一些復雜的要求,maven 還支持更高級的鏡像配置:
【8】倉庫搜索服務 1)problem+solution: 1.1)problem:如何尋找需要的依賴,因為添加 maven 依賴需要提供所確切的 maven 坐標; 1.2)使用 maven 倉庫搜索服務 ?Sonatype Nexus(https://repository.sonatype.org/) ?http://mvnbrowser.com/ http://mvnrepository.com/?(訪問速度最快)
總結
以上是生活随笔為你收集整理的maven(6)仓库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 客厅颜色的风水讲究 客厅颜色的风水讲究有
- 下一篇: 苹果原装耳机如何真假辨别