maven切换阿里云后每次都重新下载_看过这些才知道测试开发真不是谁都能做的!...

2292aaf19e11bddee4c0368afa0593a2.gif

出品 | 51Testing软件测试网

77a95705a4a9242dd87b1a8198625baa.png

比起手动进行Java工程第三方JAR包的依赖管理,使用Maven给予我们很大的便捷。协同开发更能保证依赖的一致性,对于开发者也可以一个JAR适用于任何需要它的工程,不需要来回复制。然而Maven中央库由于是国外的服务,下载JAR包有时候会非常费时。同时,为了内部开发环境的安全,搭建一个Maven私有库,基本是每个软件公司的标配。

本文从搭建私有库的原理开始,详细介绍使用Nexus搭建Maven私有库的方法。并对配置文件中与此相关的内容进行说明,最后集中讨论了与私有库有关的最常使用功能。

6140f4da6bea3746873efe5e656a7121.png

原理说明

  通过Maven管理依赖,方便我们的工程管理。为了解决从国外的中央库下载过慢,以及从国内的镜像(如阿里云)多次下载的问题,公司内部搭建一个私有的Maven库非常必要。具体的原理可以通过下图对比说明。

8c55a9f46f46ce119c289d4b8dea4876.png

  在无私有库的情况下,项目组所有人都需要从远程仓库进行下载;而通过私有库的方式,只要下载一次就可以了。而且,如果项目内有需要互相依赖的包,采用私服的方式就更为方便。

  搭建Maven私有库有很多选择,包括Apache的Archiva,JFrog的Artifactory,以及Sonatype的Nexus。本文以Nexus为例说明私有库搭建的方法。

4ceb48f74e593deae8e3b01298d29070.png

前置步骤

  Nexus的安装需要JDK的支持,安装步骤省略,检查JDK的安装结果如下:

4ab805db47de1a5a807d2a0cb7ec1704.png

34f18958e1a99acde88f7887ba70f9e3.png

安装Nexus

  打开sonatype的官网:https://www.sonatype.com/。

25fe4d882c64ca50b56b88a085e5d9dd.png

  选择Produces--->OSS Edition,进入Nexus的下载界面。

7546c2ff97ab39a54dff731ee1846e46.png

  这里选择GET REPOSITORY OSS,获取免费的版本,根据需要也可以选择收费的专业版。

4aadfecffbb58f78bdca3db526d163ef.png

  填入邮箱信息后,进行下载。

  下载后的文件如下。

b7e25d51c3888ce79b00480e26191226.png

  将文件传至服务器。

fd6ce804914f71e656146c1126c1cec8.png

  之后进行解压,这里将Nexus放在了/opt/nexus目录下。

51e47643a8245b8ea3a29b7173181c2a.png

  解压完成后,生成两个文件夹,nexus-3.21.2-03是Nexus服务的运行文件,sonatype-work是Nexus的工作目录,是JAR包下载后的存放位置。

12da23edad93908c43b82d9600dae97f.png

  进入/opt/nexus/nexus-3.21.2-03/bin,通过./nexus start启动服务。

3bc5d102b94507528c6227ff516e1872.png

  第一次登录时,admin的默认密码存储在/opt/nexus/sonatype-work/nexus3目录下的admin.password中(每次安装都不同)。

51fa6f7d8b05ebe158f532753634c2c8.png

  使用该密码登录系统,之后修改密码。修改后admin.password文件就消失了。

3b0f606c7b5e76b557249fb34c365b50.png

  修改后admin.password文件就消失了。

3fda90ca06f459eb0346c7aa437427f7.png

  这样就可以使用Nexus的Mave私有库了。

c5d60340386f0395b4fd279517367c35.png

Nexus功能简介

   4.1 界面功能简介   Nexus的功能很丰富,在第一个界面的功能时查看。包括查询已经下载的JAR,如点击Search---->Maven可以看到已经下载到私有库的JAR。 819ebfb09796beda7f591bf2f37f4e90.png   点击Browse是已经配置的Maven库。 0ee85906523d25f3ba850381d59ea319.png   这里列出了刚刚安装的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的下载的依赖包: 4835931962fcd28bf3baca00a1bcb207.png   Nexus设置相关的内容非常丰富,说明如下。 e2e919f0e8afa071b3fab5972e2b1297.png   其中最常用,也是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。 f3427c96c68397ee02ba606e6d1a5008.png   在仓库类型中选择maven2(proxy)。 7b726d92fe86c1725e70826af3fa8660.png   按需要配置如下字段,其中Remote storage,要配置阿里云的链接:   http://maven.aliyun.com/nexus/content/groups/public 1328f8dc50262f0eb4ebe6214ccfb73e.png   其他配置使用默认即可。 6d10831546cb46e1ba69ad8323dbc56b.png   最后点击Create repository,完成创建该远程仓库。 65daab34f1b99652124d2e11dff62939.png   通过Browse可以浏览到刚刚添加的仓库。 550a0a9551c749e14fffd4b22c20012a.png   完成创建的仓库可以单独在配置文件中使用,也可以加入到group类型的仓库中统一使用。后者的使用更常见,比如我们把刚刚添加的仓库加入到上面的maven-public中。   在设置中点击该仓库:maven-public。 b34ac4f28a044c176a68fa5e19b41f7e.png   将刚刚创建的仓库加入到该group仓库中。 88b605ef9a49ab86e70bc4e6bf6f6207.png   配置完成后的效果如下。 60b5a457f186e2420c847e20753025f4.png ddd2dc5cb327883b1355071ea3888b2c.png

配置文件说明

  5.1 Maven配置文件

  修改Maven的配置文件,位于Maven根目录的conf文件夹,如F:\softwore\apache-maven-3.6.2\conf。事实上,Maven并不区分是私有库,还是中央库,只要对相关配置进行定义,Maven就按照配置进行依赖包的下载。重要的配置包括:

  1. servers。配置连接远程库的验证方式,对于私有库要配置私有库的用户名和密码,即在Nexus的Security--->User中配置的用户。

3ec840b8c2063454ab9bdf78f5635990.png

  2. mirrors。配置使用的远程仓库,通过mirrorOf可以进行定制的过滤。mirrors是下载依赖的配置。

  3. profile的repositories。配置远程仓库连接,可以对releases、snapshots类型的依赖包进行针对性的配置。profile还有很多其他属性设置,如jdk版本、激活条件等等,可以查看Maven相关的教程进行学习。此例中的配置作用是后续上传JAR的需要,具体见8.4的介绍。

  典型的配置如下。

16fd5bf7346c04241c802748794adc8a.png

  5.2 Maven工程文件pom.xml

  Maven工程的pom.xml文件,对于仓库的配置是继承Maven配置文件的, 所以工程文件在无特殊需求的时候,不需要体现任何远程库、私有库的配置。如下是一个依赖了mysql的示例。

f450efd4317fc9b4a28562859dea4e01.png

f9e98f601814226495e3e4c32f77bca3.png

Maven工程依赖下载

  通过安装Nexus、设置Nexus(可选)、修改Maven配置文件,一个基于Nexus的私有库已经搭建完成,之后就是使用该私有Maven进行开发的工作了。在实际使用Maven私有库时,经常遇到的一些情况,下面分别进行说明。

  6.1 下载中央库的依赖

  最常见的需求是下载中央库,或者设置好的其他的proxy类型仓库的依赖。我们以7.2节的工程为例,该工程依赖mysql,版本是8.0.19。

  首先查看本地仓库和远程仓库(即Nexus的私有仓库,此时对开发者而言就是远程仓库,后续直接称为远程仓库),都没有该依赖包。

df366480f67f0b130d07f2499601f28e.png

  之后我们在工程中进行maven clean,再进行maven compile,可以看到开始在远程仓库中下载依赖包。

2d9d71761691a0621a7910de60d0c37e.png

  之后我们再查看本地仓库和远程仓库。

2a7bdfb94dd69eae81db01ee9e56725a.png

  并且我们可以看到,由于在之前配置阿里云仓库时,将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中的工程中增加依赖。

e6566aa5d5b631ea3dda9fe88f1b0d2f.png

  为了方面管理第三方JAR包,在Nexus中增加一个hosted类型的远程仓库,添加方式与6.2类似,之后将其加入到maven-public中。

d48e8d8c1fb441e2f31d347db9f2a438.png

  之后在仓库列表中点击刚刚添加的第三方依赖管理仓库:maven-3rd-party。

25056f148aaac1251890607cb742a91e.png

  之后点击Upload component。

b1c2eaae0416c16c3585ee13080b3f5d.png

  选择需要上传的JAR包,设置坐标信息。其中Generate a POM file with these coordinates(为这些坐标生成POM文件),必须勾选,否则相当于该远程仓库没有该JAR包的坐标,本地工程的Maven是无法获取到该远程仓库这个JAR的。

542e173e8f4a8b23d17d98b7d61eb9ab.png

  上传完成后,可以在maven-3rd-party仓库中查看该依赖。

7154f300cbf9628185316614396cc495.png

  此时,依赖该JAR包的工程能够正常下载并编译通过。

652a3223b959f8d5220dcba0f276c887.png

  本地仓库中也缓存了该JAR包。

9514b8bf3c40b9a2ae290e3e1a758e93.png

  当然,也可以通过命令行进行上传,首先修改Maven配置文件,增加如下项目。

286743bc8c5385b8ffb7910d747592b7.png

  上述操作的命令为:

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-party

  6.4 项目工程JAR包发布到Nexus

  按模块开发时,JAR包经常会被其他人依赖,可以通过自动发布到Nexus的方式达成该目标。

  项目本身开发的库,特别是一些公共库、底层函数,经常会被其他人引用,将这些JAR放在远程仓库上会带来极大的方便。当然,我们可以使用与8.3一样的方法,上传到远程仓库。但是,如果有该JAR包源码发生变动的时候,还要手工进行上传。实际上,Maven提供了自动发布的机制。

  首先在Maven配置文件中添加如下配置。

ccaec601748060e9fa48b65cd82e834d.png

  之后修改Maven工程的pom.xml文件,增加如下配置。

670714a3a591589a2e64c6992fa55058.png

  当构建版本带有“SNAPSHOT”后缀(必须大写)时,Maven会认为是构建snapshots版本,JAR会被上传到snapshots对应的仓库中。

10ac33f607471fb1e438e3388a2c6f18.png

  之后执行maven deploy命令。

2e6f5567791664eff2bc6f77c80da8ff.png

  会将该JAR包上传到snapshots仓库中,在Nexus可以看到如下信息。

38b5f4fe84577e7b0f45d366ffddb469.png

  如果构建文件配置的版本没有“SNAPSHOT”后缀,则会上传到releases仓库中。

  这里我们可以看到snapshots版本和releases版本的区别。对应实际开发的过程,在使用maven过程中,我们在开发阶段会有很多公共库经常性的处于不稳定状态,随时需要修改并发布,可能一天就要发布一次或多次。而Maven的依赖管理是基于版本管理的,对于发布状态的组件,如果版本号相同,即使我们远程仓库上的组件比本地仓库新,Maven也不会主动下载。如果在开发阶段都是基于正式发布版本(releases)来做依赖管理,那么遇到这个问题,就需要升级组件的版本号,可这样就明显不符合要求和实际情况了。所以通过快照版本(snapshots),问题就迎刃而解了。

  同时对比8.3节,上传第三方依赖包到Nexus和发布项目工程JAR包到Nexus,本质上并没有区别。比如我们将第三方源码编译,也可以直接上传到Nexus,甚至也可以全部上传到maven-snapshots仓库。当然,区分3rd-party,snapshot,releases,更能明确项目的结构层次,更符合实际的情况。

bccf3b3c15be83b26a6ad33e0ddf66aa.png

总结

  本文以Nexus为例,说明了搭建Maven私有库的方法。首先讲解了私有库的原理,之后详细说明使用Nexus搭建Maven私有库的步骤。通过配置文件编写方式说明如何将Maven私有库配置到项目中,最后对私有库有关的经常使用的功能,结合实际例子进行了详细说明。

  私有库的搭建,从职责上是运维的工作;受益者大多情况为开发人员。对于测试人员,一方面掌握更多的知识,技不压身;同时更深入了解Maven的原理和使用知识,极大的提高测试工具、测试框架的的开发效率。

b67ba8b236d3b30c3fd0b9e48e674805.gif

4f12d6eecf4c8088df56718d9c75f7fc.png

推荐阅读

点击阅读☞惊!测试员看不懂测试报告?这样的情况还不少!

点击阅读☞偶然发现的性能监控工具让人惊喜!不打算试试嘛?

点击阅读☞如何对APP进行Monkey测试?让自动化拯救手动测试!

点击阅读☞我是如何实现工资翻倍增长的?

点击阅读☞怎样将测试用例从xmind转换成Excel?给你总结好了!

ff0d86af45bf0a6995eeba68337dd90b.gif

38075157b9d23a6bd56d2decf58af888.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值