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

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

整理完毕,完结撒花~ 🌻

相关推荐
工一木子5 分钟前
【Leecode】Leecode刷题之路第42天之接雨水
java·算法·leetcode
Yue1one13 分钟前
I - O (输入-输出) 字节流 字符流 缓冲流
java
w_t_y_y15 分钟前
SQL拦截(二)InnerInterceptor
java
Aliano21718 分钟前
Java的jackson库
java·开发语言
昙鱼41 分钟前
Maven的了解与使用
java·maven
北纬39°的风1 小时前
从0开始搭建一个生产级SpringBoot2.0.X项目(十)SpringBoot 集成RabbitMQ
java·spring boot·redis
forestqq1 小时前
设置JAVA以适配华为2288HV2服务器的KVM控制台
java·运维·服务器
LUwantAC1 小时前
Java学习路线:Maven(一)认识Maven
java·学习·maven
勤匠1 小时前
使用 Stream 处理集合数据【Java 1.8 新特性】
java
OKkankan2 小时前
单链表的实现(数据结构)
java·c语言·数据结构·c++