官方文档
nexus manager:https://guides.sonatype.com/repo3/quick-start-guides/proxying-maven-and-npm/
docker 安装 nexus:https://hub.docker.com/r/sonatype/nexus3/
nexus3 常用仓库类型的介绍
在下面创建仓库的示意图里面会出现这三个仓库类型
-
proxy:是远程仓库的代理。比如说在nexus中配置了一个central repository的proxy,当用户向这个proxy请求一个artifact,这个proxy就会先在本地查找,如果找不到的话,就会从远程仓库下载(下载的jar会保存到当前仓库中),然后返回给用户,相当于起到一个中转的作用。
-
Hosted:是宿主仓库,用户可以把自己的一些构件,deploy到hosted中,也可以手工上传构件到hosted里。比如说oracle的驱动程序,ojdbc6.jar,在central repository是获取不到的,就需要手工上传到hosted里。一般用来存放公司自己的jar包。
-
Group:是仓库组,在maven里没有这个概念,是nexus特有的。目的是将上述多个仓库聚合,对用户暴露统一的地址,这样用户就不需要在pom中配置多个地址,只要统一配置group的地址就可以了右边那个Repository Path可以点击进去,看到仓库中artifact列表。不过要注意浏览器缓存,当你的项目希望在多个repository使用资源时就不需要多次引用了,只需要引用一个group即可。
可以理解成规范吧:
- maven-public: maven-central maven-release和maven-snapshot三个库的合集。
- maven-release:用来存放release版本的jar包。
- maven-snapshot:用来存放snapshot版本的jar包。
关于Maven的Snapshot版本与Release版本
- Snapshot版本代表不稳定、尚处于开发中的版本
- Release版本则代表稳定的版本
- 什么情况下该用SNAPSHOT?协同开发时,如果A依赖构件B,由于B会更新,B应该使用SNAPSHOT来标识自己。
- 不用Release版本,在所有地方都用SNAPSHOT版本行不行?不行。正式环境中不得使
用snapshot版本的库。比如说,今天你依赖某个snapshot版本的第三方库成功构建了自己的应用,明天再构建时可能就会失败,因为今晚第三方可能已经更新了它的
snapshot库。你再次构建时,Maven会去远程repository下载snapshot的最新版本,你构建时用的库就是新的jar文件了,这时正确性就很难保证了。
花里胡哨,我的代码我爱怎么上传就怎么上传,主要的区别是release 和 snapshot在maven里面是不同的version policy ,但我们在deploy代码到maven仓库的时候(一般会在pom.xml中指定两个仓库地址,release 和 snapshot),会根据我们写的版本决定将这个代码上传到那个仓库汇总。具体情况下面有图片演示
Maven的获取依赖示意图
本地maven私服指定的是一个私有仓库的情况
本地maven私服指定的是一个私有仓库组的情况
使用docker 安装nexus
$ sudo mkdir -p /opt/data/nexus/nexus-data && sudo chown -R 200 /opt/data/nexus/nexus-data && \
docker run -d -p 8081:8081 \
-e INSTALL4J_ADD_VM_PARAMS="-Xms1g -Xmx1g -XX:MaxDirectMemorySize=1g" \
-e NEXUS_CONTEXT=nexus \
-v /opt/data/nexus/nexus-data:/nexus-data \
--restart always
--name nexus sonatype/nexus3
# 测试
$ curl http://192.168.1.100:8081/nexus/
# 启动后,查看日志信息
$ docker logs -f nexus
访问并登录到nexus
浏览器访问nexus 的地址
登录nexus 服务
查看密码
登录成功,进入引导页面
创建用户(部署代码需要用户信息)
添加一个用户
配置私有仓库
创建一个proxy仓库、两个hosted仓库
创建私有仓库
设置私有仓库的具体信息
修改仓库的信息,设置远程仓库地址为阿里云的:http://maven.aliyun.com/nexus/content/groups/public
再创建两个仓库(release和snapshots),先创建releases的仓库
在创建一个存储临时版本的maven (hosted)仓库
settings、pom.xml 示例demo
设置maven的settings文件
流程:找不到才会往下接着找
mvn compile -> 从本地仓库找依赖(localRepository),找不到-> 从远程仓库找(repositories),找不到 -> 下载依赖到代理仓库,同时从代理仓库里面获取依赖。下载的镜像源是看看你的mirrors,如果没有配置,会使用远程仓库的mirror进行下载
<!-- filename settings.xml.haitao.bak -->
<settings>
<!-- 改成你想设置的本地仓库路径 -->
<localRepository>/opt/module/maven-3.6.3/maven_repository_haitaoss</localRepository>
<!-- 为仓库列表配置的下载镜像列表。 -->
<!-- 如果这里不配置,那么会使用私服里面配置的中央仓库地址下载依赖 -->
<mirrors>
<!-- 这里最好配置的是中央仓库,或者你能确定你配置的私服仓库里面的依赖满足项目的需求 也可以配置私服仓库地址 -->
<!-- <mirror>
就是本地在下载依赖的时候,通过这个镜像去下载(去这个镜像里面找文件)
<id>nexus</id>
<url>http://192.168.1.100:8081/nexus/repository/haitao-maven-repository/</url>
如果url不是中央查明库地址,这里可以写 *
<mirrorOf>*</mirrorOf>
</mirror> -->
<!-- 建议写这个 -->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<!-- 如果url是中央仓库的地址,mirrorOf 必须写central -->
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<!-- 配置好用户名和密码 -->
<servers>
<server>
<id>nexus</id>
<username>haitaoss</username>
<password>haitaoss</password>
</server>
</servers>
<profiles>
<!-- 定义配置文件 -->
<profile>
<id>nexus</id>
<!-- 设置编译器信息 -->
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.comp