一、安装Nexus3
1、docker-compose.yaml 配置
注:8081端口是开放给后台使用的,5000和5001端口是开放给仓库使用的,换成别的也可以,只要配置docker仓库时填写开放的端口就可以了,我没有单独 映射,都用的8081
version: "3.0"
services:
nexus:
image: sonatype/nexus3:3.38.1
container_name: nexus3
ports:
- 8081:8081
- 5000:5000
- 5001:5001
environment:
NEXUS_CONTEXT: nexus3
volumes:
- ./data:/nexus-data
environment:
ES_JAVA_OPTS: "-Xmx1024m -Xms1024m"
2、启动nexus
使用 docker-compose up -d 启动启动,后访问 http://192.168.40.147:8081/
登录用户名admin密码通过 cat data/admin.password 查看
登录后可修改密码为好记的密码
3、安装可能遇到问题
问题:
启动后通过docker ps -a查看nexus3的状态为退出,在docker-compose.yaml同级目录下可查看其启动的日志,通过 docker-compose logs -f 命令查看,发现没有权限访问宿主机创建文件目录
解决方法:
可手动创建 mkdir data/instances 创建完后再查看状态为启动了
如果还未解决:授权 chmod 777 data/
二、配置docker仓库
1、概述
-
默认仓库说明
maven-central:maven中央库,默认从https://repo1.maven.org/maven2/拉取jar
maven-releases:私库发行版jar,初次安装请将Deployment policy设置为Allow redeploy
maven-snapshots:私库快照(调试版本)jar
maven-public:仓库分组,把上面三个仓库组合在一起对外提供服务,在本地maven基础配置settings.xml或项目pom.xml中使用 -
Nexus仓库类型介绍
Nexus3 提供了的3种类型的Docker仓库,前两者都可以创建多个仓库,最后一个则可以将他们全部聚合到一个URL来访问。
hosted:本地仓库,通常我们会部署自己的构件到这一类型的仓库。比如公司的第二方库。
proxy:代理仓库,它们被用来代理远程的公共仓库,如maven中央仓库。
group:仓库组,用来合并多个hosted/proxy仓库,当你的项目希望在多个repository使用资源时就不需要多次引用了,只需要引用一个group即可。
2、创建Blob Stores
填写name,路径会自动生成,你也可以自己修改挂载地址
blob stores有两个,一个是系统默认的,一个是刚创建的。如果不想自己创建,使用系统默认的文件存储目录也是可以的。到时候创建repository时,存储目录选择default就可以了。新创建的目录,可以在/data/blobs/目录下面可以看到。
3、配置仓库
1)配置hosted类型的
hosted类型仓库用作我们的私有仓库。注意红框中的配置,填写完毕,点击创建仓库
上图的Hosted设置选项,选项中有三个值:
Allow redeploy:允许同一个版本号下重复提交代码, nexus以时间区分
Disable redeploy:不允许同一个版本号下重复提交代码
Read-Only:不允许提交任何版本
原生的maven-releases库是Disable redeploy设置, maven-snapshots是Allow redeploy。
2)配置proxy类型的
proxy类型仓库,可以帮助我们访问不能直接到达的网络,如另一个私有仓库,或者国外的公共仓库
这里推荐几个远程仓库:
jboss的maven中央仓库地址:http://repository.jboss.com/maven2/
阿里云的maven中央仓库地址:http://maven.aliyun.com/nexus/content/groups/public/
apache的maven中央仓库地址:http://repo.maven.apache.org/maven2/
3)配置group类型的
必须将hosted repositories【托管资源库】的顺序放在proxy repositories【代理资源库】之前,因为一个group【组资源库】中可以涵括这些托管资源库和代理资源库。而一整个的group是作为一个public,一个接口给别人使用的。所以当查找架包的时候,如果代理资源库在前面,那就是先从远程去查找jar,而不是先从托管资源库(本地仓库)去查找是否有jar。这样访问外网的消耗比起来在本地查找,当然是将托管资源库放在代理资源库之前的优先位置了。
4、Maven配置
apache-maven-3.6.3下的setting.xml文件和项目中的pom.xml文件的关系是:settting.xml文件是全局设置,而pom.xml文件是局部设置。pom.xml文件对于项目来说,是优先使用的。而pom.xml文件中如果没有配置镜像地址的话,就按照settting.xml中定义的地址去查找。
如上图方式获取组仓库smart_group的仓库地址,修改setting.xml文件如下:
<localRepository>d:/maven_test/</localRepository>
<!--nexus服务器,id为组仓库name-->
<servers>
<server>
<id>custom_group</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
<!--仓库组的url地址,id和name可以写组仓库name,mirrorOf的值设置为central-->
<mirrors>
<mirror>
<id>custom_group</id>
<name>custom_group</name>
<url>http://192.168.124.189:8081/repository/custom_group/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
修改后可以重新编译项目,必须添加参数-U,(-U,–update-snapshots,强制更新releases、snapshots类型的插件或依赖库,否则maven一天只会更新一次snapshot依赖)。代理仓库会从远程中央仓库下载jar包。
mvn clean compile -U
5、管理平台上传三方jar包
有些jar是第三方提供的,在中央仓库中是没有的,我们可以上传这些本地三方jar包到hosted repository宿主仓库中。
上传成功后,就可以看到hosted repository和group repository中已经有了刚上传的三方jar包
6、命令上传三方jar包
在setting.xml配置文件中添加hosted repository server
<!--id自定义,但是在使用命令上传的时候会用到-->
<server>
<id>custom_hosted</id>
<username>admin</username>
<password>admin123</password>
</server>
使用如下命令上传jar包:
mvn deploy:deploy-file -DgroupId=com.sinoeyes -DartifactId=hspharm-paas-enum -Dversion=1.0.0-dev2.0-SNAPSHOT -Dpackaging=jar -DpomFile="E:\hspharm\work\hspharm-paas-enum-1.0.0-dev2.0-SNAPSHOT.pom" -Dfile="E:\hspharm\work\hspharm-paas-enum-1.0.0-dev2.0-SNAPSHOT.jar" -Durl=http://192.168.180.47:8081/repository/hspharm-host/ -DrepositoryId=hspharm-host
命令解释:
-DgroupId=byd.ghy 自定义
-DartifactId=portal-auth 自定义
-Dversion=1.0.0 自定义,三个自定义,构成pom.xml文件中的标识
-Dpackaging=jar 传的类型是jar类型
-Dfile=D:\auth-server.jar jar包的本地磁盘位置
-Durl=http://ip:8081/repository/custom_hosted/ hosted资源库的地址
-DrepositoryId=custom_hosted 需要和setting.xml文件中配置的ID一致
上传成功后,hosted repository中已经可以看到了
7、deploy部署jar包到私服
release和snapshots jar包区别
SNAPSHOT版本代表不稳定(快照版本),还在处于开发阶段,随时都会有变化。
当上传同样的版本号jar包的时候,SNAPSHOT会在版本号的后面自动追加一串新的数字,即日志标签,
nexus会根据日志标签区分出不同的版本,在maven引用时,如果使用的是snapshot版本,
重新导入maven的时候,会去私库拉取最新上传的代码。
RELEASE则代表稳定的版本(发布版本),一般上线后都会改用RELEASE版本。
也就是说1.0,2.0这样的版本只能有一个,也就是说当前版本号下,不可能出现不同的jar。
创建snapshot仓库
可以在nexus上添加一个snapshot仓库,专门用于存放snapshot版本的jar包。snapshot仓库也是hosted类型的,创建方式和hosted repository类型。创建好后,加入到组仓库里面就可以了。
一定要选择Deployment Policy为allow redeploy
同样的操作,创建Release类型的仓库,并加入到组中
8、项目pom.xml文件配置
可以在项目的pom文件中设置具体的relaeses库和snapshots库。如果当前项目的版本号的后缀名中带着-SNAPSHOT,类似***-SNAPSHOT,就会将项目jar包提交到snapshots库中,没有带-SNAPSHOT的话会提交releases库中。
在pom.xml文件中配置 distributionManagement 节点如下,在项目中执行deploy命令后,jar包将会被上传到nexus中。
setting.xml中配置
<server>
<id>custom_snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>custom_releases</id>
<username>admin</username>
<password>admin123</password>
</server>
pom.xml配置
<repositories>
<repository>
<id>custom_group</id>
<name>Nexus Repository</name>
<url>http://192.168.124.189:8081/repository/custom_group/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>custom_group</id>
<name>Nexus Plugin Repository</name>
<url>http://192.168.124.189:8081/repository/custom_group/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</pluginRepository>
</pluginRepositories>
<!--项目分发信息,在执行mvn deploy后表示要发布的位置。有了这些信息就可以把网站部署到远程服务器或者把构件jar等部署到远程仓库。 -->
<distributionManagement>
<repository><!--部署项目产生的构件到远程仓库需要的信息 -->
<id>custom_releases</id><!-- 此处id和settings.xml的id保持一致 -->
<name>Nexus Release Repository</name>
<url>http://192.168.124.189:8081/repository/custom_releases/</url>
</repository>
<snapshotRepository><!--构件的快照部署到哪里?如果没有配置该元素,默认部署到repository元素配置的仓库,参见distributionManagement/repository元素 -->
<id>custom_snapshots</id><!-- 此处id和settings.xml的id保持一致 -->
<name>Nexus Snapshot Repository</name>
<url>http://192.168.124.189:8081/repository/custom_snapshots/</url>
</snapshotRepository>
</distributionManagement>
默认地,maven编译打包不会下载SNAPSHOT版本的jar包,所以还需要在pom.xml文件中配置支持下载snapshot版本jar包。
mvn clean deploy -Dmaven.test.skip=true