目录
- 一、deploy - 推送到远程仓库
 - 1.1 命令语法:
 - 1.2 执行结果:
 - 1.3 可能遇到的问题
 - 问题1:with status code 401
 - 问题2:with status code 405
 - 问题3:Cannot deploy artifact from the local repository
 
- 二、install - 推送到本地仓库
 - 1.1 命令语法:
 - 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 与命令行在同一级目录)
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 包上传到我的本地仓库中,命令如下:
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 页面上是支持直接上传依赖的,如下所示:
 
具体操作可以参考下文中的 第九章:
- 《Maven(二)高级操作(分模块开发、聚合、继承、属性、版本管理、资源配置、多环境开发配置、跳过测试、Nexus远程仓库)》
 
整理完毕,完结撒花~ 🌻



















