写点什么

研发提效必备技能:手把手教你基于 Docker 搭建 Maven 私服仓库

作者:EquatorCoco
  • 2023-12-22
    福建
  • 本文字数:4930 字

    阅读完需:约 16 分钟

在研发的过程中,很多企业都会针对自身业务特点来定制研发一些工具类库,但是这些工具类库又不会对外公开,那如何在组织内部共享这些类库呢?一种很好的方式就是在公司内部搭建一套 Maven 私服仓库。


一、背景知识


搭建 Maven 私服仓库可以提高项目构建和部署的效率、稳定性和安全性,同时方便管理内部开发的组件和私有库,比较适用于企业内部或者特定场景下的需求。


就拿我们星球的分布式 IM 即时通讯系统来说,对于后端服务,我们将其划分成了 多系统共用模型与工具、即时通讯后端服务、大后端平台、即时通讯 SDK、OpenAI 大模型接入服务 等。


其中,多系统共用模型与工具会被其他服务依赖,即时通讯 SDK 和 OpenAI 大模型接入服务也会被其他服务依赖,并且多系统共用模型与工具、即时通讯 SDK 和 OpenAI 大模型接入服务都是我们开发分布式 IM 即时通讯系统时的私有库和组件,所以,在设计和研发分布式 IM 即时通讯系统的过程中,我们也需要搭建一套自己的 Maven 私服来统一管理这些私有库和组件。


好了,那接下来,我们就一起搭建 Maven 私服仓库吧。


二、环境说明


  • 服务器版本:CentOS7

  • 主机名:binghe102

  • IP 地址:192.168.106.102

  • Maven 私服镜像:sonatype/nexus3


三、环境搭建


基于 Docker 搭建 Maven 私服的步骤如下所示。


3.1 下载 Nexus3 镜像


在服务器命令行输入如下命令,下载 Nexus3 镜像。


docker pull sonatype/nexus3
复制代码


这里,视网络情况,可能需要耐心等待一会儿。


3.2 查看 Nexus3 镜像


在服务器命令行输入如下命令,查看下载的 Nexus3 镜像。


[root@binghe102 ~]# docker imagesREPOSITORY        TAG       IMAGE ID       CREATED         SIZEsonatype/nexus3   latest    589f7296a4a2   23 months ago   655MB
复制代码


可以看到,已经成功下载 Nexus3 镜像。


3.3 创建 Nexus3 挂载文件夹


在服务器命令行输入如下命令,创建 nexus 的挂载文件夹。


mkdir /usr/local/nexus-data && chown -R 200 /usr/local/nexus-data
复制代码


3.4 启动 Nexus3 容器


在服务器命令行输入如下命令,启动 Nexus3 容器。


docker run -d -p 8081:8081 --name nexus -v /usr/local/nexus-data:/nexus-data --restart=always sonatype/nexus3
复制代码


可以看到,在上述启动命令中,我们将 Nexus3 容器的/nexus-data目录映射到了宿主机的/usr/local/nexus-data目录。此时,Nexus3 容器运行过程中,在/nexus-data目录产生的文件和日志都会在宿主机的/usr/local/nexus-data目录中查看到。


3.5 查看 Nexus3 容器启动状态


在服务器命令行输入如下命令,查看 Nexus3 容器启动状态。


[root@binghe102 ~]# docker psCONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS         PORTS                                       NAMES59e27830bbaa   sonatype/nexus3   "sh -c ${SONATYPE_DI…"   2 minutes ago   Up 2 minutes   0.0.0.0:8081->8081/tcp, :::8081->8081/tcp   nexus
复制代码


可以看到,Nexus3 容器启动成功,监听了 8081 端口。


四、Nexus3 配置


搭建完 Nexus3 环境后,我们还需要对其进行配置,具体配置的步骤如下所示。


4.1 打开 Nexus3 页面


Nexus3 容器启动时监听的端口和宿主机端口都是 8081,所以,我们在浏览器地址栏输入http://192.168.106.102:8081打开 Nexus3 页面,如图 1 所示。



4.2 登录 Nexus3


点击 Nexus3 右上角的登录,如图 2 所示。



点击后会弹出如图 3 所示的提示框。



根据提示得知,初始密码的存放位置为/nexus-data/admin.password,因为我们在启动 Nexus3 容器时,将 Nexus3 容器的/nexus-data目录映射到了宿主机的/usr/local/nexus-data目录,所以,我们在宿主机的/usr/local/nexus-data目录中也能够查询到admin.password文件。


所以,在宿主机中输入如下命令即可查看到 admin.password 文件。


ll /usr/local/nexus-data
复制代码


具体如图 4 所示。



输入如下命令查看admin.password文件的内容。


[root@binghe102 ~]# cat /usr/local/nexus-data/admin.password 517842df-1a2d-49c9-b4c3-b9ad4cf0fe00
复制代码


此时,我们就查看到登录 Nexus3 的 admin 账号的密码为517842df-1a2d-49c9-b4c3-b9ad4cf0fe00,将 admin 账号和对应的密码输入到图 3 所示的提示框中,即可登录 Nexus3,如图 5 所示。



登录后的界面如图 6 所示。



可以看到,首次登录后会自动弹出完成必要设置的提示框,点击 Next 按钮,设置新密码,如图 7 所示。



这里,自行记录新设置的密码,用于后续登录 Nexus。


点击 Next 按钮,选择nable anonymous access,如图 8 所示。



点击 Next 按钮,如图 9 所示。



点击 Finish 按钮,即可完成设置。


4.3 配置阿里云代理仓库


Nexus 默认使用的远程仓库为maven-central,从这个远程仓库下载依赖很慢,经常连不上,如图 10 所示。



鼠标单机maven-central仓库,查看maven-central仓库配置的远程链接,如图 11 所示。



可以看到,maven-central仓库配置的远程链接为https://repo1.maven.org/maven2/,从这个远程仓库下载依赖很慢,经常连不上,所有我们需要配置阿里云远程代理仓库。


回到图 10 所示的页面,点击Create repository按钮,如图 12 所示。



点击后进入选择仓库类型的页面,这里我们选择maven2(proxy)类型,如图 13 所示。



点击选则maven2(proxy)类型后,进入配置远程代理仓库的页面,如图 14 所示。



其中,每个配置项如下所示。



接下来,拖动 3-14 页面右侧的滚动条,滑到最下面,点击 Create repository 按钮,如图 15 所示。



点击 Create repository 按钮后,就可以在 Repositories 列表中看到新配置的阿里云代理仓库了,如图 16 所示。



并且 Status 显示的是Online - Ready to connect,说明阿里云远程仓库配置成功。


4.4 配置仓库组


接下来,需要将 aliyun-central 配置到仓库组,并且将 aliyun-central 排在 maven-central 上面。具体步骤如下所示。


在 Repositories 列表中,点击maven-public,如图 17 所示。



点击后进入如图 18 所示的页面。



下拉页面右侧的滚动条,找到如图 19 所示的配置。



将 aliyun-central 移动到右侧,并排在最上面,如图 20 所示。



点击 Save 按钮保存配置。


4.5 创建用户


接下来,创建一个用于上传 Jar 包到仓库的用户,具体步骤如下所示。


点击 Security 菜单下的 Users 菜单,如图 21 所示。



点击 Users 菜单后,点击 Create local user 按钮,如图 22 所示。



随后,按照图 23 所示设置用户的基本信息。



这里,自行记录用户的密码,用于后续上传 jar 文件使用,配置好之后,点击底部的 Create local user 按钮即可。点击后在 Security 菜单下的 Users 菜单的用户列表中,可以查看到新创建的本地用户,如图 24 所示。



至此,Nexus3 配置完毕。


五、配置本地 Maven 仓库


配置完 Nexus 后,接下来,还需要对本地的 Maven 仓库进行配置,主要就是对 Maven 的的 settings.xml 文件进行配置。


5.1 复制 settings 文件


复制 setting.xml 文件为 setting-binghe.xml 文件,如图 25 所示。



5.2 配置 servers 节点


在 settings-binghe.xml 文件中,找到 servers 节点,在 servers 节点中,配置 5.5 节创建的用户,如下所示。


<server>    <id>binghe</id>    <username>binghe</username>    <password>binghe123</password></server>
复制代码


5.3 配置 mirrors 节点


在 settings-binghe.xml 文件中,找到 mirrors 节点,在 mirrors 节点中,配置仓库地址,如下所示。


<!--本地私服仓库地址--><mirror>    <id>central</id>    <name>Local Repository</name>    <url>http://192.168.106.102:8081/repository/maven-public</url>    <mirrorOf>*</mirrorOf></mirror><!--阿里云仓库地址--><mirror>    <id>nexus-aliyun</id>    <mirrorOf>*</mirrorOf>    <name>Nexus aliyun</name>    <url>http://maven.aliyun.com/nexus/content/groups/public</url></mirror>
复制代码


5.4 配置 profiles 节点


在 settings-binghe.xml 文件中,找到 profiles 节点,在 profiles 节点中,配置仓库信息,如下所示。


<profile>    <id>maven-public</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.compiler.target>        <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>    </properties>    <repositories>        <repository>            <id>nexus-public</id>            <url>http://192.168.106.102:8081/repository/maven-public/</url>            <releases>                <enabled>true</enabled>                <updatePolicy>always</updatePolicy>            </releases>            <snapshots>                <enabled>true</enabled>                <updatePolicy>always</updatePolicy>            </snapshots>        </repository>    </repositories></profile>
复制代码


至此,Maven 私服仓库搭建完毕,并且本地 Maven 也已经配置完毕。


后续使用 Maven 构建项目时,指定使用 binghe-settings.xml 文件即可将依赖的 Jar 文件和生成的 Jar 文件上传到 Maven 私服仓库,如果使用 IDEA 编译项目,也需要在 IDEA 中,将 Maven 的配置文件指定为 settings-binghe.xml。


注意:我已经将 settings-binghe.xml 文件上传到本节对应源码分支的environment/maven目录下,大家自行获取即可。


六、项目 pom.xml 配置


搭建完 Maven 私服仓库,配置好本地 Maven 仓库后,还需要在项目的 pom.xml 文件中进行相应的配置,具体如下所示。


<build>    <plugins>        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-compiler-plugin</artifactId>            <version>3.8.1</version>            <configuration>                <source>${java.version}</source>                <target>${java.version}</target>                <encoding>${project.build.sourceEncoding}</encoding>            </configuration>        </plugin>        <!--发布代码Jar插件 -->        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-deploy-plugin</artifactId>            <version>2.8.2</version>        </plugin>        <!--发布源码插件 -->        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-source-plugin</artifactId>            <version>3.0.0</version>            <executions>                <execution>                    <phase>install</phase>                    <goals>                        <goal>jar-no-fork</goal>                    </goals>                </execution>            </executions>        </plugin>    </plugins></build>
<distributionManagement> <repository> <!--这里的id与settings.xml中的servers节点配置的用户ID一直,这样才能使用配置的用户去上传到maven私有仓库 --> <!--此仓库对应的为RELEASE版本的jar--> <id>binghe</id> <url>http://192.168.106.102:8081/repository/maven-releases/</url> </repository> <snapshotRepository> <!--这里的id与settings.xml中的servers节点配置的用户ID一直,这样才能使用配置的用户去上传到maven私有仓库 --> <!--此仓库对应的为SNAPSHOT版本的jar--> <id>binghe</id> <url>http://192.168.106.102:8081/repository/maven-snapshots/</url> </snapshotRepository></distributionManagement>
复制代码


是不是很简单?你照着文章一步步实操,就可以基于 Docker 搭建属于自己的 Maven 私服仓库了。


七、写在最后


这些真实场景的项目设计与落地实现,在冰河的知识星球除了分布式 IM 即时通讯系统外,还有其他 5 个项目,这些项目的需求、方案、架构、落地等均来自互联网真实业务场景,让你真正学到互联网大厂的业务与技术落地方案,并将其有效转化为自己的知识储备


文章转载自:冰河团队

原文链接:https://www.cnblogs.com/binghe001/p/17918307.html

体验项目:http://www.jnpfsoft.com/?from=001

用户头像

EquatorCoco

关注

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
研发提效必备技能:手把手教你基于Docker搭建Maven私服仓库_Docker_EquatorCoco_InfoQ写作社区