1. 私服
第3篇说明了仓库的分类,其中讲到了私服,私服的好处很明显,这篇继续跟着公众号学习私服的搭建、仓库管理、构件部署等知识。
1. 仓库管理软件
-
Sonatype Nexus:
- 如oss的nexus: https://oss.sonatype.org/
- JFrog Artifactory: https://jfrog.com/artifactory/
2. 搭建Nexus服务
这里学习nexus的服务搭建,JFrog的后续再写。
1. 环境
- Centos:7.6
- jdk:1.8u231
- maven:3.6.3
2.搭建
-
下载,下载安装包到
/opt/nexus
目录[root@john nexus]# pwd /opt/nexus [root@john nexus]# ll total 132256 -rw-r--r-- 1 root root 135426386 Nov 14 00:31 latest-unix.tar.gz
-
解压
[root@john nexus]# tar -zxvf latest-unix.tar.gz [root@john nexus]# ll total 132264 -rw-r--r-- 1 root root 135426386 Nov 14 00:31 latest-unix.tar.gz drwxr-xr-x 9 root root 4096 Dec 15 15:50 nexus-3.19.1-01 drwxr-xr-x 3 root root 4096 Dec 15 15:50 sonatype-work
-
启动服务
[root@john /]# cd /opt/nexus/nexus-3.19.1-01/bin/ [root@john bin]# ./nexus start
-
开放端口
-
编辑iptables文件
[root@john bin]# vim /etc/sysconfig/iptables
-
打开nexus服务默认端口8081
# 添加一行内容 -A INPUT -p tcp -m state --state NEW -m tcp --dport 8081 -j ACCEPT
-
重启防火墙
[root@john bin]# systemctl restart iptables.service
-
-
访问nexus服务
- 地址:
http://nexus服务器ip:8081
-
登录:
- user:
admin
- password: 初始密码存放在
/opt/nexus/sonatype-work/nexus3/admin.password
文件中。
- user:
- 修改密码
- 地址:
3. Nexus仓库分类
3.1 介绍
登录nexus后,发现nexus内置了三种类型的仓库。
- 代理仓库(proxy)
- 宿主仓库(hosted)
- 仓库组(group)
3.2 代理仓库(proxy)
- 介绍
maven从代理仓库下载构件,代理仓库会间接地从远程仓库下载并缓存构件。 -
创建代理仓库,代理aliyun仓库。
- 切换顶部菜单到server administration and configuration (设置页面)。
- 选择Repository > Repositories,点击Create repository。
- 选择maven2(proxy)
- 填写
Name
: maven-aliyun - 选择
Maven2 > Version Policy
:表示该仓库为发布版本(Release)仓库还是快照(Snapshot)版本仓库,这里选择Release。 - 填写
Proxy > Remote storage
:阿里云仓库地址(https://maven.aliyun.com/repository/public
,该地址是个仓库组,具体可查看https://maven.aliyun.com/mvn/view) - 点击底部的Create repository,完成代理仓库的创建。
3.3 宿主仓库
- 介绍
宿主仓库主要是储存组织内部的,或者一些无法从公共仓库获得的第三方构件,供大家下载使用。 -
创建宿主仓库
- 选择Repository > Repositories,点击Create repository。
- 选择maven2(hosted)
- 填写
Name
: maven-test-releases - 选择
Maven2 > Version Policy
:这里选择Relase,表明该仓库为发布版本仓库。 - 点击底部的Create repository,完成代理仓库的创建。
-
部署构件:
- 手动部署:将第三方构件通过nexus中网页的方式上传到宿主仓库。
- maven部署:将项目构件部署到指定的nexus的宿主仓库.
3.4 仓库组(group)
-
什么是仓库组?
- 仓库组对多个仓库地址进行聚合,本身不包含实际内容,通过转向组内包含的宿主仓库或者代理仓库获得实际构件的内容。
-
为什么使用仓库组?
- 通过访问一个仓库组就可以间接的访问这个组内所有的仓库。
- 组内可以包括多个代理仓库或者宿主仓库。
-
组内仓库顺序
- 仓库组所包含的仓库的顺序决定了仓库组遍历组内仓库的次序。
- 一般将常用的仓库放在前面。
4. 配置maven从Nexus下载构件
4.1 项目级别的配置
-
在项目pom文件配置仓库(
${project.basedir}/pom.xml
)<repositories> <repository> <id>maven-nexus</id> <url>http://nexus服务ip:8081/repository/maven-public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories>
-
在用户配置中配置仓库认证信息(
~/.m2/setting.xml
)<server> <!-- 注意:这里id的值和`pom.xml中repository->id`的值一致 --> <id>maven-nexus</id> <username>repouser</username> <password>repopwd</password> </server>
-
构件下载验证
- 删除demo1项目使用到本地仓库中的
org.springframework:spring-web:5.2.1.RELEASE
构件。 - 在demo1项目根目录执行
mvn compile
-
查看命令执行结果
[INFO] Scanning for projects... [INFO] [INFO] -----------------------< com.john.example:demo1 >----------------------- [INFO] Building HellMaven 1.0 [INFO] --------------------------------[ jar ]--------------------------------- Downloading from maven-nexus: http://nexus服务ip:8081/repository/maven-public/org/springframework/spring-web/5.2.1.RELEASE/spring-web-5.2.1.RELEASE.pom Downloaded from maven-nexus: http://nexus服务ip:8081/repository/maven-public/org/springframework/spring-web/5.2.1.RELEASE/spring-web-5.2.1.RELEASE.pom (1.9 kB at 15 kB/s) ... [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ demo1 --- [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] Copying 0 resource [INFO] [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ demo1 --- [INFO] Nothing to compile - all classes are up to date [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 26.582 s [INFO] Finished at: 2019-12-17T23:30:09+08:00 [INFO] ------------------------------------------------------------------------
- 删除demo1项目使用到本地仓库中的
4.2 用户级别的配置(镜像)
-
修改用户配置文件(
~/.m2/setting.xml
),配置镜像<mirror> <id>mirror-nexus</id> <mirrorOf>*</mirrorOf> <name>nexus镜像</name> <url>http://nexus服务ip:8081/repository/maven-public/</url> </mirror>
-
配置仓库认证信息(
~/.m2/setting.xml
)。<server> <!-- 注意:这里id的值和`pom.xml中repository->id`的值一致 --> <id>mirror-nexus</id> <username>repouser</username> <password>repopwd</password> </server>
-
构件下载验证。
- 删除项目pom文件中仓库的配置。
- 删除demo1项目使用到本地仓库中的
org.springframework:spring-web:5.2.1.RELEASE
构件。 - 在demo1项目根目录执行
mvn compile
-
查看命令执行结果
[INFO] Scanning for projects... [INFO] [INFO] -----------------------< com.john.example:demo1 >----------------------- [INFO] Building HellMaven 1.0 [INFO] --------------------------------[ jar ]--------------------------------- Downloading from mirror-nexus: http://nexus服务ip:8081/repository/maven-public/org/springframework/spring-web/5.2.1.RELEASE/spring-web-5.2.1.RELEASE.pom Downloaded from mirror-nexus: http://nexus服务ip:8081/repository/maven-public/org/springframework/spring-web/5.2.1.RELEASE/spring-web-5.2.1.RELEASE.pom (1.9 kB at 16 kB/s) [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ demo1 --- [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] Copying 0 resource [INFO] [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ demo1 --- [INFO] Nothing to compile - all classes are up to date [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 26.202 s [INFO] Finished at: 2019-12-17T23:49:22+08:00 [INFO] ------------------------------------------------------------------------
5. 部署构件到Nexus
5.1 使用maven部署构件
-
快照版本构件
- 日常开发生成的快照版本构件,部署到Nexus中策略为Snapshot的宿主仓库中。
-
发布版本构件
- 项目正式发布的构件,部署到Nexus中策略为Release的宿主仓库中。
-
项目pom配置(
${project.basedir}/pom.xml
)<distributionManagement> <!-- Release 仓库 --> <repository> <id>nexus-releases</id> <name>nexus私服中宿主仓库->存放/下载发布版本的构件</name> <url>http://nexus服务ip:8081/repository/maven-releases/</url> </repository> <!-- Snapshot 仓库 --> <snapshotRepository> <id>nexus-snapshots</id> <name>nexus私服中宿主仓库->存放/下载快照版本的构件</name> <url>http://nexus服务ip:8081/repository/maven-snapshots/</url> </snapshotRepository> </distributionManagement>
-
配置仓库认证信息(
~/.m2/setting.xml
)<server> <!-- 注意: `id`的值和pom.xml中的`distributionManagement->repository->id`的值一致。--> <id>nexus-releases</id> <username>repouser</username> <password>repopwd</password> </server> <server> <!-- 注意: `id`的值和pom.xml中的`distributionManagement->snapshotRepository->id`的值一致。--> <id>nexus-snapshots</id> <username>repouser</username> <password>repopwd</password> </server>
-
部署项目(
mvn deploy
)- 根据项目的版本,决定是部署到Release策略的仓库还是Snapshot策略的仓库。
-
<version>1.0-SNAPSHOT</version>
: Uploaded to nexus-snapshots。 -
<version>1.0</version>
: Uploaded to nexus-releases。
-
注意
- snapshot版本的构件支持重复部署到私服。
- release版本的构件默认不支持重复部署。这与要部署仓库的Deployment policy设置有关。
5.2 手动部署第三方构件
- 上传时,首先选择要上传构件的宿主仓库。
- 然后选择本地文件,输入构件坐标。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。