使用Nexus搭建Maven私有库

发表于:2020-7-24 08:18

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:王东    来源: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.1Maven配置文件
  修改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.2Maven工程文件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仓库中查看该依赖。



版权声明:本文出自《51测试天地》第五十八期。51Testing软件测试网及相关内容提供者拥有51testing.com内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号