[maven] 使用 Nexus 管理 repository

[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

maven install build deploy
Organization Repository
Central Repository
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 才行:

[maven] 使用 Nexus 管理 repository_第1张图片

运行 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 登陆

刚开始还没完全加载好的页面是这样的:

[maven] 使用 Nexus 管理 repository_第2张图片

完了就会提示需要登录,并且提供了密码路径:

[maven] 使用 Nexus 管理 repository_第3张图片

使用以下指令查看密码,登陆,修改密码即可:

docker container exec nexus cat /nexus-data/admin.password

[maven] 使用 Nexus 管理 repository_第4张图片

[maven] 使用 Nexus 管理 repository_第5张图片

[maven] 使用 Nexus 管理 repository_第6张图片

[maven] 使用 Nexus 管理 repository_第7张图片

repo 类型

[maven] 使用 Nexus 管理 repository_第8张图片

nexus 中主要有这么几种类型:

  • proxy
  • group
  • hosted

其提供的优点有:

  • 提供中心化管理

    对于开发来说,项目中所有地址可以指向 proxy 地址,而不用填写多个 central repo 的地址

  • 缓存

    所有下载的 repo 都会被缓存到 nexus 中,这样相对而言就比较稳定,也可以减少访问 central repo 的流量

  • 权限管理

    比如说我们访问 nexus 就必须要求使用 访问内网才能用

  • 分组权限管理

    控制那些 repo/artifact 可以被哪些组群的人访问

同样,这些组合的话也可以提供更强的安全性,如公司内部 deploy 的 repo 只有公司内部的人可以使用

新建 maven group

这个在 nexus 的 UI 上操作即可,首先需要以管理员权限登录,随后到设置里面选择新建 repository:

[maven] 使用 Nexus 管理 repository_第9张图片

可以看到可供选择的选项有很多:

[maven] 使用 Nexus 管理 repository_第10张图片

这里选择 maven2(group) 即可

基础内容不用管太多,需要填写的事名字和 repo 的 group:

[maven] 使用 Nexus 管理 repository_第11张图片

[maven] 使用 Nexus 管理 repository_第12张图片

这代表着歌 group 负责中心管理(链接 central repo),snapshots 和 release 的管理

setting xml

这个文件是放在 .m2 根目录下的,大致内容如下:


<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-snapshotsid>
      <username>adminusername>
      <password>admin123password>
    server>
    <server>
      <id>nexus-releasesid>
      <username>adminusername>
      <password>admin123password>
    server>
  servers>

  <mirrors>
    <mirror>
      <id>centralid>
      <name>centralname>
      <url>http://localhost:8081/repository/maven-group/url>
      <mirrorOf>*mirrorOf>
    mirror>
  mirrors>

settings>

这会让所有的访问全都重定向到 http://localhost:8081/repository/maven-group/,这个 url 地址是之前创建的 maven-group 的网址:

[maven] 使用 Nexus 管理 repository_第13张图片

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.0modelVersion>
	<groupId>com.ga.mavengroupId>
	<artifactId>repodemoartifactId>
	<version>0.0.1-SNAPSHOTversion>
project>

当然,这些不是重点,重点的是下面的配置:

	<repositories>
		<repository>
			<id>maven-groupid>
			<url>http://localhost:8081/repository/maven-group/url>
		repository>
	repositories>

	<distributionManagement>
		<snapshotRepository>
			<id>nexus-snapshotsid>
			<url>http://localhost:8081/repository/maven-snapshots/url>
		snapshotRepository>
		<repository>
			<id>nexus-releasesid>
			<url>http://localhost:8081/repository/maven-releases/url>
		repository>
	distributionManagement>

dependencies 里面定义要到哪个 central repo 里面去下载项目,鉴于 nexus 提供了 proxy,所以这里只需要提供 nexus 的网址即可

定义了 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] ------------------------------------------------------------------------

当然,图示更明显一些:

[maven] 使用 Nexus 管理 repository_第14张图片

你可能感兴趣的:(Java,maven,java)