简介:
得益于Maven坐标机制,任何Maven项目使用任何构件的方式都相同,因此,Maven可以在某个位置统一存储所有Maven项目共享的构件,这个统一的位置就叫仓库。
Maven仓库
仓库分本地仓库和远程仓库,当maven根据坐标寻找构件时,会首先查看本地仓库,如果本地仓库没有,就会去远程仓库查找,找到后下载到本地仓库使用
1.本地仓库
编辑~/.m2/settings.xml配置文件,来修改本地仓库的路径<settings> <localRepository>D:\java\...</localRepository> </settings>
2.中央仓库
Maven默认配置远程仓库地址,下面的pom文件是所有文件都会继承的超级pom。
3.私服
私服是一种特殊的远程仓库,架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用。
- 节省自己的外网带宽
- 加速Maven构建 构建时只需访问局域网
- 部署第三方构件 对于无法从外部远程仓库获得的构件,如,ojdbc.jar。可以自己下载后发布到私服,供内部使用
- 提高稳定性,增强控制 私服(Nexus)提供了 权限管理,release,snapshot区分等
- 降低中央库的负荷
4.远程仓库的配置
大多情况下,默认的中央仓库无法满足项目的需求,需要的构件可能存在另一个远程仓库,如JBoss Maven仓库。我们可以在pom中进行配置
checksumPolicy:配置Maven检查检验和文件的策略,当构件被部署到maven仓库时,会同时部署对应的校验和文件。在下载构件时,maven会验证校验和文件,如果校验和验证失败,当checksumPolicy为warn时,maven会在构建时输出警告信息,fail,让构建失败,ignore,忽略校验和的错误。<repositories> <repository> <id>jboss</id> <name>JBoss Repository</name> <url>http://repository.jboss.com/maven2</url> <!-- 只下载正式发布的版本,不下载快照版本 --> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> <!-- maven从远程仓库检查更新的频率,daily,never,always,interval:X每隔X分钟 --> <updatePolicy>daily</updatePolicy> <checksumPolicy>ignore</checksumPolicy> </snapshots> <layout>default</layout> </repository> </repositories>
5.远程仓库的认证
认证信息必须配置在settings.xml文件中
注意:id必须和项目repository中依赖配置的仓库id一致<servers> <server> <id>nexus-releases</id> <username>admin</username> <password>*******</password> </server> <server> <id>nexus-snapshots</id> <username>admin</username> <password>*******</password> </server> </servers>
从远程仓库下载构件配置
本地构件jar包部署到私服配置<settings> ..... <profiles> <profile> <id>nexus</id> <repositories> <repository> <id>nexus-releases</id> <url>http://nexus-releases</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </repository> <repository> <id>nexus-snapshots</id> <url>http://nexus-snapshots</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </repository> </repositories> </profile> </profiles> ..... <settings>
执行 mvn clean deploy 将项目构件部署到对应的远程仓库<distributionManagement> <!-- 两个ID必须与 setting.xml中的<server><id>nexus-releases</id><server>保持一致 --> <!-- 版本jar包发布到中央仓库 --> <repository> <id>nexus-releases</id> <name>Nexus Release Repository</name> <url>http://***.***.***.***:8081/nexus/content/groups/public</url> </repository> <snapshotRepository> <id>nexus-snapshots</id> <name>Nexus Snapshot Repository</name> <url>http://***.***.***.***:8081/nexus/content/repositories/snapshots</url> </snapshotRepository> </distributionManagement>
6.从仓库解析依赖的机制
镜像
如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。换句话说,任何一个可以从仓库Y获得的构件,都能够从它的镜像中获取
由于私服可以代理任何外部的公共仓库,因此,对于公司内部maven用户来说,使用一个私服就等于使用了所有需要的外部仓库,这样我们就可以将配置集中到私服,从而简化Maven本身的配置<mirrors> <mirror> <id>nexus-releases</id> <mirrorOf>*</mirrorOf> <url>http://***.***.***.***:8081/nexus/content/groups/public</url> </mirror> <mirror> <id>nexus-snapshots</id> <mirrorOf>*</mirrorOf> <url>http://***.***.***.***:8081/nexus/content/repositories/snapshots</url> </mirror> </mirrors>
<mirrorOf>*</mirrorOf> 代表匹配所有远程仓库
注意:镜像仓库会完全屏蔽被镜像仓库,镜像仓库不稳定或停止服务时,Maven将无法访问被镜像仓库,因此无法下载构件。
7.仓库搜索服务
使用maven日常开发时,常见的问题就是如何寻找需要的依赖。
- Sonatype Nexus:Nexus时当前最流行的Maven仓库管理软件,支持关键字搜索,类名搜索,坐标搜索,校验和搜索等功能。
地址:https://repository.sonatype.org/
- MVNrepository:界面友好,个人用的最多
地址:http://mvnrepository.com/
使用Nexus创建私服
私服可以降低中央仓库负荷,节省外网带宽,加速maven构建,自己部署构件等。Bundle包含Jetty容器,可以直接使用war包需要在web容器中跑Bundle方式安装Nexus
- nexus-x.x.x.x/:该目录包含了Nexus运行所需要的文件,启动脚本,依赖jar包等
- sonatype-work:包含nexus生成的配置文件,日志文件,仓库文件等
第一个目录是运行必须的。第二个目录不是必须的,nexus会在运行时动态创建该目录。当需要备份时,直接默认备份sonatype-work/目录就行
- install-nexus.bat:将nexus安装成windows服务
- uninstall-nexus.bat:卸载服务
- start-nexus.bat:启动nexus windows服务
Linux启动Nexus服务:
- ./nexus start:启动服务
- ./nexus stop:停止服务
- ./nexus status:查看后台nexus服务状态
- ./nexus restart:重新启动后台的nexus服务
修改nexus默认8081端口:nexus-x.x.x.x/conf/nexus.properties application-port属性
nexus内置仓库
4种仓库类型:
- group 仓库组,为每个仓库声明maven配置比较麻烦,直接配置仓库组即可
- hosted 宿主
- proxy 代理
- virtual 虚拟
每个仓库格式为maven2或maven1policy属性:Release 表示该仓库为发布版本。Snapshot表示仓库为快照版本。
虚拟类型仓库的作用是动态地将仓库内容格式转换,及服务maven1格式的仓库。
- Maven Central:代理maven中央仓库,只会下载和缓存中央仓库中的发布版本构件。
- Release:宿主类型仓库,部署组织内部的发布版本构件
- Snapshots:宿主类型仓库,部署组织内部的快照版本构件
- 3rd party:宿主类型仓库,部署无法从公共库获得的第三方发布版本构件,如ojdbc.jar
- Apache Snapshots:代理仓库,代理Apache Maven仓库的快照版本构件
- Public Repositories:仓库组,将所有策略为Release的仓库聚合并通过一致的地址提供服务
如上图:
Maven可以直接从宿主仓库下载构件,也可以从代理仓库下载构件,代理仓库会间接地从远程仓库下载并缓存构件;为了方便,Maven可以从仓库组下载构件,仓库组没有实际内容,它会转向其包含的宿主仓库或代理仓库获得实际的构件。
创建nexus宿主仓库
创建代理仓库
创建仓库组
仓库组所包含的仓库的顺序决定了仓库组遍历的顺序,所以将常用的仓库放在前面可以提高访问效率。
nexus的索引与构件搜索
nexus通过维护仓库的索引来提供搜索功能,在很大程度上方便maven用户定位构件坐标设置maven central代理仓库下载远程索引。
- GVA搜索 允许用户通过groupid,artifactid和version等信息来进行搜索
- 类名搜索 搜索包含某个Java类的构件
- 校验和搜索 允许用户直接使用构件的校验和 来搜索构件
除了下载使用远程仓库的索引,我们也能为宿主仓库和代理仓库建立索引。
对于宿主仓库来说,repair index会扫描仓库包含的所有构件并建立索引对代理仓库来说,会扫描所有缓存的构件建立索引,如果远程仓库也有索引,则下载后合并索引。对仓库组来说,会合并其包含的所有仓库的索引配置maven 从nexus下载构件
通过maven提供的profile机制,可以在settings.xml中进行统一配置
使用activeProfile元素激活profile配置,当执行maven构建时,激活的profile会将仓库配置应用到项目中去通过上面的配置,本机所有的maven项目都可以从nexus私服下载构件,但是maven除了从nexus下载构件之外,还会不时访问中央仓库central。这时就需要通过镜像配置来将所有的请求转到私服中。
部署构件至nexus
在项目pom.xml中配置
nexus对于匿名用户是只读的,为了能够部署构件,需要在settings.xml中配置认证信息
手动部署第三方构件至nexus
有些Java Jar文件,如Oracle的JDBC驱动,由于许可证的因素,无法公开放在公共仓库。这时就需要手动将这些jar包下载到本地,然后上传到私服中。
nexus访问控制模型
Nexus是基于权限(privilege)来做访问控制的,服务器的每一个资源都有相应的权限来控制,因此用户执行特定的操作时就必须拥有必要的权限。管理员必须以角色(Role)的方式将权限赋予Nexus用户。如:要访问Nexus界面,就必须拥有Status-(Read)这个权限,而nexus默认的角色UI:Basics UI Privelege就包含了这个权限,再将这个绝俗分配给某个用户,这个用户就能访问Nexus界面了。
Nexus预定义了三个用户:
- admin:该用户拥有对Nexus服务的完全控制
- deployment:能够访问nexus,浏览仓库内容,搜索,并且上传部署构件,但无法对nexus进行任何配置,默认密码 :deployment123
- anonymous:对应所有未登陆的匿名用户,可以浏览仓库并进行搜索
常用角色:
- UI:Basic UI Privileges 包含了访问nexus界面必须的最基本的权限
- UI:Repository Browser 包含了浏览仓库页面所需的权限
- UI:Search 包含了访问快速搜索栏及搜索页面所需要的权限
- Repo:All Repositories(Read) 给予用户读取所有仓库内容的权限,没有仓库的读权限,用户将无法在仓库页面上看到实际的仓库内容,也无法使用Maven从仓库下载构件
- Repo:All Repositories(Full Control) 给予用户完全控制所有仓库内容的权限,用户不仅可以浏览,下载构件,还可以部署构件及删除仓库内容
Nexus包含了一个特殊的匿名角色(Nexus Anonymous Role),默认配置下没有登录的用户都会拥有该匿名角色的权限,匿名用户可以访问基本的Nexus界面,浏览仓库内容及搜索构件
为项目分配独立的仓库
在组织内部,如果所有项目都部署快照及发布版本构件到同样的仓库,就会存在潜在的冲突及安全问题。为了不让项目之间的部署相互影响,为每个项目分配独立的仓库,并将仓库的部署,修改和删除权限赋予该项目的成员,其他用户只能读取,下载和搜索该仓库的内容。
有了仓库后,需要控制仓库的增,删,改,查权限,在Nexus中,这样的权限是基于Repository Target建立的。Repository Target实际上是一系列正则表达式,在访问仓库某路径下内容时,nexus会将仓库路径与Repository Target的正则表达式一一匹配,以检查权限是否正确。
.*表示匹配所有权限
任务调度
- Download Indexes:为代理仓库下载远程索引
- Empty Trash:清空回收站,一些操作(如删除仓库文件)实际是将文件移到了回收站中
- Evict Unused Proxied Items From Repository Caches:删除代理仓库中长期未被使用的构件缓存
- Expire Repository Caches:Nexus为代理仓库维护了远程仓库的信息以避免不必要的网络开销,该任务就是清除这些缓存信息以强制Nexus去重新获取远程仓库的信息
- Publish Indexes:将仓库索引发布成可供m2eclipse和其他nexus使用的格式
- Purge Nexus Timeline:删除nexus的时间线文件,该文件用于建立系统的RSS源
- Rebuild Maven Metadata Files :重新创建仓库元数据文件maven-meta-data.xml,同时重新创建每个文件的校验和md5和sha1
- Reindex Repositories:为仓库生成索引
- Remove Snapshots From Repository:以可配置的方式删除仓库的快照构件
- Synchronize Shadow Repository:同步虚拟仓库的内容(服务于Maven1)