maven如何修改本地倉庫與中央倉庫

什么是Maven倉庫

在不用Maven的時候,比如說以前我們用Ant構建項目,在項目目錄下,往往會看到一個名為/lib的子目錄,那里存放著各類第三方依賴jar文件,如 log4j.jar,junit.jar等等。每建立一個項目,你都需要建立這樣的一個/lib目錄,然后復制一對jar文件,這是很明顯的重復。重復永 遠是噩夢的起點,多個項目不共用相同的jar文件,不僅會造成磁盤資源的浪費,也使得版本的一致性管理變得困難。此外,如果你使用版本管理工具,如 SVN(你沒有使用版本管理工具?馬上試試SVN吧,它能幫你解決很多頭疼的問題),你需要將大量的jar文件提交到代碼庫里,可是版本管理工具在處理二 進制文件方面并不出色。

Maven倉庫就是放置所有JAR文件(WAR,ZIP,POM等等)的地方,所有Maven項目可以從同一個Maven倉庫中獲取自己所需要的依賴 JAR,這節省了磁盤資源。此外,由于Maven倉庫中所有的JAR都有其自己的坐標,該坐標告訴Maven它的組ID,構件ID,版本,打包方式等等, 因此Maven項目可以方便的進行依賴版本管理。你也不在需要提交JAR文件到SCM倉庫中,你可以建立一個組織層次的Maven倉庫,供所有成員使用。

簡言之,Maven倉庫能幫助我們管理構件(主要是JAR)。

?

本地倉庫 vs. 遠程倉庫

運行Maven的時候,Maven所需要的任何構件都是直接從本地倉庫獲取的。如果本地倉庫沒有,它會首先嘗試從遠程倉庫下載構件至本地倉庫,然后再使用本地倉庫的構件。

比如說,你的項目配置了junit-3.8的依賴,在你運行mvn test?的 時候,Maven需要使用junit-3.8的jar文件,它首先根據坐標查找本地倉庫,如果找到,就直接使用。如果沒有,Maven會檢查可用的遠程倉 庫配置,然后逐個嘗試這些遠程倉庫去下載junit-3.8的jar文件,如果遠程倉庫存在該文件,Maven會將其下載到本地倉庫中,繼而使用。如果嘗 試過所有遠程倉庫之后,Maven還是沒能夠下載到該文件,它就會報錯。

Maven缺省的本地倉庫地址為${user.home}/.m2/repository?。也就是說,一個用戶會對應的擁有一個本地倉庫。

你也可以自定義本地倉庫的位置,修改${user.home}/.m2/settings.xml?:

Xml代碼?

?

1?
2?
3?
4?
5?
<?settings?>??
???...??
???<?localRepository?>D:\java\repository</?localRepository?>??
???...??
</?settings?>

你還可以在運行時指定本地倉庫位置:

mvn clean install -Dmaven.repo.local=/home/juven/myrepo/

還有一點需要理解的是,當我們運行install的時候,Maven實際上是將項目生成的構件安裝到了本地倉庫,也就是說,只有install了之后,其它項目才能使用此項目生成的構件。

了解了本地倉庫,接著了解一下Maven缺省的遠程倉庫,即Maven中央倉庫。

安裝好Maven之后,我們可以建立一個簡單的項目,配置一些簡單的依賴,然后運行mvn clean install,項目就構建好了。我們沒有手工的去下載任何jar文件,這一切都是因為Maven中央倉庫的存在,當Maven在本地倉庫找不到需要的 jar文件時,它會查找遠程倉庫,而一個原始的Maven安裝就自帶了一個遠程倉庫——Maven中央倉庫。

這個Maven中央倉庫是在哪里定義的呢?在我的機器上,我安裝了maven-2.0.10,我可以找到這個文件:${M2_HOME}/lib/maven-2.0.10-uber.jar?,打開該文件,能找到超級POM:\org\apache\maven\project\pom-4.0.0.xml?,它是所有Maven POM的父POM,所有Maven項目繼承該配置,你可以在這個POM中發現如下配置:

Xml代碼?

  1. ?

    1?
    2?
    3?
    4?
    5?
    6?
    7?
    8?
    9?
    10?
    11?
    <?repositories?>??
    ???<?repository?>??
    ?????<?id?>central</?id?>??
    ?????<?name?>Maven?Repository?Switchboard</?name?>??
    ?????<?layout?>default</?layout?>??
    ?????<?url?>http://repo1.maven.org/maven2</?url?>??
    ?????<?snapshots?>??
    ???????<?enabled?>false</?enabled?>??
    ?????</?snapshots?>??
    ???</?repository?>??
    </?repositories?>

關于遠程倉庫的配置,下面的小節我會詳細解釋,這里我們只要知道,中央倉庫的id為central,遠程url地址為http://repo1.maven.org/maven2,它關閉了snapshot版本構件下載的支持。

?

在POM中配置遠程倉庫

前面我們看到超級POM配置了ID為central的遠程倉庫,我們可以在POM中配置其它的遠程倉庫。這樣做的原因有很多,比如你有一個局域網的遠程倉 庫,使用該倉庫能大大提高下載速度,繼而提高構建速度,也有可能你依賴的一個jar在central中找不到,它只存在于某個特定的公共倉庫,這樣你也不 得不添加那個遠程倉庫的配置。

這里我配置一個遠程倉庫指向中央倉庫的中國鏡像:

Xml代碼?

?

1?
2?
3?
4?
5?
6?
7?
8?
9?
10?
11?
12?
13?
14?
15?
16?
17?
18?
19?
20?
21?
22?
23?
24?
25?
26?
27?
28?
29?
30?
<?project?>??
...??
???<?repositories?>??
?????<?repository?>??
???????<?id?>maven-net-cn</?id?>??
???????<?name?>Maven?China?Mirror</?name?>??
???????<?url?>http://maven.net.cn/content/groups/public/</?url?>??
???????<?releases?>??
?????????<?enabled?>true</?enabled?>??
???????</?releases?>??
???????<?snapshots?>??
?????????<?enabled?>false</?enabled?>??
???????</?snapshots?>??
?????</?repository?>??
???</?repositories?>??
???<?pluginRepositories?>??
?????<?pluginRepository?>??
???????<?id?>maven-net-cn</?id?>??
???????<?name?>Maven?China?Mirror</?name?>??
???????<?url?>http://maven.net.cn/content/groups/public/</?url?>??
???????<?releases?>??
?????????<?enabled?>true</?enabled?>??
???????</?releases?>??
???????<?snapshots?>??
?????????<?enabled?>false</?enabled?>??
???????</?snapshots?>??????
?????</?pluginRepository?>??
???</?pluginRepositories?>??
...??
</?project?>

關于<repositories>的更詳細的配置及相關解釋,請參考:http://www.sonatype.com/books/maven-book/reference_zh/apas02s08.html。

至于<pluginRepositories>,這是配置Maven從什么地方下載插件構件(Maven的所有實際行為都由其插件完成)。該元素的內部配置和<repository>完全一樣,不再解釋。

?

在settings.xml中配置遠程倉庫

我們知道了如何在POM中配置遠程倉庫,但考慮這樣的情況:在一個公司內部,同時進行這3個項目,而且以后隨著這幾個項目的結束,越來越多的項目會開始; 同時,公司內部建立一個Maven倉庫。我們統一為所有這些項目配置該倉庫,于是不得不為每個項目提供同樣的配置。問題出現了,這是重復?!

其實我們可以做到只配置一次,在哪里配置呢?就是settings.xml。

不過事情沒有那么簡單,不是簡單的將POM中的<repositories>及<pluginRepositories>元素復制到settings.xml中就可以,setting.xml不直接支持?這兩個元素。但我們還是有一個并不復雜的解決方案,就是利用profile,如下:

Xml代碼?收藏代碼

?

1?
2?
3?
4?
5?
6?
7?
8?
9?
10?
11?
12?
13?
<?settings?>??
???...??
???<?profiles?>??
?????<?profile?>??
???????<?id?>dev</?id?>??
???????<!--?repositories?and?pluginRepositories?here-->???
?????</?profile?>??
???</?profiles?>??
???<?activeProfiles?>??
?????<?activeProfile?>dev</?activeProfile?>??
???</?activeProfiles?>??
???...??
</?settings?>
  1. 使用profile為settings.xml添加倉庫提供了一種用戶全局范圍的倉庫配置。

?

鏡像

如果你的地理位置附近有一個速度更快的central鏡像,或者你想覆蓋central倉庫配置,或者你想為所有POM使用唯一的一個遠程倉庫(這個遠程倉庫代理的所有必要的其它倉庫),你可以使用settings.xml中的mirror配置。

以下的mirror配置用maven.net.cn覆蓋了Maven自帶的central:

Xml代碼?

?

1?
2?
3?
4?
5?
6?
7?
8?
9?
10?
11?
12?
<?settings?>??
...??
???<?mirrors?>??
?????<?mirror?>??
???????<?id?>maven-net-cn</?id?>??
???????<?name?>Maven?China?Mirror</?name?>??
???????<?url?>http://maven.net.cn/content/groups/public/</?url?>??
???????<?mirrorOf?>central</?mirrorOf?>??
?????</?mirror?>??
???</?mirrors?>??
...??
</?settings?>
  1. Xml代碼

  2. ?收藏代碼

?

1?
2?
3?
4?
5?
6?
7?
8?
9?
10?
11?
12?
<?settings?>??
...??
???<?mirrors?>??
?????<?mirror?>??
???????<?id?>my-org-repo</?id?>??
???????<?name?>Repository?in?My?Orgnization</?name?>??
???????<?url?>http://192.168.1.100/maven2</?url?>??
???????<?mirrorOf?>*</?mirrorOf?>??
?????</?mirror?>??
???</?mirrors?>??
...??
</?settings?>
  1. 關于更加高級的鏡像配置,可以參考:http://maven.apache.org/guides/mini/guide-mirror-settings.html。

?

分發構件至遠程倉庫

mvn install?會將項目生成的構件安裝到本地Maven倉庫,mvn deploy?用來將項目生成的構件分發到遠程Maven倉庫。本地Maven倉庫的構件只能供當前用戶使用,在分發到遠程Maven倉庫之后,所有能訪問該倉庫的用戶都能使用你的構件。

我們需要配置POM的distributionManagement來指定Maven分發構件的位置,如下:

Xml代碼?

?

1?
2?
3?
4?
5?
6?
7?
8?
9?
10?
11?
12?
13?
14?
15?
16?
<?project?>????
???...????
???<?distributionManagement?>????
?????<?repository?>????
???????<?id?>nexus-releases</?id?>????
???????<?name?>Nexus?Release?Repository</?name?>????
???????<?url?>http://127.0.0.1:8080/nexus/content/repositories/releases/</?url?>????
?????</?repository?>????
?????<?snapshotRepository?>????
???????<?id?>nexus-snapshots</?id?>????
???????<?name?>Nexus?Snapshot?Repository</?name?>????
???????<?url?>http://127.0.0.1:8080/nexus/content/repositories/snapshots/</?url?>????
?????</?snapshotRepository?>????
???</?distributionManagement?>????
???...????
</?project?>

一般來說,分發構件到遠程倉庫需要認證,如果你沒有配置任何認證信息,你往往會得到401錯誤。這個時候,如下在settings.xml中配置認證信息:

Xml代碼?

?

1?
2?
3?
4?
5?
6?
7?
8?
9?
10?
11?
12?
13?
14?
15?
16?
<?settings?>????
???...????
???<?servers?>????
?????<?server?>????
???????<?id?>nexus-releases</?id?>????
???????<?username?>admin</?username?>????
???????<?password?>admin123</?password?>????
?????</?server?>????
?????<?server?>????
???????<?id?>nexus-snapshots</?id?>????
???????<?username?>admin</?username?>????
???????<?password?>admin123</?password?>????
?????</?server?>??????
???</?servers?>????
???...????
</?settings?>

?

小結

本文介紹了Maven倉庫,它是什么?本地倉庫,遠程倉庫,中央倉庫具體是指什么?并介紹了如何在POM中配置項目層次的倉庫,在settings中配置用戶層次的倉庫,以及mirror。本文還介紹了如何安裝構件到本地倉庫,如何分發構件至倉庫。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/249401.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/249401.shtml
英文地址,請注明出處:http://en.pswp.cn/news/249401.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Maven項目 之eclipse操作篇

使用eclipse創建maven項目大家應該都很熟悉&#xff0c;這里主要說明如何將已創建的非maven項目修改為maven項目。 1.創建測試項目 創建一個Dynamic Web Project &#xff0c;項目結構如圖。 2.配置工程類型 右擊項目--> Properties --> Project Facets&#xff0c;勾選…

前端jQuery基本語法

jQuery基礎語法 #不管找什么標簽&#xff0c;用什么選擇器&#xff0c;都必須要寫$("")&#xff0c;引號里面再寫選擇器&#xff0c;通過jQuery找到的標簽對象就是一個jQuery對象&#xff0c;用原生JS找到的標簽對象叫做DOM對象。二者可以相互轉換。$()[0]:就是jQuer…

網絡工程:3.1 RIP(Routing Information Protocol)協議

遵循協議&#xff1a; 1、特網rip1標準文件&#xff1a;rfc1058 網站 &#xff1a; https://tools.ietf.org/html/rfc1058 2、因特網rip2標準文件&#xff1a;rfc1723 網站 &#xff1a;https://tools.ietf.org/html/rfc1723 使用工具&#xff1a; GNS3 使用路由器文件&a…

為什么要有 hash 和 history

https://www.cnblogs.com/zhaobao1830/p/9269042.html

2:word定制工作界面

1.2&#xff0c;定制工作界面 一、功能區的折疊和展開 設計選項----右上方的向上的箭頭 功能區的選項&#xff1a;三個&#xff1a;自動隱藏功能區&#xff0c;顯示選項卡&#xff0c;顯示選項卡和命令 二、定制快速訪問工具欄 如何將一些常用的命令放到一個能便捷找到的地方 第…

JBPM中 使用JobExecutor執行timer定義的job

Job executor在jbpm.cfg.xml中是被缺省注釋的&#xff0c;所以只要去掉此行即可通過JobExecutor來定時觸發timer中的event-handler了 Xml代碼 <jbpm-configuration><import resource"jbpm.default.cfg.xml" /><import resource"jbpm.businessca…

二維碼生成

從vs Nugets搜索ThoughtWorks.QRCode下載ThoughtWorks.QRCode.dll private byte[] CreateQrcode(string code){ string enCodeString code;QRCodeEncoder qrCodeEncoder new QRCodeEncoder();qrCodeEncoder.QRCodeEncodeMode QRCodeEncoder.ENCODE_MODE.BYTE;qrCodeEncod…

vue created

https://blog.csdn.net/xdnloveme/article/details/78035065

Qt打開文件對話框同時選中多個文件或單個文件

Qt中打開單個文件 //str_path為文件路徑 QString str_path QFileDialog::getOpenFileName(this, tr("選擇轉碼文件"), tr("/home"), tr("視頻文件(*.mp4 *.m3u8);;所有文件&#xff08;*.*);;")); 打開多個文件 QString strs; QStringList file…

Activiti Explorer安裝

Activiti Explorer安裝 分類&#xff1a; activiti 2014-05-06 19:11 349人閱讀 評論(0) 收藏 舉報 一、Activiti Explorer介紹 流程引擎的用戶控制臺。使用它來啟動新流程&#xff0c;分配任務&#xff0c;查看并認領任務&#xff0c;等等。這個工具也可以用來管理Activ…

一招明白URL和URI的區別

URL和URI的區別(示例)&#xff1a; URL[統一資源定位器]&#xff1a; http://localhost:8080/api/account/queryAccountInfoURI[統一資源定位符]&#xff1a; /api/account/queryAccountInfo解釋&#xff1a;說白了&#xff0c;可以認為url是絕對路徑&#xff0c;uri是相對路徑…

JS ES6中export和import詳解

1.Export 模塊是獨立的文件&#xff0c;該文件內部的所有的變量外部都無法獲取。如果希望獲取某個變量&#xff0c;必須通過export輸出&#xff0c; // profile.js export var firstName Michael; export var lastName Jackson; export var year 1958;或者用更好的方式&am…

巧用地圖

L1-1 天梯賽座位分配&#xff08;20 分&#xff09; 天梯賽每年有大量參賽隊員&#xff0c;要保證同一所學校的所有隊員都不能相鄰&#xff0c;分配座位就成為一件比較麻煩的事情。為此我們制定如下策略&#xff1a;假設某賽場有 N 所學校參賽&#xff0c;第 i 所學校有 M[i] 支…

Mac系統中MongoChef鏈接MongoDB集群的方法

第一步&#xff1a;啟動Mongochef&#xff0c;點擊鏈接按鈕&#xff1b;第二步&#xff1a;打開連接配置面板&#xff0c;填寫數據庫名&#xff1b;第三步&#xff1a;選擇鏈接類型Connection Type&#xff0c;一般分為直接連接和集群鏈接&#xff0c;這里選擇集群鏈接 Replica…

nginx配置文件nginx.conf

user www www;#指定nginx運行的用戶及用戶組,默認為nobodyworker_processes 8;#開啟的線程數&#xff0c;一般跟邏輯CPU核數一致error_log /alidata/log/nginx/error.log crit; #定位全局錯誤日志文件&#xff0c;級別以notice顯示&#xff0c;還有debug,info,warn,error,crit模…

js 中async

一、終極解決 異步操作是 JavaScript 編程的麻煩事&#xff0c;麻煩到一直有人提出各種各樣的方案&#xff0c;試圖解決這個問題。 從最早的回調函數&#xff0c;到 Promise 對象&#xff0c;再到 Generator 函數&#xff0c;每次都有所改進&#xff0c;但又讓人覺得不徹底。…

Python查找指定文件

在當前目錄以及當前目錄的所有子目錄下查找文件名包含指定字符串的文件&#xff0c;并打印出相對路徑&#xff1a; import os testfiles [] testfilepaths [] L len(os.path.abspath(.))def searchfile(path):for item in os.listdir(path):if os.path.isdir(os.path.join(p…

搭建Mock Server

搭建Mock Server 1.為什么要搭建mock-server&#xff1f; 為了更好的分工合作&#xff0c;讓前端能在不依賴后端環境的情況下進行開發&#xff0c;其中一種手段就是為前端開發者提供一個 web 容器&#xff0c;這個本地環境就是 mock-server。 目前很多前端 mock 數據的方案的…

請問1到10000之前,有多少升數字?(華圖教育面試題)

升數字就是從左向右讀&#xff0c;數值是依次上升的即可&#xff0c;比如123&#xff0c;1256&#xff0c;1389&#xff0c;但是1123&#xff0c;165就不是。以下是我的思路 public static void main(String[] args) {/*** 【請問1到10000之前&#xff0c;有多少升數字&#xf…

crm 一級菜單排序,二級菜單選中并且展開,非菜單權限的歸屬,權限粒度控制到按鈕級別...

排序 /rbac/templatetags/rbac.py from django import template from django.conf import settings import re from collections import OrderedDict register template.Library()register.inclusion_tag(rbac/menu.html) def menu(request):ordered_dictOrderedDict()menu_d…