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代码 

?

< 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. ?

    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代码 

?

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代码 收藏代码

?

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代码 

?

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.  收藏代码

?

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代码 

?

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代码 

?

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.mzph.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…