在 Docker 搭建 Maven 私有库

小引

If you are developing software without a repository manager you are likely missing a number of opportunities to reduce some pretty obvious inefficiencies. If everyone on your team has to hit public repositories like the Central Repository to download components, you are missing out on some simple gains in speed and efficiency. If you don’t have a local place to deploy components you are forced to share binary components using half-measures and compromises such as storing binaries in source control. Stop developing in the Dark Ages, read this book, and start using a repository manager. Trust us, once you start using a Nexus Repository Manager, you’ll wonder how you ever functioned without it.此文源自Repository Management with Nexus

破船译:在软件开发中,如果没有使用仓库管理工具(repository manager),你将与高效率擦肩而过。如果团队中的每个开发人员都去类似 Central Repository 这样公共的仓库中获取组件,那么肯定会在速度和效率上得不偿失。在本地,如果没有提供一个地方来部署组件,那你使用的策略肯定需要作出许多妥协,比如在代码版本库中存储二进制文件(非常不建议这样做)。停止如此原始的开发方式吧,请阅读此书,并开启 repository manager 时代吧。一旦你开始使用 repository manager(Nexus),你肯定会抱怨为什么以前不使用它呢。

作为一个希望让正确的事情持续发生的人来说,对速度和效率的追求是一个永恒的话题。身为开发人员的我们,如今在开发过程中,无论是 Android、iOS 或后端开发,都不可避免会用到第三方库,这也也催生了许多优秀的第三方依赖管理工具,例如 iOS 的 CocoaPods,Java 后端开发的 Maven,Android 则使用 Gradle。而由于绿色环境的原因,有的人可能在下载第三方依赖时陷入了漫长的等待中,或许可以美名其曰:喝杯咖啡的时间刚刚好。但是当喝完咖啡回来时,发现屏幕上出现的是 TIMEOUT,顿时陷入了沉思。或许对于没有发现因此而催生的特色产业(代理、VPN)人来说,已经开始怀疑人生了。当然,针对这个问题,国内也有许多加速器可以使用,或许别的办法。不过,在这篇文章中,我不会告诉你如何寻找加速器、如何设置源、如何科学上网。本文我将给大家介绍如何搭建 Maven 私有库。

简介

我们在进行 Java 后端开发时,为了解决工程对第三方库依赖管理,一般都会使用 Maven 工程,大家都知道如果对每一个依赖库都从 Central Repository 下载,那么速度会很慢,有时候对于只有几 K 的一个库,都会下载不失败(科学上网的可以忽略),这会让人很抓狂,如果多人进行协同开发,那么这样的抓狂会被扩大。那么比较好的解决办法,就是搭建内部自己的 Maven 私有库。我们希望私有库提供这样的功能,在工程下载依赖的时候,如果私有库中存在这个依赖库,则直接从这个私有库中下载,如果私有库中没有所需要的依赖库,私有库先从 Central Repository 中下载并缓存,下次在获取的时候,就直接使用该缓存即可。大家可能会问,有没有这样的工具呢?其实早就有了,Nexus 就是其中之一。下面就进入正文吧。

下载 Nexus 镜像

这里推荐的方案是利用 Docker 来搭建 Nexus 环境。这里默认大家已经都有 Docker 环境了。

首先利用下面的命令下载最新的 nexus 镜像

docker pull sonatype/nexus

下载过程如下所示:

1
2
3
4
5
6
7
8
9
10
11
docker pull sonatype/nexus
Using default tag: latest
latest: Pulling from sonatype/nexus
8d30e94188e7: Pull complete
9b5961d40d03: Pull complete
074855ae6153: Pull complete
cc0a3a494fba: Pull complete
8cfd0607bbfb: Pull complete
Digest: sha256:6bb1966022009da38c4f679b51d2106f4d595aa7b887ac0bf93d14ebe4c0faa2
Status: Downloaded newer image for sonatype/nexus:latest

创建并启动 Nexus

首先创建一个数据卷容器,如下命令

docker run -d –name nexus-data sonatype/nexus echo “data-only container for Nexus”

然后启动 Nexus

docker run -d -p 10081:8081 –name nexus –volumes-from nexus-data sonatype/nexus

上面的命令中,将本机的 10081 端口映射到容器中的 8081 端口,并加载 数据卷容器 nexus-data。

创建容器过程需要一段时间时间进行初始化,可以用如下命令查看相关日志:

docker logs -f nexus

在浏览器输入 http://localhost:10081/nexus/ 可以看到如下界面,说明 nexus 已经启动好了。

image

使用 Nexus

在这个私有库中,提供了一些仓库地址给我们使用,如下图所示:

image

关于每个仓库的意义何在,请移步到 Nexus 的官网中学习(文末给出了参考链接),此文不再进行介绍。

私有仓库的使用有两种方法,一种是对工程的 pom.xml 文件进行修改(这种方法只对 pom.xml 所属工程生效),如下所示:
将如下的repositories节点添加到 pom.xml 文件即可,Maven 会到此文件中配置的私有库,下载相应的依赖库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>testnexus</groupId>
<artifactId>zzx</artifactId>
<version>1.0-SNAPSHOT</version>
<repositories>
<repository>
<id>nexus</id>
<name>Team Nexus Repository</name>
<url>http://localhost:10081/nexus/content/groups/public/</url>
</repository>
</repositories>
<dependencies>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.41</version>
</dependency>
</dependencies>
</project>

另外一种方法就是直接修改 maven 的配置文件,这样所有工程默认都会使用私有库。如下所示:

~/.m2/settings.xml 文件中,将 mirror 修改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<settings>
<mirrors>
<mirror>
<!--This sends everything else to /public -->
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://localhost:10081/nexus/content/groups/public</url>
</mirror>
</mirrors>
<profiles>
<profile>
<id>nexus</id>
<!--Enable snapshots for the built in central repo to direct -->
<!--all requests to nexus via the mirror -->
<repositories>
<repository>
<id>central</id>
<url>http://central</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<url>http://central</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<!--make the profile active all the time -->
<activeProfile>nexus</activeProfile>
</activeProfiles>
</settings>

当利用 maven 进行工程打包时,可以看到,已经从私有库中下载依赖了(当在另外一台机器上使用相应的依赖库时,就直接使用私有库中所缓存的依赖了,不用再到互联网中下载,是不是很节约时间!):

1
2
3
4
5
6
7
8
9
10
testnesus mvn package
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building zzx 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: http://localhost:10081/nexus/content/groups/public/com/alibaba/fastjson/1.1.41/fastjson-1.1.41.pom
Downloaded: http://localhost:10081/nexus/content/groups/public/com/alibaba/fastjson/1.1.41/fastjson-1.1.41.pom (9 KB at 2.9 KB/sec)
Downloading: http://localhost:10081/nexus/content/groups/public/com/alibaba/fastjson/1.1.41/fastjson-1.1.41.jar
Downloaded: http://localhost:10081/nexus/content/groups/public/com/alibaba/fastjson/1.1.41/fastjson-1.1.41.jar (350 KB at 16.5 KB/sec)

关于更多内容,请上 Nexus 的官网学习。

参考资料