[maven] 使用 Nexus 管理 repository
大概是说还有一篇笔记,两篇内容,maven 的内容就差不多过完了。这一篇笔记主要记一下 maven 的 central 管理部分,之前提到过我们公司用的就是 nexux 做了一个镜像,这里也会用 docker 去创建一个本地的 nexus
三合一的话内容就拆得太长了……所以这里 nexus 的内容单独拆出来,剩下的就剩下 plugins & properties 了
简介
首先简单的过一下管理的流程,本地的项目通过 maven install build deploy
等指令和公司的 repo 进行沟通,公司的 repo 再和 central repo(maven 提供的)或是其他的 cloud 进行沟通。
这个系列主要是讲 maven,所以主要的目标就是 Central Repo,实际操作上,我们公司的前段项目也是部署在 nexus 上,这块就对应了其他的 cloud
公司自己内部 host 一个 repo 有几个好处:
-
cached 依赖
-
控制依赖
比如说不允许下载未被验证的版本,或者是过于老旧有很多安全隐患的依赖也可以从公司的 repo 删除
-
上传/管理公司内部的项目
比如说内部的 util 之类的
使用 docker 运行 nexus
docker 是一个本身的话可以简化一些执行和运行的过程的同时,能够在跨平台的同时还取得相同结果的平台,它主要是用的是 image 和 container 去进行处理,这里不会过多赘述。
说起来我还得吧 docker 和 k8s 的课上完……叹气……
docker 安装
官网上有安装起,点点点就好了:https://www.docker.com/
安装后可以使用下面这个指令查看 docker 是否安装成功了:
❯ docker --version
Docker version 20.10.17, build 100c701
当然,如果 docker 不是作为一个服务器启动的话,得先开启 docker 才行:
运行 nexus
nexus 的网址在这里:https://hub.docker.com/r/sonatype/nexus3/
直接执行下面指令就可以了:
❯ docker run -d -p 8081:8081 --name nexus sonatype/nexus3
Unable to find image 'sonatype/nexus3:latest' locally
57168402cb72: Pull complete
6caa094755dc: Pull complete
94656dc36e5f: Pull complete
252d91e5c44e: Pull complete
0100fe0780d1: Pull complete
12a0cb9b1e42: Pull complete
cd872a505f36: Pull complete
Digest: sha256:a361830ede036ac2f4942464b1c9ca535cbfcba14c5d3237b0d378fcfee1f3ec
Status: Downloaded newer image for sonatype/nexus3:latest
7555a03ff1bbe5f9e482e1f1dc99311e386da8b669130446303c4fe06d3f05db
demo ❯
这个指令大致意思是说:docker 需要在 detached 模式下运行,即该容器在后台运行,不占据终端,同时它需要完成 port mapping——docker 默认容器内的 port 不会对外公布,进行一个 8081[外]:8081[内]
的 mapping,这样在容器外使用 localhost:8081 也可以访问。
运行成功可以看到 nexus 已经运行成功了:
❯ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sonatype/nexus3 latest 0b14bd3acc13 9 days ago 552MB
admin 登陆
刚开始还没完全加载好的页面是这样的:
完了就会提示需要登录,并且提供了密码路径:
使用以下指令查看密码,登陆,修改密码即可:
❯ docker container exec nexus cat /nexus-data/admin.password
repo 类型
nexus 中主要有这么几种类型:
- proxy
- group
- hosted
其提供的优点有:
-
提供中心化管理
对于开发来说,项目中所有地址可以指向 proxy 地址,而不用填写多个 central repo 的地址
-
缓存
所有下载的 repo 都会被缓存到 nexus 中,这样相对而言就比较稳定,也可以减少访问 central repo 的流量
-
权限管理
比如说我们访问 nexus 就必须要求使用 vpn 访问内网才能用
-
分组权限管理
控制那些 repo/artifact 可以被哪些组群的人访问
同样,这些组合的话也可以提供更强的安全性,如公司内部 deploy 的 repo 只有公司内部的人可以使用
新建 maven group
这个在 nexus 的 UI 上操作即可,首先需要以管理员权限登录,随后到设置里面选择新建 repository:
可以看到可供选择的选项有很多:
这里选择 maven2(group)
即可
基础内容不用管太多,需要填写的事名字和 repo 的 group:
这代表着歌 group 负责中心管理(链接 central repo),snapshots 和 release 的管理
setting xml
这个文件是放在 .m2
根目录下的,大致内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd">
<servers>
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>nexus-releases</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
<mirrors>
<mirror>
<id>central</id>
<name>central</name>
<url>http://localhost:8081/repository/maven-group/</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
</settings>
这会让所有的访问全都重定向到 http://localhost:8081/repository/maven-group/
,这个 url 地址是之前创建的 maven-group 的网址:
mirror 是一个镜像地址,不设置的话就是 settings.xml 里的默认值
不过这些配置也可以在 nexus 里搞,这样项目只需要稳定的从 nexus 里进行数据交互即可
新建 maven 项目并进行配置
这里快捷键创建了一个 maven 项目,初始 pom 如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ga.maven</groupId>
<artifactId>repodemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</project>
当然,这些不是重点,重点的是下面的配置:
<repositories>
<repository>
<id>maven-group</id>
<url>http://localhost:8081/repository/maven-group/</url>
</repository>
</repositories>
<distributionManagement>
<snapshotRepository>
<id>nexus-snapshots</id>
<url>http://localhost:8081/repository/maven-snapshots/</url>
</snapshotRepository>
<repository>
<id>nexus-releases</id>
<url>http://localhost:8081/repository/maven-releases/</url>
</repository>
</distributionManagement>
dependencies 里面定义要到哪个 central repo 里面去下载项目,鉴于 nexus 提供了 proxy,所以这里只需要提供 nexus 的网址即可
<distributionManagement>
定义了 deploy 的 snapshot&release 放到哪里去,这里的 id 最好是与 settings.xml 中一致,我之前少打了一个 s
,最终导致 deply 失败。
install & deploy
我把 .m2
下面的 repo 删了,这样下载看得比较清楚些
install
install 的时候可以看到,所有的依赖都是从 localhost 下载的:
❯ ls ~/.m2/repository
❯ mvn install
[INFO] Scanning for projects...
[INFO]
[INFO] -----------------------< com.ga.maven:repodemo >------------------------
[INFO] Building repodemo 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
Downloading from central: http://localhost:8081/repository/maven-group/org/apache/maven/plugins/maven-resources-plugin/2.6/maven-resources-plugin-2.6.pom
Downloaded from central: http://localhost:8081/repository/maven-group/org/apache/maven/plugins/maven-resources-plugin/2.6/maven-resources-plugin-2.6.pom (8.1 kB at 19 kB/s)
Downloading from central: http://localhost:8081/repository/maven-group/org/apache/maven/plugins/maven-plugins/23/maven-plugins-23.pom
Downloaded from central: http://localhost:8081/repository/maven-group/org/apache/maven/plugins/maven-plugins/23/maven-plugins-23.pom (9.2 kB at 121 kB/s)
Downloading from central: http://localhost:8081/repository/maven-group/org/apache/maven/maven-parent/22/maven-parent-22.pom
Downloaded from central: http://localhost:8081/repository/maven-group/org/apache/maven/maven-parent/22/maven-parent-22.pom (30 kB at 327 kB/s)
Downloading from central: http://localhost:8081/repository/maven-group/org/apache/apache/11/apache-11.pom
Downloaded from central: http://localhost:8081/repository/maven-group/org/apache/apache/11/apache-11.pom (15 kB at 218 kB/s)
Downloading from central: http://localhost:8081/repository/maven-group/org/apache/maven/plugins/maven-resources-plugin/2.6/maven-resources-plugin-2.6.jar
Downloaded from central: http://localhost:8081/repository/maven-group/org/apache/maven/plugins/maven-resources-plugin/2.6/maven-resources-plugin-2.6.jar (30 kB at 469 kB/s)
Downloading from central: http://localhost:8081/repository/maven-group/org/apache/maven/plugins/maven-compiler-plugin/3.1/maven-compiler-plugin-3.1.pom
Downloaded from central: http://localhost:8081/repository/maven-group/org/apache/maven/plugins/maven-compiler-plugin/3.1/maven-compiler-plugin-3.1.pom (10 kB at 129 kB/s)
deploy
这里主要就最后几行,deploy 到 localhost 比较重要些
❯ mvn clean install deploy
[INFO] Scanning for projects...
[INFO]
[INFO] -----------------------< com.ga.maven:repodemo >------------------------
[INFO] Building repodemo 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ repodemo ---
[INFO] Deleting /Users/louhan/study/maven/repodemo/target
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ repodemo ---
[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) @ repodemo ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ repodemo ---
[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:testCompile (default-testCompile) @ repodemo ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ repodemo ---
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ repodemo ---
[INFO] Building jar: /Users/louhan/study/maven/repodemo/target/repodemo-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ repodemo ---
[INFO] Installing /Users/louhan/study/maven/repodemo/target/repodemo-0.0.1-SNAPSHOT.jar to /Users/louhan/.m2/repository/com/ga/maven/repodemo/0.0.1-SNAPSHOT/repodemo-0.0.1-SNAPSHOT.jar
[INFO] Installing /Users/louhan/study/maven/repodemo/pom.xml to /Users/louhan/.m2/repository/com/ga/maven/repodemo/0.0.1-SNAPSHOT/repodemo-0.0.1-SNAPSHOT.pom
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ repodemo ---
[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) @ repodemo ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ repodemo ---
[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:testCompile (default-testCompile) @ repodemo ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ repodemo ---
[INFO] Skipping execution of surefire because it has already been run for this configuration
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ repodemo ---
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ repodemo ---
[INFO] Installing /Users/louhan/study/maven/repodemo/target/repodemo-0.0.1-SNAPSHOT.jar to /Users/louhan/.m2/repository/com/ga/maven/repodemo/0.0.1-SNAPSHOT/repodemo-0.0.1-SNAPSHOT.jar
[INFO] Installing /Users/louhan/study/maven/repodemo/pom.xml to /Users/louhan/.m2/repository/com/ga/maven/repodemo/0.0.1-SNAPSHOT/repodemo-0.0.1-SNAPSHOT.pom
[INFO]
[INFO] --- maven-deploy-plugin:2.7:deploy (default-deploy) @ repodemo ---
Downloading from nexus-snapshots: http://localhost:8081/repository/maven-snapshots/com/ga/maven/repodemo/0.0.1-SNAPSHOT/maven-metadata.xml
Uploading to nexus-snapshots: http://localhost:8081/repository/maven-snapshots/com/ga/maven/repodemo/0.0.1-SNAPSHOT/repodemo-0.0.1-20230918.015512-1.jar
Uploaded to nexus-snapshots: http://localhost:8081/repository/maven-snapshots/com/ga/maven/repodemo/0.0.1-SNAPSHOT/repodemo-0.0.1-20230918.015512-1.jar (1.5 kB at 11 kB/s)
Uploading to nexus-snapshots: http://localhost:8081/repository/maven-snapshots/com/ga/maven/repodemo/0.0.1-SNAPSHOT/repodemo-0.0.1-20230918.015512-1.pom
Uploaded to nexus-snapshots: http://localhost:8081/repository/maven-snapshots/com/ga/maven/repodemo/0.0.1-SNAPSHOT/repodemo-0.0.1-20230918.015512-1.pom (818 B at 10 kB/s)
Downloading from nexus-snapshots: http://localhost:8081/repository/maven-snapshots/com/ga/maven/repodemo/maven-metadata.xml
Uploading to nexus-snapshots: http://localhost:8081/repository/maven-snapshots/com/ga/maven/repodemo/0.0.1-SNAPSHOT/maven-metadata.xml
Uploaded to nexus-snapshots: http://localhost:8081/repository/maven-snapshots/com/ga/maven/repodemo/0.0.1-SNAPSHOT/maven-metadata.xml (770 B at 7.9 kB/s)
Uploading to nexus-snapshots: http://localhost:8081/repository/maven-snapshots/com/ga/maven/repodemo/maven-metadata.xml
Uploaded to nexus-snapshots: http://localhost:8081/repository/maven-snapshots/com/ga/maven/repodemo/maven-metadata.xml (280 B at 5.7 kB/s)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.693 s
[INFO] Finished at: 2023-09-17T21:55:12-04:00
[INFO] ------------------------------------------------------------------------
当然,图示更明显一些: