Nexus搭建Maven私服
一. 私服搭建及配置
1 . 私服简介
项目开发时,一般采用Maven来进行项目构建,管理,jar包下载,项目组开发人员开发时,只要在项目的pom.xml文件中,添加如下pom.xml信息从公共的库中下载相关的Jar包以及依赖Jar包,但有时候公共的库不是那么稳定而且下载速度往往很慢,一个团队一起开发项目时,如果每个组员都去下载一遍所有依赖的Jar包,其实是一件很麻烦的事情,所以这时候就有必要搭建一个Maven的私服了。私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件。有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓库;否则,私服请求外部的远程仓库,将构件下载到私服,再提供给本地仓库下载。
2 . 安装Nexus
2 . 1 . 下载Nexus
Nexus 专业版是需要付费的,这里我们下载开源版 Nexus OSS。下载地址:http://www.sonatype.org/nexus/go,最新的为OSS3.X,我这里选择稳定版本2.x,点击后自动下载
本文使用的 Nexus 版本为 Nexus Repository Manager OSS 2.x ,之所以不使用最新的 Nexus Repository Manager OSS 3 是因为个人感觉版本3还没有版本2友好,特别是在图形管理界面的操作上。
2 . 2 . 安装部署Nexus
Linux版本无需安装,用以下命令直接解压即可,Nexus的官方文档建议解压安装到 /usr/local下面
tar -zxvf nexus-2.14.2-01-bundle.tar.gz
生成两个目录:
nexus-2.14.2-01 sonatype-work
Nexus私服会通过Maven中央仓库下载一些需要的构件:
默认路径:{Nexus目录}\sonatype-work\nexus\storage 中央仓库:{nexus-work}\storage\central 第三方仓库:{nexus-work}\storage\thirdparty 发布仓库:{nexus-work}\storage\releases 注:public组是自定义仓库的集合,其路径下不存放具体的Jar包构件。
2 . 3 . 运行Nexus
如果你当前用户是root,那么在你运行之前vi bin/nexus文件前几行设置一下:RUN_AS_USER=root
然后进入bin目录下,启动服务
./nexus start 启动服务
./nexus stop 停止服務 ./nexus restart 重启服务
2 . 4 . 打开Nexus
打开浏览器,访问:http://localhost:8081/nexus/,点Sign In登录管理页面,用户名密码为,admin和admin123,如下如所示,在Repositories页面里显示着,默认已经创建了5个仓库,直接可以拿来用,无需再自行创建仓库。
8081为默认的端口号,要修改端口号可进入\conf\打开nexus.properties文件,修改application-port属性值就可以了。
3 . Nexus预置的仓库
3.1 类型介绍
登陆Nexus,在左边菜单栏里选择Repositories,然后会出现右边的画面,右边上半部分是列出来的repository,黑体字是类型为group的repository。
这里简单介绍下几种repository的类型:
Ø hosted,本地仓库,通常我们会部署自己的构件到这一类型的仓库。比如公司的第二方库。
Ø proxy,代理仓库,它们被用来代理远程的公共仓库,如maven中央仓库。
Ø group,仓库组,用来合并多个hosted/proxy仓库,当你的项目希望在多个repository使用资源时就不需要多次引用了,只需要引用一个group即可。
3.2 管理本地仓库
我们前面讲到类型为hosted的为本地仓库,Nexus预置了3个本地仓库,分别是Releases, Snapshots, 3rd Party. 分别讲一下这三个预置的仓库都是做什么用的:
Releases:
这里存放我们自己项目中发布的构建, 通常是Release版本的, 比如我们自己做了一个FTP Server的项目, 生成的构件为ftpserver.war, 我们就可以把这个构建发布到Nexus的Releases本地仓库. 关于符合发布后面会有介绍.
Snapshots:
这个仓库非常的有用, 它的目的是让我们可以发布那些非release版本, 非稳定版本, 比如我们在trunk下开发一个项目,在正式release之前你可能需要临时发布一个版本给你的同伴使用, 因为你的同伴正在依赖你的模块开发, 那么这个时候我们就可以发布Snapshot版本到这个仓库, 你的同伴就可以通过简单的命令来获取和使用这个临时版本.
3rd Party:
顾名思义, 第三方库, 你可能会问不是有中央仓库来管理第三方库嘛,没错, 这里的是指可以让你添加自己的第三方库, 比如有些构件在中央仓库是不存在的. 比如你在中央仓库找不到Oracle 的JDBC驱动, 这个时候我们就需要自己添加到3rdparty仓库。
二. 利用搭建的私服,进行下载及上传jar包
1. 远程仓库的认证
Nexus 安装成功后,接下来需要修改 Maven 的配置文件(settings.xml),整合 Nexus。
大部分公共的远程仓库无须认证就可以直接访问,但我们在平时的开发中往往会架设自己的Maven远程仓库,出于安全方面的考虑,我们需要提供认证信息才能访问这样的远程仓库。配置认证信息和配置远程仓库不同,远程仓库可以配置在Maven的settings.xml文件中,也可直接在项目的pom.xml中配置,后面会分别举例说明,但是认证信息必须配置在Maven的settings.xml文件中。在settings.xml中配置认证信息更为安全。如下:在settings.xml中配置<servers>节点:
1 <settings> 2 2 ... 3 3 <!--配置远程仓库认证信息--> 4 4 <servers> 5 5 <server> 6 6 <id>bbsnexus</id> 7 7 <username>admin</username> 8 8 <password>admin123</password> 9 9 </server> 10 10 </servers> 11 11 ... 12 12 </settings>
上面代码我们配置了一个id为bbsnexus的远程仓库认证信息。Maven使用settings.xml文件中的servers元素及其子元素server配置仓库认证信息。认证用户名为admin,认证密码为admin123。
这里的关键是id元素,id没有要求,随便定义,但是后面配置远程仓库的id必须和这里的id保持一致。正是这个id将认证信息与仓库配置联系在了一起。
2. 配置远程仓库
如果只有一个项目,可以配置在项目的pom文件中:
如果有多个项目时,可以将如上配置放到Maven的Settings文件中:
repository:在repositories元素下,可以使用repository子元素声明一个或者多个远程仓库。
id:仓库声明的唯一id,尤其需要注意的是,Maven自带的中央仓库使用的id为central,如果其他仓库声明也使用该id,就会覆盖中央仓库的配置。
name:仓库的名称,让我们直观方便的知道仓库是哪个,暂时没发现其他太大的含义。
url:指向了仓库的地址,一般来说,该地址都基于http协议,Maven用户都可以在浏览器中打开仓库地址浏览构件。
releases和snapshots:用来控制Maven对于发布版构件和快照版构件的下载权限。需要注意的是enabled子元素,该例中releases的enabled值为true,表示开启JBoss仓库的发布版本下载支持,而snapshots的enabled值为false,表示关闭JBoss仓库的快照版本的下
载支持。根据该配置,Maven只会从JBoss仓库下载发布版的构件,而不会下载快照版的构件。
layout:元素值default表示仓库的布局是Maven2及Maven3的默认布局,而不是Maven1的布局。基本不会用到Maven1的布局。
其他:对于releases和snapshots来说,除了enabled,它们还包含另外两个子元素updatePolicy和checksumPolicy。
元素updatePolicy用来配置Maven从远处仓库检查更新的频率,默认值是daily,表示Maven每天检查一次。其他可用的值包括:never-从不检查更新;always-每次构建都检查更新;interval:X-每隔X分钟检查一次更新(X为任意整数)。
元素checksumPolicy用来配置Maven检查校验和文件的策略。当构建被部署到Maven仓库中时,会同时部署对应的检验和文件。在下载构件的时候,Maven会验证校验和文件,如果校验和验证失败,当checksumPolicy的值为默认的warn时,Maven会在执行构建时
输出警告信息,其他可用的值包括:fail-Maven遇到校验和错误就让构建失败;ignore-使Maven完全忽略校验和错误。
3. 配置仓库镜像
默认的,如果本地仓库找不到依赖的构件,这时需要东西时先到Nexus上找,如果发现Nexus服务关闭后,会自动到中央仓库找。
如果我们想覆盖中央仓库的默认地址,强制依赖的东西都到Nexus中去找,即使Nexus关闭也不会到中央工厂去下载:
修改Maven的Settings文件:
至此,我们已经可以从自己搭建的私服下载jar了。先删除Maven本地仓库中的所有jar包,然后用IDE打开Maven项目,刷新一下Maven,然后看看本地仓库中是否有jar包,如果有说明下载成功。
同时可以登录 nexus 的 admin 账号可以看到 Public Repositories 下出现了一些 Jar 包。
4. 上传第三方jar包
假如我们开发了一些自己的Jar供大家一起使用,就需要上传该jar包。选中宿主库——3rd party,之后选择Artifact Upload上传至宿主空间。
Jar 包上传成功后,切换到 Browse Index 选项卡页面,点击刷新按钮,可以看到我们刚刚上传的 Jar 包,选中 Jar 包我们可以在右边看到 Jar 包对应的 Maven 依赖信息,可以用于项目的构建。
进入本地仓库删除 \.m2\org\jboss\cache\jbosscache-core\3.2.1.GA 目录下的所有文件(重要,否则会构建失败),此时,再次回到刚刚构建失败的项目,刷新 Maven,可以看到项目已经可以正常构建了。
三. 配置Nexus【可选】
1. 开启远程索引
新搭建的neuxs环境只是一个空的仓库,需要手动和远程中心库进行同步,nexus默认是关闭远程索引下载,最重要的一件事情就是开启远程索引下载,点击左边Administration菜单下面的Repositories,找到右边仓库列表中的仓库Central,然后把仓库的configuration下把Download Remote Indexes修改为true,操作完后记得点击下面的save按钮如下图:
然后在仓库上分别右键,选择Repari Index,这样Nexus就会去下载远程的索引文件。
默认是从中央仓库中下载jar包,但有时候中央仓库下载很慢,经常下载不下来,所有有时候需要修改远程仓库的地址,可以改成jboss仓库https://repository.jboss.org/nexus/content/groups/public/,还可以改成http://maven.aliyun.com/nexus/content/groups/public/,后面这个库速度很快,不错。
2. 搜索仓库jar包
在左边菜单栏里面有个Artifact Search, 在输入框里面输入你想要搜索的构件名字,比如:spring, 那么查询结果如下:右下角就是这个Jar包的POM坐标信息
四. jar包推送至私有仓库
1、首先maven下settings文件私服认证配置
<servers> <server> <id>nexus-repository</id> <username>admin</username> <password>admin</password> </server> </servers>
2、应用下pom文件私服配置
<distributionManagement> <repository> <id>nexus-repository</id> <name>Local Release Repository</name> <url>http://172.xxx.xxx.60:8087/nexus/content/repositories/releases/</url> </repository> <snapshotRepository> <id>nexus-repository</id> <name>Local Snapshots Repository</name> <url>http://172.xxx.xxx.60:8087/nexus/content/repositories/snapshots/</url> </snapshotRepository> </distributionManagement>
3、注意
- setting 文件 server 中的 id 和项目 pom 文件中的 id 一致,server中设置准确的username 和 password,在 deploy 的时候,maven会通过 username 和 password 认证,认证通过,就会将本地 maven 项目生成的 jar 包上传到私服上。
- 检查是否允许重新发布上传:Deployment Policy设置为Allow Redeploy而不是Disable Redeploy。
Deployment Policy设置为Disable Redeploy重复部署会报:Return code is: 400, ReasonPhrase: Bad Request
五. 遗留问题
1、关于Central 和 Apache Snapshots 仓库无法拉取的问题:nexus默认配置的是如下路径:http://repository.apache.org/snapshots/
然后更新索引的时候日志中会提示:jvm 1 | 2013-11-02 19:23:34 INFO [pxpool-1-thread-3] admin org.sonatype.nexus.index.DefaultIndexerManager - Cannot fetch remote index for repository "Apache Snapshots" [id=apache-snapshots] as it does not publish indexes.
正确的地址是如下这个:
https://repository.apache.org/content/repositories/releases/ release版本
https://repository.apache.org/content/repositories/snapshots/ 非稳定版本
将地址改为上面的其中一个,可以拉取包下来,但是包很少,不能用。用阿里云(http://maven.aliyun.com/nexus/content/groups/public/)的也不行,我现在是手工放上去的。
常用的软件仓库:
http://maven.aliyun.com/nexus/content/groups/public(阿里云,推荐)
http://repo2.maven.org/maven2/
https://repository.jboss.org/nexus/content/groups/public/
参考文章:
https://www.cnblogs.com/tyhj-zxp/p/7605879.html
https://www.cnblogs.com/dengyulinBlog/p/6398310.html
https://www.cnblogs.com/rexfang/p/7625696.html
https://blog.csdn.net/zzq900503/article/details/41743351