为什么要搭建maven私有库?
有位博主在2008年时这样写道:
如果没有私服,我们所需的所有构件都需要通过maven的中央仓库和第三方的Maven仓库下载到本地,而一个团队中的所有人都重复的从maven仓库下载构件无疑加大了仓库的负载和浪费了外网带宽,如果网速慢的话,还会影响项目的进程。很多情况下项目的开发都是在内网进行的,连接不到maven仓库怎么办呢?开发的公共构件怎么让其它项目使用?这个时候我们不得不为自己的团队搭建属于自己的maven私服,这样既节省了网络带宽也会加速项目搭建的进程,当然前提条件就是你的私服中拥有项目所需的所有构件。
总之,在本地构建私服的好处有:
1)加速构建;
2)节省带宽;
3)节省中央maven仓库的带宽;
4)稳定(应付一旦中央服务器出问题的情况);
5)控制和审计;
6)能够部署第三方构件;
7)可以建立本地内部仓库;
8)可以建立公共仓库
但对于现在(2018年)的带宽和网络情况来说,上面的好处已经不那么明显了。
结合本人maven使用经验来回答:
在多人协同开发时,开发人员开发的项目jar包如果还是在开发人员本地电脑的maven库上是不合理的,需要一个可以大家都能访问的maven库。
这个库是maven公共库吗?如第三方的阿里巴巴maven库?maven中央库?
显然是不可以的,只要是商业项目,谁愿意把自己的代码maven install 到别人的maven库里,这样别人就知道你的代码了,相当于开源一样了,除非做开源项目。
还有项目有时候会加入购买的第三方商业工具,这些工具的jar包也要放到一个maven仓库里。
为什么要用Sonatype Nexus做maven的私有仓库?
原因很简单,Sonatype Nexus就是仓库管理工具,而且稳定好用。
Sonatype Nexus2.x支持的仓库:
Sonatype Nexus3.x支持的仓库:
Sonatype Nexus官网:http://www.sonatype.org/nexus/
本文以2.x版本,因为maven仓库的支持够了。
2、解压
# mkdir nexus
# tar -zxvf nexus-2.11.2-03-bundle.tar.gz -C nexus
# cd nexus
# ls
nexus-2.11.2-03 sonatype-work
(一个nexus 服务,一个私有库目录)
8、浏览器中打开:http://192.168.78.132:8081/nexus/
给用户配置邮箱地址,方便忘记密码时找回,和接受通知
3.x的版本更新太大了,安装文件目录结构都变了。
搭建过程
1、下载Nexus 2.x版本2、解压
# mkdir nexus
# tar -zxvf nexus-2.11.2-03-bundle.tar.gz -C nexus
# cd nexus
# ls
nexus-2.11.2-03 sonatype-work
(一个nexus 服务,一个私有库目录)
3、编辑Nexus 的nexus.properties 文件,配置端口和work 目录信息
# cd nexus-2.11.2-03
# ls
bin conf lib LICENSE.txt logs nexus NOTICE.txt tmp
查看lib下的jar包,发现是基于jetty 运行
# cd nexus-2.11.2-03
# ls
bin conf lib LICENSE.txt logs nexus NOTICE.txt tmp
查看lib下的jar包,发现是基于jetty 运行
(保留默认,不用改,除了端口8081看看是否冲突)
# cd conf
# vi nexus.properties
# Jetty section
application-port=8081
application-host=0.0.0.0
nexus-webapp=${bundleBasedir}/nexus
nexus-webapp-context-path=/nexus
# Nexus section
nexus-work=${bundleBasedir}/../sonatype-work/nexus
runtime=${bundleBasedir}/nexus/WEB-INF
4、编辑nexus 脚本, 配置RUN_AS_USER 参数
# vi /root/nexus/nexus-2.11.2-03/bin/nexus
# cd conf
# vi nexus.properties
# Jetty section
application-port=8081
application-host=0.0.0.0
nexus-webapp=${bundleBasedir}/nexus
nexus-webapp-context-path=/nexus
# Nexus section
nexus-work=${bundleBasedir}/../sonatype-work/nexus
runtime=${bundleBasedir}/nexus/WEB-INF
4、编辑nexus 脚本, 配置RUN_AS_USER 参数
# vi /root/nexus/nexus-2.11.2-03/bin/nexus
#RUN_AS_USER=
改为:
RUN_AS_USER=root
5、防火墙中打开8081 端口
# vi /etc/sysconfig/iptables
添加:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8081 -j ACCEPT
保存后重启防火墙
# service iptables restart
6、启动nexus
# /root/nexus/nexus-2.11.2-03/bin/nexus start
****************************************
WARNING - NOT RECOMMENDED TO RUN AS ROOT
****************************************
Starting Nexus OSS...
Started Nexus OSS.
改为:
RUN_AS_USER=root
5、防火墙中打开8081 端口
# vi /etc/sysconfig/iptables
添加:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8081 -j ACCEPT
保存后重启防火墙
# service iptables restart
6、启动nexus
# /root/nexus/nexus-2.11.2-03/bin/nexus start
****************************************
WARNING - NOT RECOMMENDED TO RUN AS ROOT
****************************************
Starting Nexus OSS...
Started Nexus OSS.
7、配置开机启动
vi /etc/rc.local
增加下面行
/root/nexus/nexus-2.11.2-03/bin/nexus start
8、浏览器中打开:http://192.168.78.132:8081/nexus/
9、登录,默认用户名admin,默认密码admin123
10、Nexus 配置 (登录后)
1、菜单Administration/Server 配置邮箱服务地址
1、菜单Administration/Server 配置邮箱服务地址
该邮箱发送通知消息用
给用户配置邮箱地址,方便忘记密码时找回,和接受通知
仓库类型
group 仓库组:Nexus 通过仓库组的概念统一管理多个仓库,
这样我们在项目中直接请求仓库组即可请求到仓库组管理的多个仓库。
hosted 宿主仓库:主要用于发布内部项目构件或第三方的项目构件(如购买商业的构件)
以及无法从公共仓库获取的构件(如 oracle 的 JDBC 驱动)
proxy 代理仓库:代理公共的远程仓库
virtual 虚拟仓库:用于适配 Maven 1
一般用到的仓库种类是hosted、proxy
Hosted 仓库常用类型说明:
releases 内部的模块中release 模块的发布仓库,发行版,稳定版,可用于生产
snapshots 内部的模块中SNAPSHOT 模块的仓库 ,内测版,开发版
3rd party 第三方依赖的仓库,这个数据通常是由内部人员自行下载之后发布上去
Maven 依赖包下载流程
如果构建的Maven 项目本地仓库没有对应的依赖包,那么就会去Nexus 私服去下载,
如果Nexus私服也没有此依赖包,就回去远程中央仓库下载依赖,这些中央仓库就是proxy。
Nexus 私服下载成功后再下载至本地Maven 库供项目引用。
设置proxy 代理仓库准许远程下载
设置Apache Snapshots/Central/Codehaus Snapshots等proxy代理仓库允许远程访问