本地仓库
Maven一个很突出的功能就是jar包管理,一旦工程需要依赖哪些jar包,只需要在Maven的pom.xml配置一下,该jar包就会自动引入工程目录。初次听来会觉得很神奇,下面我们来探究一下它的实现原理。
首先,这些jar包肯定不是没爹没娘的孩子,它们有来处,也有去处。集中存储这些jar包(还有插件等)的地方被称之为仓库(Repository)。
不管这些jar包从哪里来的,必须存储在自己的电脑里之后,你的工程才能引用它们。类似于电脑里有个客栈,专门款待这些远道而来的客人,这个客栈就叫做本地仓库。
比如,工程中需要依赖spring-core这个jar包,在pom.xml中声明之后,maven会首先在本地仓库中找,如果找到了很好办,自动引入工程的依赖lib库即可。可是,万一找不到呢?实际上这种情况经常发生,尤其初次使用maven的时候,本地仓库肯定是空无一物的,这时候就要靠maven大展神通,去远程仓库去下载。
远程仓库
说到远程仓库,先从最核心的中央仓库开始,中央仓库是默认的远程仓库,maven在安装的时候,自带的默认中央仓库地址为http://repo1.maven.org/maven2/,此仓库由Maven社区管理,包含了绝大多数流行的开源Java构件,以及源码、作者信息、SCM、信息、许可证信息等。一般来说,简单的Java项目依赖的构件都可以在这里下载到。Maven社区提供了一个中央仓库的搜索地址:http://search.maven.org/#browse,可以查询到所有可用的库文件。
除了中央仓库,还有其它很多公共的远程仓库,如中央仓库的镜像仓库。全世界都从中央仓库请求资源,累死宝宝了,所以在世界各地还有很多中央仓库的镜像仓库。镜像仓库可以理解为仓库的副本,会从原仓库定期更新资源,以保持与原仓库的一致性。从仓库中可以找到的构件,从镜像仓库中也可以找到,直接访问镜像仓库,更快更稳定。
除此之外,还有很多各具特色的公共仓库,如果需要都可以在网上找到,比如Apache Snapshots仓库,包含了来自于Apache软件基金会的快照版本。
实际开发中,一般不会使用maven默认的中央仓库,现在业界使用最广泛的仓库地址为: http://mvnrepository.com/,比默认的中央仓库更快、更全、更稳定,谁用谁知道。
下面就是spring-core的最新版本在该仓库的信息:
一般来讲,公司都会通过自己的私有服务器在局域网内架设一个仓库代理。私服可以看作一种特殊的远程仓库,代理广域网上的远程仓库,供局域网内的Maven用户使用。当Maven需要下载构件的时候,先从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。
Maven私服有很多好处:
1.可以把公司的私有jar包,以及无法从外部仓库下载到的构件上传到私服上,供公司内部使用;
2.节省自己的外网带宽:减少重复请求造成的外网带宽消耗;
2.加速Maven构建:如果项目配置了很多外部远程仓库的时候,构建速度就会大大降低;
4.提高稳定性,增强控制:Internet不稳定的时候,maven构建也会变的不稳定,一些私服软件还提供了其他的功能
当前主流的maven私服有Apache的Archiva、JFrog的Artifactory以及Sonatype的Nexus。
上面提到的中央仓库、中央仓库的镜像仓库、其他公共仓库、私服都属于远程仓库的范畴。
如果maven没有在本地仓库找到想要的东西,就会自动去配置文件中指定的远程仓库寻找,找到后将它下载到你的本地仓库。如果连远程仓库都找不到想要的东西,maven很生气,累老子跑了一圈都没找到,肯定是你配置写错了,报错给你看。
仓库的配置
仓库配置要做两件事,一是告诉maven你的本地仓库在哪里,二是你的远程仓库在哪里。
顾名思义,setting.xml的第一个节点<localRepository>就是配置本地仓库的地方,不用赘言。
远程仓库的配置有些复杂,因为会涉及很多附属特性。下面以一切从实际出发,看看使用私服的情况下如何配置远程仓库。稍微像样的公司都会建立自己的私服,如果一个公司连自己的私服都没有(别管是因为买不起服务器还是技术上做不到),你可以考虑一下跳槽的问题了。
现在最流行的maven仓库管理器就是大名鼎鼎的Nexus(发音[?n?ks?s],英文中代表“中心、魔枢”的意思),它极大地简化了自己内部仓库的维护和外部仓库的访问。利用Nexus可以只在一个地方就能够完全控制访问和部署在你所维护仓库中的每个Artifact。Nexus是一套“开箱即用”的系统不需要数据库,它使用文件系统加Lucene来组织数据。
至于Nexus怎么部署,怎么维护仓库,作为开发人员是不需要关心的,只需要把Nexus私服的局域网地址写入maven的本地配置文件即可。具体的配置方法如下:
1、设置镜像
<mirrors> <mirror> <!--该镜像的唯一标识符。id用来区分不同的mirror元素。 --> <id>nexus</id> <!-- 镜像名,起注解作用,应做到见文知意。可以不配置 --> <name>Human Readable Name </name> <!-- 所有仓库的构件都要从镜像下载 --> <mirrorOf>*</mirrorOf> <!-- 私服的局域网地址--> <url>http://192.168.0.1:8081/nexus/content/groups/public/</url> </mirror> </mirrors>节点<mirrors>下面可以配置多个镜像,<mirrorOf>用于指明是哪个仓库的镜像,上例中使用通配符“*”表明该私服是所有仓库的镜像,不管本地使用了多少种远程仓库,需要下载构件时都会从私服请求。
如果只想将私服设置成某一个远程仓库的镜像,使用<mirrorOf>指定该远程仓库的ID即可。
2、设置远程仓库
远程仓库的设置是在<profile>节点下面:
<repositories> <repository> <!--仓库唯一标识 --> <id>repoId </id> <!--远程仓库名称 --> <name>repoName</name> <!--远程仓库URL,如果该仓库配置了镜像,这里的URL就没有意义了,因为任何下载请求都会交由镜像仓库处理,前提是镜像(也就是设置好的私服)需要确保该远程仓库里的任何构件都能通过它下载到 --> <url>http://……</url> <!--如何处理远程仓库里发布版本的下载 --> <releases> <!--true或者false表示该仓库是否为下载某种类型构件(发布版,快照版)开启。 --> <enabled>false</enabled> <!-- 该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。这里的选项是:--> <!-- always(一直),daily(默认,每日),interval:X(这里X是以分钟为单位的时间间隔),或者never(从不)。 --> <updatePolicy>always</updatePolicy> <!--当Maven验证构件校验文件失败时该怎么做:--> <!--ignore(忽略),fail(失败),或者warn(警告)。 --> <checksumPolicy>warn</checksumPolicy> </releases> <!--如何处理远程仓库里快照版本的下载,与发布版的配置类似 --> <snapshots> <enabled/> <updatePolicy/> <checksumPolicy/> </snapshots> </repository> </repositories>可以配置多个远程仓库,用<id>加以区分。
除此之外,还有一个与<repositories>并列存在<pluginRepositories>节点,用来配置插件的远程仓库。
仓库主要存储两种构件。第一种构件被用作其它构件的依赖,最常见的就是各类jar包。这是中央仓库中存储的大部分构件类型。另外一种构件类型是插件,Maven插件是一种特殊类型的构件。由于这个原因,插件仓库独立于其它仓库。<pluginRepositories>节点与<repositories>节点除了根节点的名字不一样,子元素的结构与配置方法完全一样:
<pluginRepositories> <pluginRepository> <id /> <name /> <url /> <releases> <enabled /> <updatePolicy /> <checksumPolicy /> </releases> <snapshots> <enabled /> <updatePolicy /> <checksumPolicy /> </snapshots> </pluginRepository> </pluginRepositories>远程仓库有releases和snapshots两组配置,POM就可以在每个单独的仓库中,为每种类型的构件采取不同的策略。例如,有时候会只为开发目的开启对快照版本下载的支持,就需要把<releases>中的<enabled >设为“false”,而<snapshots>中的<enabled >设为“true”。
由于远程仓库的配置是挂在<profile>节点下面,如果配置有多个<profile>节点,那么就可能有多种远程仓库的设置方案,该方案是否生效是由它的父节点<profile>是否被激活决定的。
3、设置发布权限
私服的作用除了可以给全公司的人提供maven构件的下载,还有一个非常重要的功能,就是开发者之间的资源共享。
一个大的项目往往是分模块进行开发的,各个模块之间存在依赖关系,比如一个交易系统,分为下单模块、支付模块、购物车模块等。现在开发下单模块的同学需要调用支付模块中的接口来完成支付功能,就需要将支付模块的某些jar包引入本地工程,才能调用它的接口;同时,开发购物车模块的同学需要调用下单模块的接口,来完成下单功能,他就需要依赖下单模块的某些jar包。这三个模块都在持续开发中,不可能将各自的源码传来传去支持对方的依赖。
解决的方式是这样,每个模块完成了某个阶段性的功能,都会将提供对外服务的接口打成jar包,传到公司的私服当中,谁要使用该模块的功能,只需要在pom.xml文件中声明一下,maven就会像下载其他jar包那样把它引入你的工程。
在开发过程中,在pom中声明的构件版本一般是快照版:
<dependency> <groupId>com.yourCompany.trade</groupId> <artifactId>trade-pay</artifactId> <version>1.0.2-SNAPSHOT</version> </dependency>各个模块会不断的上传新的jar包,如果本地项目依赖的是快照版,那么maven一旦发现该jar包有新的发布,就会将它下载下来替代以前的旧版本。比如,支付模块在测试的时候发现有个bug,修复了一下,然后将快照版发布到私服。而你只需要专注于下单模块的开发,所依赖的支付模块的更新由maven处理,不需要关心。一旦你开发的模块修复了一个bug,或者添加了一个新功能等修改,只需要将发布一次快照版本到私服即可,谁需要依赖你的接口谁自然会去私服下载,你也不用关心。
一般私服建立完毕之后不需要认证就可以访问,但是风险有多大,可以自己想象,比如有天女秘书不小心把她跟老板的艳照传到了私服,开发的同学就没心思干活了吧……所以私服的权限设置还是很有必要的。
这时就需要使用setting.xml中的servers元素了。需要注意的是,配置私服的信息是在pom文件中,但是认证信息则是在setting.xml中,这是因为pom文件往往是被提交到代码仓库中供所有成员访问的,而setting.xml是存放在本地的,这样是安全的。
在settings.xml中,配置具有发布发布版本和快照版本权限的用户:
上面的id是server的id,不是用户登陆的id,该id与distributionManagement中repository元素的id相匹配。maven是根据pom中的repository和distributionMnagement元素来找到匹配的发布地址:
注意:pom中的id必须与setting.xml中配置好的id一致。
然后运行maven cleandeploy命令,将自己开发的构件部署在私服上供组织内其他用户使用(maven clean deploy和maven clean install的区别:deploy是将该构件部署在私服中,而install是将构件存入自己的本地仓库中)。
在这里有人可能会有一个疑问,所有的仓库设置不是已经在setting.xml中配置好了吗,为什么在pom的发布管理节点当中还要配置一个url?
Setting.xml中配置的是你从哪里下载构件,而这里配置的是你要将构件发布到哪里。有时候可能下载用的仓库与上传用的仓库是两个地址,但是绝大多数情况下,两者都是由私服充当,就是说两者是同一个地址。
Maven之(五)Maven仓库
时间: 2024-10-15 02:47:37
Maven之(五)Maven仓库的相关文章
Maven学习 五 Maven项目创建(1)jar项目
第一步:Maven项目的创建 File->new->Maven project. 点击下一步 上方的两个多选框选上,第一个是不使用archetype 原型模板,第二个是使用默认工作空间 点击next Group ID : 公司名.公司网址倒写 Artifact ID : 项目名 Version : 版本 0.0.1-SNAPSHOT快照版,也可以写成1.0之类的版本号,作用不是很大,只有在以后搭建私服时候有作用 Packaging: 项目的打包方式,也就是指定项目最终会打成什么包,有jar
Maven学习笔记(五):仓库
何为Maven仓库: 在Maven世界中,任何一个依赖.插件或者项目构建的输出,都可以称为构件.例如,依赖log4j-1.2.15.jar是一个构件,插件maven-compiler-plugin-2.0.2.jar是一个构件.任何一个构件都有一组坐标唯一标识. 得益于坐标机制,任何Maven项目使用任何一个构件的方式都是完全相同的.在此基础上,Maven可以在某个位置统一存储所有Maven项目共享的构件,这个统一的位置就是仓库.实际的Maven项目将不再各自存储其他依赖文件,它们只需要声明这些
Maven 系列 五 :使用Nexus搭建Maven私服
1 . 私服简介 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件.有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓库:否则,私服请求外部的远程仓库,将构件下载到私服,再提供给本地仓库下载. 我们可以使用专门的 Maven 仓库管理软件来搭建私服,比如:Apache Archiva,Artifactory,Sonatype Nexus.这
Maven学习笔记之——仓库(中)
Maven学习笔记之--仓库(中) 1. 远程仓库的配置 当出现默认的中央仓库无法满足我们的需求或者连接不上的时候.我们可以通过POM文件来指定远程仓库. <repositories> <repository> <id>jboss-maven2-release-repository</id> <name>JBoss Repository</name> <url>http://repository.jboss.org/
使用Nexus搭建Maven私服--【不提供外网给项目组人员,因此就不能使用maven访问远程的仓库地址】
一.搭建nexus私服的目的 为什么要搭建nexus私服,原因很简单,有些公司都不提供外网给项目组人员,因此就不能使用maven访问远程的仓库地址,所以很有必要在局域网里找一台有外网权限的机器,搭建nexus私服,然后开发人员连到这台私服上,这样的话就可以通过这台搭建了nexus私服的电脑访问maven的远程仓库. 1.1.Nexus架构 二.nexus私服的下载和安装 2.1.nexus下载 去下载最新版本的nexus,下载地址:http://www.sonatype.org/nexus/go
maven阿里云中央仓库
该死的 oschina的库,我还以为还活着呢. 因为网上检索出来的, 都是oschina的例子. 后来才发觉竟然是死的,我其实一直在用 jcenter. 于是找到下面的文章,估计好用.还没试. http://blog.csdn.net/u010717403/article/details/52188496 maven阿里云中央仓库maven作为一个项目管理工具确实非常好用,但是在国内这个网络条件下实在是让人恼火.之前oschina的中央仓库可用,现在oschina的maven服务器关了,一直没找
Maven核心概念之仓库,生命周期与插件
宏观图 一.仓库 统一存储全部Maven项目共享的构建的位置就是仓库. 仓库分为本地仓库和远程仓库.远程仓库又分为中央仓库(中央仓库是Maven核心自带的远程仓库),伺服(还有一种特殊的远程仓库,为节省宽带和时间,在局域网内架设的一个私有的仓库server,用其代理全部的外部的远程仓库.内部项目也能部署到伺服上),其它公开的远程仓库(常见的由Java.net Maven库,Jboss Maven库). Maven依据坐标寻找构件的时候,它首先会查看本地仓库,假设本地仓库存在此构件,则直接使用:假
Maven整理笔记のMaven仓库
Maven坐标和依赖是任何一个构件在Maven世界中的逻辑表示方式:而构件的物理表示方式是文件,Maven通过仓库来统一管理这些文件. Maven仓库 在Maven的世界中,任何一个依赖.插件或者项目构建的输出,都可以称为一个构件.如项目依赖log4j-1.2.15.jar是一个构件,插件maven-compiler-plugin-2.0.3.jar是一个构件,我们自己的Maven项目构建完成后的输出.jar/war文件也是一个构件.任何一个构件都有一组坐标唯一标识.在我们项目开发中,往往可能
Maven之——Nexus创建仓库
Maven之--Nexus创建仓库 1. 创建宿主仓库 我们可以使用Maven内置的宿主仓库.发布版的Release.快照版的Snapshot.也可以自己创建宿主仓库.步骤如下: Release宿主仓库: 如上图操作.选择添加一个宿主仓库.下面的参数都可以将鼠标放在?上获取具体信息.这里只对重要的做说明:Repository Type 值为Relaese时.表示此宿主仓库是发布版.值为Snapshot时.表示此宿主仓库为快照版.Deployment用来配置此仓库的部署策略.选项有禁止部署(
Maven学习笔记之——仓库(上)
Maven学习笔记之--仓库(上) 1. 何为maven仓库 Maven可以在某一指定位置统一存放所有maven项目共享的构件.此指定位置就是maven仓库.实际的项目将不再自己存放其所依赖的构件.他们只需要声明这些依赖的坐标.在需要的时候就会自动根据坐标找到仓库中的构件.并使用他们. 仓库的意义:减少磁盘占用空间.去除大量重复的构件.尤其是项目越来越多.越来越大的时候.更便于统一管理所有控件. 2. 仓库的布局 任何一个构件都有其唯一的坐标.根据这个坐标可以定义其在仓库中的唯一存储