maven修改本地倉庫,遠程倉庫與中央倉庫

来源:http://www.cnblogs.com/cnblog-long/archive/2017/03/24/6611383.html
-Advertisement-
Play Games

什麼是Maven倉庫 在不用Maven的時候,比如說以前我們用Ant構建項目,在項目目錄下,往往會看到一個名為/lib的子目錄,那裡存放著各類第三方依賴jar文件,如 log4j.jar,junit.jar等等。每建立一個項目,你都需要建立這樣的一個/lib目錄,然後複製一對jar文件,這是很明顯的 ...


什麼是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.  

     

?

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。本文還介紹瞭如何安裝構件到本地倉庫,如何分發構件至倉庫。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • http://jingyan.baidu.com/article/e8cdb32b420ce737052badc4.html ...
  • JAVA 類總結 最近看了遍java內部類相關的一些內容,做一些總結。與個人博客 zhiheng.me 同步發佈,標題: JAVA 類總結。 頂級類與嵌套類 定義在某個類(或介面,下同)內部的類,稱為嵌套類(nested class),相應的,其所在的類稱之為該類的外圍類(enclosing cla ...
  • 一、環境搭建: 1、需要用的包: JUnit4.7:http://files.cnblogs.com/files/ShawnYang/junit4.7.zip hamcrest-1.2:http://files.cnblogs.com/files/ShawnYang/hamcrest-1.2.zip ...
  • 當你開發一個客戶端應用程式的時候,往往一個單頁會包含很多子模塊,在不同的平臺下,這些子模塊又被叫成子View(視圖),或者子Component(組件)。越是複雜的頁面,被切割出來的子模塊就越多,子模塊越多,彼此之間需要同步的數據和狀態就越頻繁,即易產生耦合。那麼如何保證在複雜業務情況下,各個子模塊之 ...
  • 一、基本概述 單件模式:確保一個類只有一個實例,並提供一個全局訪問點。 解析如下: 1)首先,該Singleton的構造函數必須是私有的,以保證客戶程式不會通過new()操作產生一個實例,達到實現單例的目的; 2)因為靜態變數的生命周期跟整個應用程式的生命周期是一樣的,所以可以定義一個私有的靜態全局 ...
  • 系統可用率 多級緩存 動態分組切換 DB物理隔離 服務分組隔離 跨機房隔離 漏斗模型 DB限流 系統一般可以分為前端應用系統和後端資料庫系統,前端應用系統實施分散式集群部署技術上是... ...
  • MVVM回顧 經過上一篇文章的介紹,相信你對MVVM的設計思想有所瞭解。MVVM的核心思想就是解耦,View與ViewModel應該感受不到彼此的存在。 View只關心怎樣渲染,而ViewModel只關心怎麼處理邏輯,整個架構由數據進行驅動。不僅View與ViewModel彼此解耦,ViewMode ...
  • Facebook 在2015.9.15發佈了 React Native for Android,把JavaScript 開發技術擴展到了Android平臺。React Native 讓開發者使用 JavaScript 和 React 編寫應用,利用相同的核心代碼就可以創建 基於Web,iOS 和 A... ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...