maven私有镜像仓库nexus部署使用
1、Nexus部署
#查找镜像
docker search sonatype/nexus3
#拉取镜像
docker pull sonatype/nexus3
#持久化目录
mkdir -p /data/nexus/data
chmod 777 -R /data/nexus/data
#启动服务
docker run -d --name nexus3 -p 8081:8081 --restart always -v /data/nexus/data:/nexus-data sonatype/nexus3
#查看日志
docker logs -f nexus3
稍等一下,出现 Started Sonatype Nexus OSS 表示启动好了。
2、Nexus访问
安装完成后可访问管理平台:http://ip:8081,打开浏览器,访问 http://ip:8081/
admin账户登录密码查看
cat /data/nexus/data/admin.password
3、Nexus配置
默认仓库说明
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仓库类型介绍
hosted:本地仓库,通常我们会部署自己的构件到这一类型的仓库。比如公司的第二方库。
proxy:代理仓库,它们被用来代理远程的公共仓库,如maven中央仓库。
group:仓库组,用来合并多个hosted/proxy仓库,当你的项目希望在多个repository使用资源时就不需要多次引用了,只需要引用一个group即可。
4、创建Blob Stores
在创建repository之前,还需要先指定文件存储目录,便于统一管理。就需要创建Blob Stores,不创建则使用的是default
可以看到blob stores有两个,一个是系统默认的,一个是刚创建的。如果不想自己创建,使用系统默认的文件存储目录也是可以的。到时候创建repository时,存储目录选择default就可以了。新创建的目录,可以在/data/blobs/目录下面可以看到。
5、Nexus仓库
如图所示,代理仓库负责代理远程中央仓库,托管仓库负责本地资源,组资源库 = 代理资源库 + 托管资源库
6、创建proxy repository代理仓库
选择maven2(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/
7、创建hosted repository仓库
Hosted有三种方式:Releases、Snapshot、Mixed
Releases: 一般是已经发布的Jar包
Snapshot: 未发布的版本
Mixed:混合的
上图的Hosted设置选项,选项中有三个值:
Allow redeploy:允许同一个版本号下重复提交代码, nexus以时间区分
Disable redeploy:不允许同一个版本号下重复提交代码
Read-Only:不允许提交任何版本
原生的maven-releases库是Disable redeploy设置, maven-snapshots是Allow redeploy。
8、创建group repository组仓库
9、maven部署配置
#获取软件包
wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.9.6/binaries/apache-maven-3.9.6-bin.tar.gz --no-check-certificate
tar -zxvf apache-maven-3.9.6-bin.tar.gz
echo "" >>/etc/profile
source /etc/profile
mvn -V
Maven下的setting.xml文件和项目中的pom.xml文件的关系是:settting.xml文件是全局设置,而pom.xml文件是局部设置。pom.xml文件对于项目来说,是优先使用的。而pom.xml文件中如果没有配置镜像地址的话,就按照settting.xml中定义的地址去查找。
如上图方式获取组仓库smart_group的仓库地址,修改setting.xml文件如下:
<!--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
新建SpringBoot项目,可以查看本地仓库,远程仓库的下载的Jar包
这个时候可以看到代理仓库已经从中央仓库下载了项目编译需要的jar包。同样地,在组仓库中也能看到所有的jar包,包括代理仓库和宿主仓库的。
10、管理平台上传三方jar包
有些jar是第三方提供的,在中央仓库中是没有的,我们可以上传这些本地三方jar包到hosted repository宿主仓库中。
上传成功后,就可以看到hosted repository和group repository中已经有了刚上传的三方jar包
然后项目中通过编译打包就可以下载jar包到本地repository中了,记住maven clean、compile、package首次执行时加参数-U。
11、命令上传三方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=byd.ghy -DartifactId=portal-auth -Dversion=1.0.0 -Dpackaging=jar -Dfile=D:\workspace_byd\workspace_ghy\workspace_portal-backend\portal-backend-jar-v2\target\auth-server.jar -Durl=http://192.168.124.189:8081/repository/custom_hosted/ -DrepositoryId=custom_hosted命令解释:
-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一致例如:
mvn deploy:deploy-file -Dmaven.test.skip=true -Dfile=./cloudx-common-basics-2.0.2-SNAPSHOT.jar -DgroupId=com.risit.chk -DartifactId=risit-chk-common -Dversion=1.0.0-SNAPSHOT -Dpackaging=jar -DrepositoryId=nexus-snapshots -Durl=http://10.10.111.222:8081/repository/nexus-snapshots/mvn deploy:deploy-file -Dfile=cloudx-center-2.0.2-SNAPSHOT.pom -DgroupId=com.cloudx -DartifactId=cloudx-center -Dversion=2.0.2-SNAPSHOT -Dpackaging=pom -DrepositoryId=nexus-snapshots -Durl=http://10.10.111.222:8081/repository/nexus-snapshots/
上传成功后,hosted repository中已经可以看到了
12、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类型的仓库,并加入到组中
13、项目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
至此,nexus搭建完毕,支持本地部署依赖jar包!!!
14、问题排查
1、nexus.log日志中报错内容如下:
UNKNOWN com.sonatype.nexus.plugins.outreach.internal.outreach.SonatypeOutreach - Could not download page bundle
java.net.SocketException: Network is unreachable (connect failed)
解决方法:
a) 访问Nexus管理站点,我这里是 http://192.168.124.184:8081,进入后,用管理员帐号登录。
b)点击 下图中上面的按钮,然后选择左侧Capabilities,然后点击右侧的 Outreach:Management
c)点击【disable】按钮,关闭Outreach服务
或者给Outreach设定新的URL,可以在标签页 Settings 中的 Override Outreach Content URL项中设定。Nexus支持的URL有如下三个:
- http://links.sonatype.com and https://links.sonatype.com
- http://download.sonatype.com and https://download.sonatype.com
- http://sonatype-download.global.ssl.fastly.net and https://sonatype-download.global.ssl.fastly.net