Maven(六)mvn 命令将 jar 包推送到 远程/本地仓库

目录

    • [一、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 页面上是支持直接上传依赖的,如下所示:

具体操作可以参考下文中的 第九章

整理完毕,完结撒花~ 🌻

相关推荐
书埋不住我8 分钟前
java第三章
java·开发语言·servlet
boy快快长大10 分钟前
将大模型生成数据存入Excel,并用增量的方式存入Excel
java·数据库·excel
孟秋与你13 分钟前
【spring】spring单例模式与锁对象作用域的分析
java·spring·单例模式
菜菜-plus17 分钟前
java 设计模式 模板方法模式
java·设计模式·模板方法模式
萨达大18 分钟前
23种设计模式-模板方法(Template Method)设计模式
java·c++·设计模式·软考·模板方法模式·软件设计师·行为型设计模式
tian-ming19 分钟前
(十八)JavaWeb后端开发案例——会话/yml/过滤器/拦截器
java·开发语言·前端
不能只会打代码22 分钟前
大学课程项目中的记忆深刻 Bug —— 一次意外的数组越界
java·github·intellij-idea·话题博客
快意咖啡~29 分钟前
java.nio.charset.MalformedInputException: Input length = 1
java·开发语言·nio
IT枫斗者1 小时前
如何解决Java EasyExcel 导出报内存溢出
java·服务器·开发语言·网络·分布式·物联网
爱编程的小生1 小时前
Easyexcel(4-模板文件)
java·excel