目录
-
- [一、deploy - 推送到远程仓库](#一、deploy - 推送到远程仓库)
-
- [1.1 命令语法:](#1.1 命令语法:)
- [1.2 执行结果:](#1.2 执行结果:)
- [1.3 可能遇到的问题](#1.3 可能遇到的问题)
-
- [问题1:with status code 401](#问题1:with status code 401)
- [问题2:with status code 405](#问题2:with status code 405)
- [问题3:Cannot deploy artifact from the local repository](#问题3:Cannot deploy artifact from the local repository)
- [二、install - 推送到本地仓库](#二、install - 推送到本地仓库)
-
- [1.1 命令语法:](#1.1 命令语法:)
- [1.2 执行结果:](#1.2 执行结果:)
- 三、补充:页面操作
背景:
我们在使用 Maven 仓库管理 Java 依赖的时候,可能会使用到自定义的 sdk工具包,如果我们想共享这个 sdk 就需要将他上传到公司的 Maven 远程仓库中,这样大家就可以自动拉取了。
那么怎么将本地的 jar 包推送到远程仓库呢?其实非常简单,我们来看下。
一、deploy - 推送到远程仓库
1.1 命令语法:
mvn deploy:deploy-file -Dfile=文件路径 -DgroupId=所属组ID -DartifactId=项目ID -Dversion=版本号 -Dpackaging=打包形式 -Durl=上传仓库路径 -DrepositoryId=仓库名称
示例:这里我将一个 kettle 的 jar 包上传到我刚创建好的 my-release
仓库中,命令如下:
(kettle-core-7.1.0.0-12.jar 与命令行在同一级目录)
shell
mvn deploy:deploy-file \
-Dfile=kettle-core-7.1.0.0-12.jar \
-DgroupId=pentaho-kettle \
-DartifactId=kettle-core \
-Dversion=7.1.0.0-12 \
-Dpackaging=jar \
-Durl=http://localhost:8081/repository/my-release \
-DrepositoryId=my-release
1.2 执行结果:
1.3 可能遇到的问题
问题1:with status code 401
- 出现报错:with status code 401。详细报错如下所示:
原因分析:
401
是因为没有权限报错,这里的权限是根据-DrepositoryId=仓库名称
配置中的 仓库名称 决定的。执行mvn deploy
的时候,会根据 仓库名称 去settings.xml
文件中寻找仓库对应的账号密码,如下所示:
解决方式:
- 确认
-DrepositoryId=仓库名称
是否正确?当前账号是否拥有该仓库的权限?我这里是由于仓库名称写成public
导致的,因为<mirror>
中没有 public 对应的配置,所以报错了,将仓库名称修改为对应的acgkaka
则恢复正常。
问题2:with status code 405
- 出现报错:with status code 405。详细报错如下所示:
原因分析:
405
是-Durl=
和-DrepositoryId=
中的仓库名称不一致导致的,例如:
-Durl=http://nexus.acgkaka.cn/repository/public/
-DrepositoryId=acgkaka
其中-Durl
指定的仓库为public
,而-DrepositoryId
指定的仓库却为acgkaka
。
解决方式:
- 将
-Durl=
和-DrepositoryId=
中的仓库名称修改一致即可。
问题3:Cannot deploy artifact from the local repository
- 出现报错:Cannot deploy artifact from the local repository。详细报错如下所示:
原因分析:
- 其实提示信息很明显了,不能从本地仓库直接
deploy
到远程仓库!
解决方式:
- 将
jar
包从本地仓库复制到任意其他目录,再进行deploy
操作就可以成功了。
补充:Maven为什么不允许直接从本地仓库deploy到远程仓库?
主要在于 设计 和 安全性 的考虑,有以下三个原因:
1. 安全性防止意外覆盖:直接从本地仓库部署可能导致意外覆盖远程仓库中的现有工件,这可能会破坏依赖关系和构建过程。
确保一致性:通过构建过程生成的工件是经过验证和测试的,直接从本地仓库部署无法保证这些工件的一致性和可靠性。
2. 构建过程确保可重复性:Maven 强调构建过程的可重复性。每次构建都应该从源代码开始,生成新的工件,而不是从本地仓库中直接部署。
确保完整性:构建过程中可以执行各种检查和测试,确保生成的工件是完整和正确的。
3. 最佳实践标准化流程:Maven 的最佳实践是通过 mvn deploy 命令从
源代码
构建并部署工件,而不是从本地仓库中直接部署。版本控制:通过构建过程生成的工件通常会带有版本号,这有助于版本控制和依赖管理。
二、install - 推送到本地仓库
1.1 命令语法:
mvn install:install-file -Dfile=文件路径 -DgroupId=所属组ID -DartifactId=项目名称 -Dversion=版本号 -Dpackaging=打包方式
示例:这里我将一个 kettle 的 jar 包上传到我的本地仓库中,命令如下:
shell
mvn install:install-file \
-Dfile=kettle-core-7.1.0.0-12.jar \
-DgroupId=pentaho-kettle \
-DartifactId=kettle-core \
-Dversion=7.1.0.0-12 \
-Dpackaging=jar
1.2 执行结果:
三、补充:页面操作
其实,除了命令操作之外,Nexus 页面上是支持直接上传依赖的,如下所示:
具体操作可以参考下文中的 第九章:
整理完毕,完结撒花~ 🌻