出品 | 51Testing软件测试网
比起手动进行Java工程第三方JAR包的依赖管理,使用Maven给予我们很大的便捷。协同开发更能保证依赖的一致性,对于开发者也可以一个JAR适用于任何需要它的工程,不需要来回复制。然而Maven中央库由于是国外的服务,下载JAR包有时候会非常费时。同时,为了内部开发环境的安全,搭建一个Maven私有库,基本是每个软件公司的标配。
本文从搭建私有库的原理开始,详细介绍使用Nexus搭建Maven私有库的方法。并对配置文件中与此相关的内容进行说明,最后集中讨论了与私有库有关的最常使用功能。
原理说明
通过Maven管理依赖,方便我们的工程管理。为了解决从国外的中央库下载过慢,以及从国内的镜像(如阿里云)多次下载的问题,公司内部搭建一个私有的Maven库非常必要。具体的原理可以通过下图对比说明。
在无私有库的情况下,项目组所有人都需要从远程仓库进行下载;而通过私有库的方式,只要下载一次就可以了。而且,如果项目内有需要互相依赖的包,采用私服的方式就更为方便。
搭建Maven私有库有很多选择,包括Apache的Archiva,JFrog的Artifactory,以及Sonatype的Nexus。本文以Nexus为例说明私有库搭建的方法。
前置步骤
Nexus的安装需要JDK的支持,安装步骤省略,检查JDK的安装结果如下:
安装Nexus
打开sonatype的官网:https://www.sonatype.com/。
选择Produces--->OSS Edition,进入Nexus的下载界面。
这里选择GET REPOSITORY OSS,获取免费的版本,根据需要也可以选择收费的专业版。
填入邮箱信息后,进行下载。
下载后的文件如下。
将文件传至服务器。
之后进行解压,这里将Nexus放在了/opt/nexus目录下。
解压完成后,生成两个文件夹,nexus-3.21.2-03是Nexus服务的运行文件,sonatype-work是Nexus的工作目录,是JAR包下载后的存放位置。
进入/opt/nexus/nexus-3.21.2-03/bin,通过./nexus start启动服务。
第一次登录时,admin的默认密码存储在/opt/nexus/sonatype-work/nexus3目录下的admin.password中(每次安装都不同)。
使用该密码登录系统,之后修改密码。修改后admin.password文件就消失了。
修改后admin.password文件就消失了。
这样就可以使用Nexus的Mave私有库了。
Nexus功能简介
4.1 界面功能简介 Nexus的功能很丰富,在第一个界面的功能时查看。包括查询已经下载的JAR,如点击Search---->Maven可以看到已经下载到私有库的JAR。 点击Browse是已经配置的Maven库。 这里列出了刚刚安装的Nexus服务支持仓库,和Maven相关的是前面四个,介绍如下: 1. maven-central: 这就是代理Maven 中央库。 2. maven-public: 这是仓库Group,包含了多个仓库,其中包含了releases、snapshots、和central。 3. maven-releases: 我们自己的项目要发布时,就应该发布在这个仓库,这也是Nexus维护的仓库,但不是代理。 4. maven-snapshots: 自己项目Snapshot的仓库。 Nexus默认的仓库已经满足大部分需求了,当然还可以添加需要的仓库,后面有详细介绍。这里每个仓库都有一个类型,说明如下: 1. hosted: 本地类型的仓库,内部项目的发布仓库。 2. proxy: 代理类型的仓库,从远程 (如中央库) 中寻找数据的仓库。 3. group: 组类型的仓库,组仓库本身不具有任何属性,需要将hosted、proxy类型的仓库加入到组中进行管理,方便了开发中使用一个组仓库的配置就可以关联多个仓库。 当我们点击任意一个曾经为我们下载过依赖包的仓库时,可以看到已经下载的依赖。比如我们查看maven-central的下载的依赖包: Nexus设置相关的内容非常丰富,说明如下。 其中最常用,也是Nexus的核心功能就是仓库相关的配置。具体说明如下。 1. Repository :仓库设置。 2. Blob Stores: 存储设置,文件存储的地方。创建一个目录的话,就对应文件系统的一个目录,可以根据需要将Maven仓库的存储位置设定为该目录。 3. Content Selectors: 内容选择器,提供选择特定依赖包的方法。支持使用CSEL语言编写的表达式进行过滤。 4. Cleanup Policies: 清理策略,仓库清理的设置,可以通过时间、包名等策略设定如何清理仓库。 5. Routing Rules: 路由规则,类似于ACL,阻止Nexus向中央库或其他配置的仓库发送某些请求。这可用于防止内部项目泄漏,以及防止恶意用户进行名称劫持攻击。 4.2 新增仓库说明 Nexus安装完成后,会自带如下四个仓库:proxy类型的maven-central;两个hosted类型仓库:maven-releases和maven-snapshots;以及一个group类型的仓库:maven-public,它包含了前面的3个仓库。 这种默认的设定已经满足大部分需求了,含义是我们通过maven-central获取中央库的依赖包,通过maven-releases和maven-snapshots管理本地发布和快照包。使用一个maven-public进行统一的获取入口 (即配置文件的配置) 。 根据实际的需求可以添加其他仓库,比如为了提高依赖包的下载速度可以添加国内的服务器作为优先的代理仓库;或者一些特定的依赖只有在其特定的库中才能下载到。以添加国内服务器以提高下载速度为例,我们添加阿里云的仓库作为下载的首选。 在仓库设置界面点击Create repository。 在仓库类型中选择maven2(proxy)。 按需要配置如下字段,其中Remote storage,要配置阿里云的链接: http://maven.aliyun.com/nexus/content/groups/public 其他配置使用默认即可。 最后点击Create repository,完成创建该远程仓库。 通过Browse可以浏览到刚刚添加的仓库。 完成创建的仓库可以单独在配置文件中使用,也可以加入到group类型的仓库中统一使用。后者的使用更常见,比如我们把刚刚添加的仓库加入到上面的maven-public中。 在设置中点击该仓库:maven-public。 将刚刚创建的仓库加入到该group仓库中。 配置完成后的效果如下。配置文件说明
5.1 Maven配置文件
修改Maven的配置文件,位于Maven根目录的conf文件夹,如F:\softwore\apache-maven-3.6.2\conf。事实上,Maven并不区分是私有库,还是中央库,只要对相关配置进行定义,Maven就按照配置进行依赖包的下载。重要的配置包括:
1. servers。配置连接远程库的验证方式,对于私有库要配置私有库的用户名和密码,即在Nexus的Security--->User中配置的用户。
2. mirrors。配置使用的远程仓库,通过mirrorOf可以进行定制的过滤。mirrors是下载依赖的配置。
3. profile的repositories。配置远程仓库连接,可以对releases、snapshots类型的依赖包进行针对性的配置。profile还有很多其他属性设置,如jdk版本、激活条件等等,可以查看Maven相关的教程进行学习。此例中的配置作用是后续上传JAR的需要,具体见8.4的介绍。
典型的配置如下。
5.2 Maven工程文件pom.xml
Maven工程的pom.xml文件,对于仓库的配置是继承Maven配置文件的, 所以工程文件在无特殊需求的时候,不需要体现任何远程库、私有库的配置。如下是一个依赖了mysql的示例。
Maven工程依赖下载
通过安装Nexus、设置Nexus(可选)、修改Maven配置文件,一个基于Nexus的私有库已经搭建完成,之后就是使用该私有Maven进行开发的工作了。在实际使用Maven私有库时,经常遇到的一些情况,下面分别进行说明。
6.1 下载中央库的依赖
最常见的需求是下载中央库,或者设置好的其他的proxy类型仓库的依赖。我们以7.2节的工程为例,该工程依赖mysql,版本是8.0.19。
首先查看本地仓库和远程仓库(即Nexus的私有仓库,此时对开发者而言就是远程仓库,后续直接称为远程仓库),都没有该依赖包。
之后我们在工程中进行maven clean,再进行maven compile,可以看到开始在远程仓库中下载依赖包。
之后我们再查看本地仓库和远程仓库。
并且我们可以看到,由于在之前配置阿里云仓库时,将maven-aliyun放在了maven-public的最优先位置,该mysql依赖包,是由阿里云仓库下载的。
6.2 添加其他Maven库
当需要一些特殊依赖包,而已经在远程仓库配置的proxy类型仓库不包含这些JAR包时,我们需要添加其他的Maven库。
配置的方法和增加阿里云仓库类似。配置时将Remote storage设置为需要的其他Maven仓库链接,同时在修改maven-public的members时注意优先顺序。具体步骤可以参考6.2新增仓库。
6.3 上传第三方依赖包到Nexus
项目工程中使用的一些第三方JAR包,并没有第三方的proxy仓库供我们下载,此时需要统一上传到Nexus远程仓库进行管理和使用。
在项目中经常会用到这样的JAR包,某个开源组织提供的,很可能是在Git Hub上下载的源码编译而来,或者直接下载的JAR包。这样的JAR没有第三方的远程仓库供我们直接下载,同时又区别于我们自己项目中发布的JAR包。当然,我们可以将源码集成到自己的项目中,但从模块化、维护性等方面考虑,在没有特殊需要的时候,通过Nexus远程仓库统一管理是最正规的做法。上传后,后续开发成员可以直接获取该依赖。
以https://github.com/espritblock/eos4j源码为例,下载后编译通过,获得JAR包:eos4j-1.0.0.jar。在没有上传到远程仓库之前,其他工程或者其他开发人员无法获取该依赖包。比如在7.2中的工程中增加依赖。
为了方面管理第三方JAR包,在Nexus中增加一个hosted类型的远程仓库,添加方式与6.2类似,之后将其加入到maven-public中。
之后在仓库列表中点击刚刚添加的第三方依赖管理仓库:maven-3rd-party。
之后点击Upload component。
选择需要上传的JAR包,设置坐标信息。其中Generate a POM file with these coordinates(为这些坐标生成POM文件),必须勾选,否则相当于该远程仓库没有该JAR包的坐标,本地工程的Maven是无法获取到该远程仓库这个JAR的。
上传完成后,可以在maven-3rd-party仓库中查看该依赖。
此时,依赖该JAR包的工程能够正常下载并编译通过。
本地仓库中也缓存了该JAR包。
当然,也可以通过命令行进行上传,首先修改Maven配置文件,增加如下项目。
上述操作的命令为:
mvn deploy:deploy-file -DgroupId=io.eblock.eos -DartifactId=eos4j -Dversion=1.0.0 -Dpackaging=jar -Dfile=F:/eos4j-1.0.0.jar -Durl=http://192.168.3.77:8081/repository/maven-3rd-party/ -DrepositoryId=maven-3rd-party6.4 项目工程JAR包发布到Nexus
按模块开发时,JAR包经常会被其他人依赖,可以通过自动发布到Nexus的方式达成该目标。
项目本身开发的库,特别是一些公共库、底层函数,经常会被其他人引用,将这些JAR放在远程仓库上会带来极大的方便。当然,我们可以使用与8.3一样的方法,上传到远程仓库。但是,如果有该JAR包源码发生变动的时候,还要手工进行上传。实际上,Maven提供了自动发布的机制。
首先在Maven配置文件中添加如下配置。
之后修改Maven工程的pom.xml文件,增加如下配置。
当构建版本带有“SNAPSHOT”后缀(必须大写)时,Maven会认为是构建snapshots版本,JAR会被上传到snapshots对应的仓库中。
之后执行maven deploy命令。
会将该JAR包上传到snapshots仓库中,在Nexus可以看到如下信息。
如果构建文件配置的版本没有“SNAPSHOT”后缀,则会上传到releases仓库中。
这里我们可以看到snapshots版本和releases版本的区别。对应实际开发的过程,在使用maven过程中,我们在开发阶段会有很多公共库经常性的处于不稳定状态,随时需要修改并发布,可能一天就要发布一次或多次。而Maven的依赖管理是基于版本管理的,对于发布状态的组件,如果版本号相同,即使我们远程仓库上的组件比本地仓库新,Maven也不会主动下载。如果在开发阶段都是基于正式发布版本(releases)来做依赖管理,那么遇到这个问题,就需要升级组件的版本号,可这样就明显不符合要求和实际情况了。所以通过快照版本(snapshots),问题就迎刃而解了。
同时对比8.3节,上传第三方依赖包到Nexus和发布项目工程JAR包到Nexus,本质上并没有区别。比如我们将第三方源码编译,也可以直接上传到Nexus,甚至也可以全部上传到maven-snapshots仓库。当然,区分3rd-party,snapshot,releases,更能明确项目的结构层次,更符合实际的情况。
总结
本文以Nexus为例,说明了搭建Maven私有库的方法。首先讲解了私有库的原理,之后详细说明使用Nexus搭建Maven私有库的步骤。通过配置文件编写方式说明如何将Maven私有库配置到项目中,最后对私有库有关的经常使用的功能,结合实际例子进行了详细说明。
私有库的搭建,从职责上是运维的工作;受益者大多情况为开发人员。对于测试人员,一方面掌握更多的知识,技不压身;同时更深入了解Maven的原理和使用知识,极大的提高测试工具、测试框架的的开发效率。
推荐阅读点击阅读☞惊!测试员看不懂测试报告?这样的情况还不少!
点击阅读☞偶然发现的性能监控工具让人惊喜!不打算试试嘛?
点击阅读☞如何对APP进行Monkey测试?让自动化拯救手动测试!
点击阅读☞我是如何实现工资翻倍增长的?
点击阅读☞怎样将测试用例从xmind转换成Excel?给你总结好了!
戳