4_Maven私服
Maven私服
[toc]
Maven 仓库管理也叫 Maven 私服或者代理仓库。使用 Maven 私服有两个目的:
- 私服是一个介于开发者和远程仓库之间的代理
- 私服可以用来部署公司自己的 jar
可以使用 Nexus 搭建
Nexus 是一个强大的 Maven 仓库管理工具,使用 Nexus 可以方便的管理内部仓库同时简化外部仓库的访问。官网是:https://www.sonatype.com/
下载
下载地址:https://www.sonatype.com/download-oss-sonatype
等待一下或者点击按钮
解压
将下载下来的压缩包,拷贝到一个没有中文的路径下,然后解压。
- nexus-3.67.0-01:该目录中包含了 Nexus 3.x 运行所需要的文件,如启动脚本、依赖 jar 包等。
- sonatype-work:该目录中包含了 Nexus 3.x 生成的配置文件、日志文件等。
启动
使用管理员运行cmd:
- 安装服务:`nexus.exe /install`
- 启动服务:`nexus.exe /start`
- 带控制台的启动服务:`nexus.exe /run`
- 停止服务:`nexus.exe /stop`
- 卸载服务:`nexus.exe /uninstall`
解压之后,打开 cmd 窗口(以管理员身份打开 cmd 窗口),然后定位了 nexus 解压目录,执行 nexus.exe/run
命令启动服务。
这个启动稍微有点慢,大概有 1 两分钟的样子
启动后访问(启动可能会有点慢,多等一会就可以了): 我这里上面这样不行,关掉去服务点击启动
启动成功后,浏览器输入 http://localhost:8081/ 打开管理页面。 打开管理页面后,点击右上角上的登录按钮进行登录。当然,用户也可以点击设置按钮,手动配置其他用户。
初始账号是:admin 初始密码在:E:\nexus\sonatype-work\nexus3\admin.password
中(登录进去会提示让你更改密码的) 进来可能会提示你让你改密码,正常改就可以
如果是自己搭建玩的可以随便,如果是公司一定要禁用匿名使用 我这里使用 Disable anonymous access
然后就正式进入管理页面
在etc目录下有个nexus-default.properties可以配置端口号
仓库类型
名称 | 说明 |
---|---|
proxy | 表示这个仓库是一个远程仓库的代理,最典型的就是代理 Maven 中央仓库 |
hosted | 宿主仓库,公司自己开发的一些 jar 存放在宿主仓库中,以及一些在 Maven 中央仓库上没有的 jar |
group | 仓库组,包含代理仓库和宿主仓库 |
virtual | 虚拟仓库 |
配置
点击左边导航栏中的 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一共给我们创建了7个仓库(不同的nexus版本可能有一点差距),我们只需要关注Format为maven2的仓库即可,也就是一共有4个:
maven-central:该仓库用来代理 Maven 中央仓库,其策略为 Release,只会下载和缓存中央仓库中的发布版本的构件。 maven-releases:策略为 Release 的宿主仓库,用来部署公司或组织内部的发布版本构件。 maven-snapshots:策略为 Snapshot 的宿主仓库,用来部署公司或组织内部的快照版本构件。 maven-public:仓库组,默认聚合了以上三个仓库。
maven-central
我们也可以再新建一个代理仓库,然后代理到阿里云镜像地址。通过阿里云镜像下载依赖要比maven中央仓库快的多。
选择maven2 (proxy)
其他配置默认,名称自定义,代理地址填写https://maven.aliyun.com/repository/public
maven-releases
release仓库需要把这块改一下,设置为Allow redeploy代表允许我们对仓库中的依赖维护升级新版本,如果设置为disable redeploy意味着我们无法将升级版本上传上来。
maven-public
把aliyun-proxy移入并放在maven-central上面
Nexus配置用户角色
nexus预定了两个用户
- admin:最高权限
- 浏览仓库
- 搜索仓库
- 上传构建
- 新建修改仓库
- anonymous:没有默认密码,不可以登录管理平台,拥有的权限有如下:
- 浏览仓库
- 搜索仓库
一般我们不建议maven当中直接去配置admin账户,因为admin账户有新增和删除仓库的权限,我们可以选择新增一个账户,只给这个账号赋予上传依赖和下载依赖的权限即可。 由于nexus是用户角色制,所以新增账户前,首先我们需要新建一个角色。然后让角色只具备上传依赖和下载依赖的权限。然后再给用户赋予该角色权限。
新增角色
Role ID和Role Name自定义即可。
新增权限如下: nx-repository-view---browse nx-repository-view-maven2-maven-public-read nx-repository-view-maven2-maven-snapshots-browse
点击save保存
新增用户指定该角色
deplyment
这时候可以使用新账号登录测试一下,登录后会发现这就是我们要的效果!没有设置的权限
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
Maven 仓库分为两种,Snapshot 快照仓库和 Release 发行仓库。Snapshot 快照仓库用于保存开发过程中的不稳定 SNAPSHOT 版本,Release 发行仓库则用来保存稳定的 RELEASE 版本。 Maven 会根据模块的版本号(pom.xml 文件中的 version 元素)中是否带有 -SNAPSHOT 来判断是 SNAPSHOT 版本还是正式 RELEASE 版本。带有 -SNAPSHOT 是SNAPSHOT(快照)版本,不带 -SNAPSHOT 的就是正式 RELEASE(发布)版本。
使用
上传 jar
上传 jar,配置两个地方:
- Maven 的 conf/settings.xml 文件配置:
<servers>
<!-- 这是配置访问私有仓库的用户名密码 -->
<server>
<!-- id标签可以随便填,只需要在servers中唯一即可,后面很多地方会使用该id -->
<id>releases</id>
<username>deplyment</username>
<password>deplyment</password>
</server>
<server>
<id>snapshots</id>
<username>deplyment</username>
<password>deplyment</password>
</server>
</servers>
在要上传 jar 的项目的 pom.xml 文件中,配置上传路径:
<distributionManagement>
<repository>
<id>releases</id>
<url>http://localhost:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<url>http://localhost:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
配置完成后,点击 deploy 按钮,或者执行 mvn deploy 命令就可以将 jar 上传到私服上。
- distributionManagement:负责将指定的构件部署到 Nexus 指定的仓库中。
- repository:代表上传release版本存储的仓库地址
- snapshotRepository:代表上传snapshot版本存储的仓库地址
- 标签中的 id,就是上面我们配置的server id,maven会通过这个id去server中拿用户名密码去访问私服仓库。
- 标签中的url,就是对应仓库的地址:仓库的url复制即可,注意对应仓库,弄反了是传不上去的
地址来这拷贝
会根据该模块的版本进行自动选择,如果你的版本号带有SNAPSHOT如:
<version>0.0.1-SNAPSHOT</version>
,那么会上传到SNAPSHOT仓库,release也是这个道理,如果版本号不存在这两个单词,如1.0.0,那么会选择release仓库上传。
当然也可以直接运行maven命令:mvn clean deploy -DskipTests
发现maven-snapshots里有文件了 再次打包
下载私服上的 jar
直接在项目中添加依赖
直接在项目中添加依赖,添加完成后,额外增加私服地址即可:
<repositories>
<repository>
<id>local-repository</id>
<url>http://localhost:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
配置本地maven
还是打开setting.xml,然后添加一个如下配置
<profiles>
<profile>
<id>nexus</id>
<!--声明一个或多个远程仓库 -->
<repositories>
<!-- 声明一个 Nexus 私服上的仓库 -->
<repository>
<!--仓库id,这个id就是上面配置的账号密码id -->
<id>self-maven</id>
<!-- 仓库的名称 -->
<name>nexus</name>
<!--仓库的地址 -->
<url>http://localhost:8081/repository/maven-public/</url>
<!-- 是否开启该仓库的 release 版本下载支持 -->
<releases>
<enabled>true</enabled>
</releases>
<!-- 是否开启该仓库的 snapshot 版本下载支持 -->
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<!-- 声明一个或多个远程插件仓库 -->
<pluginRepositories>
<!--声明一个 Nexus 私服上的插件仓库 -->
<pluginRepository>
<!--插件仓库 id -->
<id>self-maven</id>
<!--插件仓库 名称 -->
<name>nexus</name>
<!-- 配置的插件仓库的地址 -->
<url>http://localhost:8081/repository/maven-public/</url>
<!-- 是否开启该插件仓库的 release 版本下载支持 -->
<releases>
<enabled>true</enabled>
</releases>
<!-- 是否开启该插件仓库的 snapshot 版本下载支持 -->
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
<!-- 默认该profile生效 -->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
</profiles>
以上配置中使用了一个 id 为 nexus 的 profile,这个 profile 中包含了与仓库相关的配置,同时配置中activeByDefault为true。当本机有 Maven 项目构建时,profile 中的仓库配置就会应用到项目中。配置当中的url就配置我们的仓库组地址即可:
Nexus 私服通常会与镜像(mirror)结合使用
Nexus 私服通常会与镜像(mirror)结合使用,使 Nexus 成为所有远程仓库的私服,这样不仅可以从 Nexus 中获取所有所需构件,还能将配置集中到 Nexus 私服中,简化 Maven 本身的配置。
我们可以创建一个匹配任何仓库的镜像,镜像的地址为 Nexus 中仓库的地址,这样 Maven 对于任何构件的下载请求都会被拦截跳转到 Nexus 私服中,在maven的setting.xml当中配置,其具体配置如下。
<mirrors>
<mirror>
<id>self-maven</id>
<name>nexus name</name>
<mirrorOf>*</mirrorOf>
<url>http://localhost:8081/repository/maven-public/</url>
</mirror>
</mirrors>
之前阿里的镜像可以注释了,添加的镜像标签解释:
- id:之前server的id,访问仓库组也要拿用户名密码
- mirrorOf:代表所有的依赖都从私服找
- url:就是仓库组的,还是去仓库组右边copy即可
这样的话项目就完全依赖于nexus仓库了,假如一旦nexus挂了,整个项目都没办法下载包了,这时候可以将镜像替换为阿里云,这样一来除了公司内部包无法下载,最起码中央仓库的包还是可以下载的。
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
Nexus构件搜索
手动上传构件
有些 Jar 文件(如 Oracle 的 JDBC 驱动)由于许可证等原因,无法存放在公开仓库中。此外,还有一些小型的开源项目,它们没有将自己的构件分发到公共仓库中,也没有维护自己的仓库,因此这些构件是无法从公共仓库中获得的。若 Maven 项目中需要这类构件,我们就需要将构件下载到本地,然后手动上传到 Nexus 私服。
- 准备一个项目,版本号不要是SNAPSHOT版本的
- mvn clean install,进行打包
- 在 Nexus 界面的upoad上传,默认是只允许上传releases仓库。
生成的就是一个带有该项目坐标的pom。
如果该jar包还有其他依赖,那么需要手动上传pom.xml文件,就不能点击上面的generate生成了,通过点击add another asset 增加,操作如下
upload以后,会出现view it now
再来Browse看下
手动上传jar需要注意:
- 首先,打包要打成不可执行jar包;
- 其次,jar如果有其他依赖,一定要单独上传pom.xml文件,否则关联依赖无法拉取
关于nexus代理仓库状态
- online-remote available:表示该被代理仓库可用
- online-ready to connect:并不是代理仓库用不了。而是你根本还没有一个依赖去访问这个被代理仓库,nexus也不知道这个被代理仓库能不能用,所以它只能展示为待连接状态。
新建的代理仓库都是 online-ready to connect状态。
代理仓库还有一个如下配置:
- Blocked:假如选中相相当于禁用该代理仓库。
- Auto blocking:该配置:表示代理仓库会根据每次请求被代理仓库的响应来决定是否暂停请求这个被代理仓库,请求无响应就会block。