国家住房和城乡建设厅网站,企业网站制作 厦门,湖州seo排名,温州发生的重大新闻目录 一、什么是Maven私服#xff1f;二、Maven 私服优势三、Maven 私服搭建四、Sonatype Nexus介绍五、Nexus仓库属性和分类六、Nexus仓库配置以及创建仓库七、Nexus配置用户角色八、Maven SNAPSHOT(快照)九、项目当中配置Nexus上传依赖十、项目当中配置Nexus下载依赖十一、测… 目录 一、什么是Maven私服二、Maven 私服优势三、Maven 私服搭建四、Sonatype Nexus介绍五、Nexus仓库属性和分类六、Nexus仓库配置以及创建仓库七、Nexus配置用户角色八、Maven SNAPSHOT(快照)九、项目当中配置Nexus上传依赖十、项目当中配置Nexus下载依赖十一、测试SNAPSHOT版本十二、Nexus构件搜索十三、手动上传构件十四、关于nexus代理仓库状态 技术前提熟练的掌握Maven基础知识
一、什么是Maven私服
Maven 私服是一种特殊的Maven远程仓库它是架设在局域网内的仓库服务用来代理位于外部的远程仓库中央仓库、其他远程公共仓库。 当然也并不是说私服只能建立在局域网也有很多公司会直接把私服部署到公网具体还是得看公司业务的性质是否是保密的等等因为局域网的话只能在公司用部署到公网的话员工在家里也可以办公使用。 建立了 Maven 私服后当局域网内的用户需要某个构件时会按照如下顺序进行请求和下载。
请求本地仓库若本地仓库不存在所需构件则跳转到第 2 步请求 Maven 私服将所需构件下载到本地仓库若私服中不存在所需构件则跳转到第 3 步。请求外部的远程仓库将所需构件下载并缓存到 Maven 私服若外部远程仓库不存在所需构件则 Maven 直接报错。
此外一些无法从外部仓库下载到的构件也能从本地上传到私服供其他人使用。
下图中展示了 Maven 私服的用途。 二、Maven 私服优势
Maven 私服具有以下 5 点优势
节省外网带宽大量对于外部远程仓库的重复请求会消耗很大量的带宽利用 Maven私服代理外部仓库后能够消除对外部仓库的大量重复请求降低外网带宽压力。下载速度更快Maven 私服位于局域网内从私服下载构建更快更稳定。便于部署第三方构件有些构件是无法从任何一个远程仓库中获得的例如某公司或组织内部的私有构件、Oracle 的 JDBC 驱动等建立私服之后就可以将这些构件部署到私服中供内部 Maven 项目使用。提高项目的稳定性增强对项目的控制如果不建立私服那么 Maven 项目的构件就高度依赖外部的远程仓库若外部网络不稳定则项目的构建过程也会变得不稳定。建立私服后即使外部网络状况不佳甚至中断只要私服中已经缓存了所需的构件Maven 也能够正常运行。此外一些私服软件如 Nexus还提供了很多额外控制功能例如权限管理、RELEASE/SNAPSHOT 版本控制等可以对仓库进行一些更加高级的控制。降低中央仓库得负荷压力由于私服会缓存中央仓库得构件避免了很多对中央仓库的重复下载降低了中央仓库的负荷。
三、Maven 私服搭建
能够帮助我们建立 Maven 私服的软件被称为 Maven 仓库管理器Repository Manager主要有以下 3 种
Apache ArchivaJFrog ArtifactorySonatype Nexus
其中Sonatype Nexus 是当前最流行、使用最广泛的 Maven 仓库管理器。本篇文章也是重点讲解Sonatype Nexus。
关于nexus安装https://blog.csdn.net/weixin_43888891/article/details/130675829
本篇直接基于nexus3最新版进行讲解
四、Sonatype Nexus介绍
Nexus 的全称是 Nexus Repository ManagerNexus 仓库管理器是 Sonatype 公司的一个产品。Nexus 是一个强大的仓库管理器极大地简化了内部仓库的维护和外部仓库的访问。Nexus 分为开源版和专业版其中开源版足以满足大部分 Maven 用户的需求。
Nexus 开源版具有以下优点
占用内存小28 M 左右具有基于 ExtJs 得操作界面用户体验较好使用基于 Restlet 的完全 REST API支持代理仓库、宿主仓库和仓库组基于文件系统不需要依赖数据库支持仓库管理支持构件搜索支持在界面上上传构件
五、Nexus仓库属性和分类
这里我直接用的nexus最新版3.54.1版本。 点击左边导航栏中的 Repositories仓库可以看到 Nexus 自带的几个内置仓库如下图所示。 在仓库列表中每个仓库都具有一系列属性
Type仓库的类型这里一共有三种 proxy用来代理远程公共仓库如 Maven 中央仓库、JBoss 远程仓库。hosted又称 Nexus 本地仓库该仓库通常用来部署本地项目所产生的构件。 hosted 宿主仓库又分为releases 和shapshots分别表示依赖的版本的发行版、快照版。快照版依赖不能上传到发行版仓库反之亦然。nexus做了限制。group仓库组用来聚合代理仓库和宿主仓库为这些仓库提供统一的服务地址以便 Maven 可以更加方便地获得这些仓库中的构件。 Format仓库的格式有两种maven2、nuget。我们是搞java的所以新建仓库一般都是选择的maven2格式。Status仓库的状态只有在线状态才能被访问。URL仓库的路径。
为了更加直观的理解仓库组、代理仓库和宿主仓库的概念我们通过下图展示它们的用途和区别。 由上图可知
Maven 可以直接从宿主仓库中下载构件。Maven 也可以从代理仓库中下载构件代理仓库会从远程仓库下载并缓存构件。Maven 还可以从仓库组中下载构件仓库组会从其包含的宿主仓库和代理仓库中获取构件。 我们使用nexus私服配置文件中配置的也就是仓库组地址因为仓库组可以把代理仓库、宿主仓库聚合这样就完美实现从私服下载依赖私服仓库找不到还能去代理仓库那找。找到了之后缓存到私服这样下次就能从私服直接获取了。 六、Nexus仓库配置以及创建仓库
刚安装好的nexus一共给我们创建了7个仓库不同的nexus版本可能有一点差距我们只需要关注Format为maven2的仓库即可也就是一共有4个
maven-central该仓库用来代理 Maven 中央仓库其策略为 Release只会下载和缓存中央仓库中的发布版本的构件。maven-releases策略为 Release 的宿主仓库用来部署公司或组织内部的发布版本构件。maven-snapshots策略为 Snapshot 的宿主仓库用来部署公司或组织内部的快照版本构件。maven-public仓库组默认聚合了以上三个仓库。
下面进行一个一个讲解
1maven-central 我们也可以再新建一个代理仓库然后代理到阿里云镜像地址。通过阿里云镜像下载依赖要比maven中央仓库快的多。 选择maven2 proxy 其他配置默认即可。然后代理地址写 https://maven.aliyun.com/repository/public 2maven-public
maven-public仓库组就是将这几个仓库汇集到一块然后项目使用nexus不需要配置其他仓库的地址只需要配置仓库组的地址即可。 3maven-releases
release仓库需要把这块改一下设置为Allow redeploy代表允许我们对仓库中的依赖维护升级新版本如果设置为disable redeploy意味着我们无法将升级版本上传上来。 七、Nexus配置用户角色
nexus预定了两个用户
admin最高权限 浏览仓库搜索仓库上传构建新建修改仓库 anonymous没有默认密码不可以登录管理平台拥有的权限有如下 浏览仓库搜索仓库 在低的版本当中可能会有一个deployment角色不知道为什么新的版本当中这个角色给取消了。 一般我们不建议maven当中直接去配置admin账户因为admin账户有新增和删除仓库的权限我们可以选择新增一个账户只给这个账号赋予上传依赖和下载依赖的权限即可由于nexus是用户角色制所以新增账户前首先我们需要新建一个角色。然后让角色只具备上传依赖和下载依赖的权限。然后再给用户赋予该角色权限。
1新增角色 Role ID和Role Name自定义即可。 具体的需要新增的权限如下 别忘了右下角保存 2新增用户并指定该角色 这时候可以使用新账号登录测试一下登录后会发现他没有设置的权限这就是我们要的效果 八、Maven SNAPSHOT(快照)
接下来我们可能会频繁接触SNAPSHOT版本在这里我们先熟悉一下这个版本号。
在我们是实际开发的项目当中很少会定义beat 、alpha 这些里程碑版本因为这些一般都是开源框架才会定义的他代表了一个特殊的寓意例如beat就是测试版本而我们经常在开发中会定义SNAPSHOT版本。SNAPSHOT不同于里程碑版本里程碑版本他也就是一个普通的版本名称说白了只是用这些英文来代表这个版本的含义而SNAPSHOT对于私服来说是有特殊功能的。 使用场景 大型的应用软件通常由多个功能模块组成这些模块有时候分别于不同的团队负责开发。假设有两个团队他们分别负责项目中的 member-service会员服务 和 user-service用户服务 两个模块且 member-service 需要依赖 user-service 项目。
基于以上假设若 user-service 团队正在进行快节奏的 bug 修复及功能增强会在短时间内高频率地更新代码以及发布版本。就会出现以下情况
user-service 团队每次发布新版本更新代码时都应该通知member-service团队。member-service 团队则需要定期更新其 pom.xml 以获得最新的版本。
这样势必会影响开发效率甚至会影响项目的验收及投产。要解决这个问题其实很简单那就是使用 SNAPSHOT快照版本。
版本介绍 SNAPSHOT快照是一种特殊的版本它表示当前开发进度的副本。与常规版本不同快照版本的构件在发布时Maven 会自动为它打上一个时间戳有了这个时间戳后当依赖该构件的项目进行构建时Maven 就能从仓库中找到最新的 SNAPSHOT 版本文件。
默认情况下对于快照本本的构件Maven 会每天从仓库中获取一次更新用户也可以在任何 Maven 命令中使用 -U 参数强制 Maven 检查更新。命令如下mvn clean package -U
SNAPSHOT 版本 VS RELEASE 版本 Maven 仓库分为两种Snapshot 快照仓库和 Release 发行仓库。Snapshot 快照仓库用于保存开发过程中的不稳定 SNAPSHOT 版本Release 发行仓库则用来保存稳定的 RELEASE 版本。Maven 会根据模块的版本号pom.xml 文件中的 version 元素中是否带有 -SNAPSHOT 来判断是 SNAPSHOT 版本还是正式 RELEASE 版本。带有 -SNAPSHOT 是SNAPSHOT快照版本不带 -SNAPSHOT 的就是正式 RELEASE发布版本。 九、项目当中配置Nexus上传依赖
首先找到本地maven的setting.xml在maven安装目录的conf目录下打开后找到servers标签。加入以下内容
servers!-- 这是配置访问私有仓库的用户名密码 --server!-- id标签可以随便填只需要在servers中唯一即可后面很多地方会使用该id --idself-maven/idusernamedeplyment/usernamepassworddeplyment123/password/server
/servers maven配置好了接下来去maven项目中设置
在你想上传的模块的pom文件中写入
distributionManagementrepository!--注意这个id一定要填写我们maven的setting.xml当中配置的id--idself-maven/idurlhttp://ip:port/repository/maven-releases//url/repositorysnapshotRepository!--注意这个id一定要填写我们maven的setting.xml当中配置的id--idself-maven/idurlhttp://ip:port/repository/maven-snapshots//url/snapshotRepository
/distributionManagementdistributionManagement负责将指定的构件部署到 Nexus 指定的仓库中。repository代表上传release版本存储的仓库地址snapshotRepository代表上传snapshot版本存储的仓库地址标签中的 id就是上面我们配置的server idmaven会通过这个id去server中拿用户名密码去访问私服仓库。标签中的url就是对应仓库的地址仓库的url复制即可注意对应仓库弄反了是传不上去的 会根据该模块的版本进行自动选择如果你的版本号带有SNAPSHOT如version0.0.1-SNAPSHOT/version那么会上传到SNAPSHOT仓库release也是这个道理如果版本号不存在这两个单词如1.0.0那么会选择release仓库上传。 1接下来我们进行测试首先第一步准备一个不是web工程的项目如下 2然后进行以下步骤 当然也可以直接运行maven命令mvn clean deploy -DskipTests
3deploy执行完不报错的话就上传成功了。 4由于我的项目设置的是1.0-SNAPSHOT也就是SNAPSHOT版本所以他会自动上传到maven-snapshots仓库当中如下 十、项目当中配置Nexus下载依赖
接下来配置本地maven。还是打开setting.xml然后添加一个如下配置
profilesprofileidnexus/id!--声明一个或多个远程仓库 --repositories!-- 声明一个 Nexus 私服上的仓库 --repository!--仓库id,这个id就是上面配置的账号密码id --idself-maven/id!-- 仓库的名称 --namenexus/name!--仓库的地址 --urlhttp://localhost:8081/repository/maven-public//url!-- 是否开启该仓库的 release 版本下载支持 --releasesenabledtrue/enabled/releases!-- 是否开启该仓库的 snapshot 版本下载支持 --snapshotsenabledtrue/enabled/snapshots/repository/repositories!-- 声明一个或多个远程插件仓库 --pluginRepositories!--声明一个 Nexus 私服上的插件仓库 --pluginRepository!--插件仓库 id --idself-maven/id!--插件仓库 名称 --namenexus/name!-- 配置的插件仓库的地址 --urlhttp://localhost:8081/repository/maven-public//url!-- 是否开启该插件仓库的 release 版本下载支持 --releasesenabledtrue/enabled/releases!-- 是否开启该插件仓库的 snapshot 版本下载支持 --snapshotsenabledtrue/enabled/snapshots/pluginRepository/pluginRepositoriespropertiesmaven.compiler.source1.8/maven.compiler.sourcemaven.compiler.target1.8/maven.compiler.targetmaven.compiler.compilerVersion1.8/maven.compiler.compilerVersion/properties!-- 默认该profile生效 --activationactiveByDefaulttrue/activeByDefault/activation/profile
/profiles 以上配置中使用了一个 id 为 nexus 的 profile这个 profile 中包含了与仓库相关的配置同时配置中activeByDefault为true。当本机有 Maven 项目构建时profile 中的仓库配置就会应用到项目中。配置当中的url就配置我们的仓库组地址即可 1接下来进行测试下载依赖首先让一个web工程引用该项目坐标 2紧接着我们需要找到本地maven仓库当中的introduce包给删除掉 根据坐标就可以在本地仓库找到进行删除删除前要保证引用该依赖的工程不是启动状态不然删除不了 3再次测试web工程看看能否获取到依赖需要刷新该工程让他再次去获取依赖。 4刷新过后查看仓库已经存在了该依赖jar我们并没有手动去install该项目那也就意味着他是通过私服进行下载的。 5假如缺少依赖除了上面通过idea当中的刷新也可以选择执行命令来下载依赖mvn clean install的时候也会自动下载仓库当中缺少的依赖通过下载依赖的信息我们可以知道他从哪个仓库进行下载依赖的 Nexus 私服通常会与镜像mirror结合使用使 Nexus 成为所有远程仓库的私服这样不仅可以从 Nexus 中获取所有所需构件还能将配置集中到 Nexus 私服中简化 Maven 本身的配置。
我们可以创建一个匹配任何仓库的镜像镜像的地址为 Nexus 中仓库的地址这样 Maven 对于任何构件的下载请求都会被拦截跳转到 Nexus 私服中在maven的setting.xml当中配置其具体配置如下。
mirrorsmirroridself-maven/idnamenexus name/namemirrorOf*/mirrorOfurlhttp://localhost:8081/repository/maven-public//url/mirror
/mirrors之前阿里的镜像可以注释了添加的镜像标签解释
id之前server的id访问仓库组也要拿用户名密码mirrorOf*代表所有的依赖都从私服找url就是仓库组的还是去仓库组右边copy即可
这样的话项目就完全依赖于nexus仓库了假如一旦nexus挂了整个项目都没办法下载包了这时候可以将镜像替换为阿里云这样一来除了公司内部包无法下载最起码中央仓库的包还是可以下载的。
mirroridalimaven/idnamealiyun maven/nameurlhttp://maven.aliyun.com/nexus/content/groups/public//urlmirrorOfcentral/mirrorOf
/mirror十一、测试SNAPSHOT版本
我们基于上面提到的introduce工程和demo工程再顺便测一下SNAPSHOT版本。一般SNAPSHOT版本是为了解决多个人同时开发所产生的问题而我没有多台电脑所以模拟起来也比较费劲。
1我们需要手动保留一份仓库当中修改前的代码。 2修改一下introduce工程然后将该工程重新deploy到仓库。 3删除本地仓库的introduce工程将刚刚备份的introduce1改为introduce。这时候introduce1的工程代码当中那个输出的还是1111111。
4看看demo工程通过mvn clean install -DskipTests -U-U是强制更新是否会更新
5成功更新了
十二、Nexus构件搜索 十三、手动上传构件
有些 Jar 文件如 Oracle 的 JDBC 驱动由于许可证等原因无法存放在公开仓库中。此外还有一些小型的开源项目它们没有将自己的构件分发到公共仓库中也没有维护自己的仓库因此这些构件是无法从公共仓库中获得的。若 Maven 项目中需要这类构件我们就需要将构件下载到本地然后手动上传到 Nexus 私服。
1准备一个项目版本号不要是SNAPSHOT版本的 2mvn clean install进行打包 3在 Nexus 界面的upoad上传默认是只允许上传releases仓库。 生成的就是一个带有该项目坐标的pom。 如果该jar包还有其他依赖那么需要手动上传pom.xml文件就不能点击上面的generate生成了通过点击add another asset 增加操作如下 手动上传jar需要注意
首先打包要打成不可执行jar包其次jar如果有其他依赖一定要单独上传pom.xml文件否则关联依赖无法拉取
十四、关于nexus代理仓库状态 online-remote available表示该被代理仓库可用online-ready to connect并不是代理仓库用不了。而是你根本还没有一个依赖去访问这个被代理仓库nexus也不知道这个被代理仓库能不能用所以它只能展示为待连接状态。
新建的代理仓库都是 online-ready to connect状态。
代理仓库还有一个如下配置 Blocked假如选中相相当于禁用该代理仓库。Auto blocking该配置表示代理仓库会根据每次请求被代理仓库的响应来决定是否暂停请求这个被代理仓库请求无响应就会block。