简述
在上一篇文章中,我介绍了如何封装自己的SpringBoot Starter。
可能有想法去对某个功能做封装,使其成为一个自定义starter。但思考这样一个问题:
你正在开发一个项目,正好可以使用你自定义的starter,于是你将其引入到了项目中。如果你一直在你自己的电脑上开发的话,那没有什么问题。但是如果你换了电脑或者别人要协同你开发,重新从git上拉下代码,是下载不到你自定义的starter依赖的,因为starter一直都在你的本地maven仓库!
所以,无论对于个人还是公司,有一个私有maven仓库是很便利的。你不仅仅能将你的starter上传上去,还能将普通的maven项目上传上去,更重要的是你的代码永远在自己手中而不必暴露出去。
私有maven仓库的实现:NEXUS。你可能已经见过它了,阿里的镜像仓库也是用它做的。在maven的setting.xml中的阿里镜像中就有“nexus”一词。
技术前提
对于屏幕前的小伙伴,希望你们有一些关于:maven、docker的基础知识。如果有自己的服务器就更好了,没有的话windows也可以。
硬性要求就是需要安装Docker。(Linux安装docker:Linux(centos)安装docker_linux 的 docker 哪个稳定-CSDN博客)
安装nexus
镜像地址:https://hub.docker.com/r/sonatype/nexus3
拉一个最新的:
docker pull sonatype/nexus3:latest
拉取下来后就是运行了,我们需要知道,我们上传上去的数据很重要,所以仓库一定要映射出来。
而且,nexus也是java项目,它的默认参数是:-Xms2703m -Xmx2703m -XX:MaxDirectMemorySize=2703m -Djava.util.prefs.userRoot=${NEXUS_DATA}/javaprefs
,服务器内存可能不够起不起来,所以改小一点(我踩坑了)。
很重要的一点:如果你的nexus能启动但是报错停止运行,那么大概率是因为你第一次启动内存不足而导致orientdb数据库损坏,最简单的做法是是删除nexus容器,删除nexus镜像,删除数据卷(docker volume ls
,docker volume rm nexus-data
)。然后重新拉镜像,重新运行。我报错是Schema is not created and cannot be loaded DB name="config"
,
docker run -d -p 666:8081 --name nexus -e INSTALL4J_ADD_VM_PARAMS="-Xms512m -Xmx512m -XX:MaxDirectMemorySize=1200m" -v nexus-data:/nexus-data sonatype/nexus3
容器中expose的是8081端口,主机端口自行设置,比如我的666端口
因为启动比正常的容器要久一点,所以别急。可以查看日志:
docker logs -f nexus
启动成功后,浏览器ip+端口访问即进入该页面:
这时,我们点击右上角登录。用户名为admin
,密码稍微麻烦一点。首先查看我们的匿名数据卷挂载的目录:docker volume inspect nexus-data
:
然后进入这个目录有一个叫admin.password
的文件,里面放的就是admin的登录密码。
使用cat admin.password
查看密码,是一个随机字符串,登录成功后会让我们改密码的,不用担心记不住。
登陆后,会有四个设置步骤。
第一个直接next,
第二个就是设置新密码,
第三个询问我们是否允许匿名访问(就是外人能不能访问该站点),我们既然搭建私服,就不应该允许匿名访问,勾选disable,
第四个完成确认。
安装运行完成,下面就开始介绍如何使用nexus了。
仓库介绍
nexus仓库分三种类型:
- proxy 代理仓库,比如代理到maven中央仓库。
- hosted 宿主仓库,即自己的私人仓库。
- group 仓库组,由多个仓库组成,当要下载依赖时会遍历每个仓库去找。
其中,hosted 宿主仓库又分为:releases 和shapshots,分别表示依赖的版本的发行版、快照版。快照版依赖不能上传到发行版仓库,反之亦然。nexus做了限制。
仓库格式有两种:
- maven2
- nuget
我们搞java的只需要关心maven2的就好了。
其实能猜到我们使用最多的就是仓库组,可以把代理仓库、releases 和shapshots一起放进去,这样就完美实现:能从私服下载依赖,找不到还能去代理仓库那找。我们只需要在本地maven中配置下载镜像从私服上的仓库组下载就行了。
仓库组
其默认的仓库组也是这样干的,把代理仓库、releases 和shapshots这三个仓库都放进去了。
点击就能进去看仓库详情了:
选择要操作的仓库,然后中间左右移动,就能向仓库组添加、移除仓库了。
代理仓库
默认创建好的代理仓库是代理到maven中心仓库的:
点击进入可以看到:
总所周知,国内在maven中心仓库下载依赖很慢,所以我们可以重新创建一个代理仓库,然后代理到阿里的镜像仓库:
仓库类型很多,但我们只需要关心maven格式的即可:
仓库名字、代理地址必填,其余可以默认值(存储类型根据需要,默认只保存release依赖,maximum那些是设置缓存时间的)
阿里的镜像仓库地址:https://maven.aliyun.com/nexus/content/groups/public
创建完成后,把这个仓库放到仓库组里面,可以将ali的代理仓库放第一位。
大致操作就是这样的,下面开始本地maven配置。
上传依赖
首先找到本地maven的setting.xml
,打开后找到servers
标签。加入以下内容
<servers>
<!-- 这是配置访问私有仓库的用户名密码 -->
<server>
<!-- id标签可以随便填,只需要在servers中唯一即可,后面很多地方会使用该id -->
<id>self-maven</id>
<username>dev</username>
<password>xpxp1998</password>
</server>
</servers>
用户名密码可在nexus设置中去创建用户,分配对应全新,不建议使用admin账号。
maven配置好了,接下来去maven项目中设置:
在你想上传的模块的pom文件中,写入:
<distributionManagement>
<repository>
<id>self-maven</id>
<url>http://ip:port/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>self-maven</id>
<url>http://ip:port/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
- repository标签是代表上传release版本
- snapshotRepository标签代表上传snapshot版本
会根据该模块的版本进行自动选择,如果你的版本号带有SNAPSHOT
如:<version>0.0.1-SNAPSHOT</version>
,那么会上传到SNAPSHOT
仓库,release也是这个道理,如果版本号不存在这两个单词,如1.0.0
,那么会选择release
仓库上传。
标签中的 id,就是上面我们配置的server id,maven会通过这个id去server中拿用户名密码去访问私服仓库。
标签中的url,就是对应仓库的地址:仓库的url复制即可,注意对应仓库,弄反了是传不上去的
ok,针对上传,我们已经配置好了,那么如何上传呢?
在idea右侧,maven中,选择要上传的模块,点击deploy(发布)
即可
会先下载一些东西,然后上传。
发布后,在对应的仓库也能查看,我这里是snapshot仓库:
上传到这里就可以了,但有一点需要注意的是,release
仓库需要把
设置为Allow redeploy
代表允许我们对仓库中的依赖维护升级新版本,如果设置为disable redeploy
意味着我们无法将升级版本上传上来。
下载依赖
接下来,配置本地maven。
还是打开setting.xml
,找到mirrors
标签。
然后添加一个mirror
标签:
<mirror>
<id>self-maven</id>
<mirrorOf>*</mirrorOf>
<url>仓库组的url/</url>
</mirror>
前阿里的镜像可以注释了,
添加的镜像:
- id 之前server的id,访问仓库组也要拿用户名密码
- mirrorOf *代表所有的依赖都从私服找
- url 就是仓库组的,还是去仓库组右边copy即可
到这里就能使用私服下载依赖了。
我们需要把之前创建的阿里镜像代理仓库放到仓库组中。
maven-public
这个仓库组,把ali代理仓库加进去就行了:
tip:最好在maven配置中还是加上阿里镜像仓库 ,有时会出现拉取不下来的情况,即使group中有阿里仓库
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>https://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>