一个实用的 Maven localRepository 工具

目录

  • 1 现状
  • 2 当前解决
  • 3 更好的解决
    • 3.1 下载 Maven localRepository 工具包
    • 3.2 上传本地 localRepository 包
    • 3.3 清理 localRepository 中指定后缀的文件

1 现状

在使用 Maven 时,我们可能会经常与本地仓库和私服仓库打交道。

例如对于本地仓库,因为某些文件位拉取到,会在本地仓库的项目目录下产生 .lastUpdated 后缀的文件,有时编译项目时为了更快的重新再次拉取正确的包,还不得不手动清除这些文件。

而对于私服,如果是公司自己的私服,不巧的是公司的 Maven 私服(例如 Nexus)又无法访问外网,在公司内网使用公司私服编译项目时,我们期望上传上自己的依赖包(此时往往是很多的文件),就不得不手动一个一个上传,如果动手能力比较强的,可以根据对应环境编写一个小脚本执行。

2 当前解决

如果是在 Linux 服务,可以通过如下的 Shell 命令清除本地仓库下所有的 .lastUpdated 后缀的文件目录,但如果是 Windows 系统或者其他不支持 Shell 的系统,就不得不查找对应系统的查找和清除文件夹的命令了。

find ~/.m2/repository/ -regex ".*\.lastUpdated" | xargs dirname | xargs rm -rf

对于向自己私服发布包的情况,一般有两种方式,第一种是通过Maven 私服的管理页面提供的功能进行上传,第二种是通过 mvn deploy 命令上传。

对于本地系统安装了 maven 的,可以使用 Maven 命令上传,命令如下:

mvn -s /Users/yoreyuan/code/yore/settings.xml deploy:deploy-file \
-Dfile=/Users/yoreyuan/.m2/xxx/1.0.0/xxx-1.0.0.jar \
-DpomFile=/Users/yoreyuan/.m2/xxx/1.0.0/xxx-1.0.0.pom \
-Durl=http://nexus.yore.cn/repository/maven-releases \
-DrepositoryId=yore_nexus -X -Dpackaging=jar

如果顺利的话,非常清爽的成功了,但紧接着可能会遇到如下的问题:
【问题 1】如果包非常多,上面的命令一个一个执行简直是噩梦。对于会 Shell或 Python 的,则可能想到编写一个脚本。但如果不巧的是使用的是 Windows 系统的 Java 开发者,其开发环境没有 Shell 和 Python 如何上传呢?最终可能在公司找了一个Linux服务器,配上环境,把自己的本地的Maven localRepository 打包上传到公司服务器上,然后又编写脚本,执行脚本,循环上传这些包,最终费了好大劲终于上传上了,短暂的开心后,突然却又遇到了下面的问题。

【问题 2】使用公司的私服来编译自己项目时,竟然报缺包。经过排查,发现上面的命令仅仅上传了 jar 包,例如 xxx-tests.jarxxx-sources.jarxxx-test-sources.jarxxx-linux-x86_64.exe 等都没有上传,对脚本熟悉的,可能马上花一些时间脚本就改好了,对于脚本不太熟悉的 java 开发者,可能就在一次一次报错中找到缺失的包,通过 Nexus 页面上传了,终于可以编译过了。自己非常非常的开心,于是把自己历尽千辛万苦实践可行的方法分享给公司其他小伙伴

Nexus Upload Web UI

【问题 3】可运行了一段时间,在某天晚上流水线出包的时候突然自己的项目编译报错了,竟然提示有个包神奇的又找不到了。其实最苦恼还有,包编译出来了,运行却失败了,一通排查,竟发现依赖的某个包的版本使用的却是另外一个版本的包。望着一串串流水线异常日志,此时终于又陷入了沉思。

经过一段时间的排查,终于发现不知道是哪个大聪明(也许是自己)从新上传了某个依赖,在上传某个依赖的时候,没有上传项目的 pom 文件,而是直接勾选了 Nexus Upload 页面的 Generate a POM file with these coordinates,导致私服上项目中很重要的依赖的 pom 中依赖信息缺失。此时如果在没有显示引用依赖的情况下,可能会从其他依赖集成过来某个包,如果包存在就顺利编译成功了,但可能运行的时候发现类缺失、方法缺失等等异常,而如果包不存在则直接在流水线编译的时候就异常了。
Generate a POM file with these coordinates
所以面对这种情况,排查私服上 pom 文件,如果有缺失的,手动删除,单独上传完整的 pom 文件,如下图,jar 上传后(千万不要勾选 Generate a POM file with these coordinates),然后再上传一次 pom 文件(此时 GAV 信息是灰色的,直接上传即可)。
upload pom file

3 更好的解决

一路走来,坑坑洼洼,磕磕绊绊,细节那么多,怎么保证身边其他同事不会一不小心再犯同样的错呢?有没有更好的解决方案呢?

答案肯定是有滴,下面来介绍一个实用的工具 tools-maven-localRepository,这个项目是使用 go 语言编写的一个 Maven localRepository 工具。支持的操作系统有 Linux、Windows、Mac OS,可以直接指定本地 localRepository 路径即可将此路径下的所有包上传到 Maven 私服上,也支持清理 localRepository 中指定后缀的文件。

环境要求,系统中需要安装 JDK 和 Maven(对于 Java 开发,开发环境中一般都有,如果没有需要先安装配置下)

3.1 下载 Maven localRepository 工具包

使用也非常简单,访问 tools-maven-localRepository/releases/tag/v1.0.0
tools-maven-localRepository/releases
下载编译好的工具包 tools_maven_localRepository-bin.zip,解压,解压后目录如下

tools_maven_localRepository
├── config.yaml.template    # 应用的配置文件模板
├── darwin-amd64    # Mac OS
│   └── tools_localRepo
├── linux-amd64     # linux OS
│   └── tools_localRepo
├── readme.md
├── settings.xml.template       # Maven settings.xml 配置文件模板
└── windows-amd64   # Windows OS
    └── tools_localRepo

拷贝 settings.xml.template 为 settings.xml,简单配置如下信息(主要是 servers 中的私服账号信息):

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 http://maven.apache.org/xsd/settings-1.2.0.xsd">
  <!--localRepository>/home/yore/.m2/repository</localRepository-->
  <pluginGroups></pluginGroups>
  <proxies></proxies>
  <servers>
    <server>
      <id>yore_nexus</id>
      <username>yore</username>
      <password>123456</password>
    </server>
  </servers>
  <mirrors>
    <mirror>
      <id>yore_nexus</id>
      <mirrorOf>*</mirrorOf>
      <url>http://nexus.yore.cn/repository/maven-public</url>
    </mirror>
  </mirrors>
  <profiles>
    <profile>
      <id>yore_nexus</id>
      <repositories>
        <repository>
          <id>yore_nexus</id>
          <name>yore nexus</name>
          <url>http://nexus.yore.cn/repository/maven-public</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>true</enabled></snapshots>
        </repository>
      </repositories>
    </profile>
  </profiles>
  <activeProfiles>
    <activeProfile>yore_nexus</activeProfile>
  </activeProfiles>
</settings>

3.2 上传本地 localRepository 包

拷贝 config.yaml.template 为 config.yaml,简单配置如下信息:

# 是否输出项目的 debug 信息
verbose: false
logLevel: "INFO"

# Maven localRepository 本地路径
localRepository: "~/.m2/repository"

deploy:
  enable: true
  commandName: "/usr/local/bin/mvn"
  # Alternate path for the user settings file
  settingXml: "~/.m2/settings.xml"
  # The ID of the repository
  id: "yore_nexus"
  # The URL of the repository maven
  url: "http://nexus.yore.cn/repository/maven-releases"
  # Output maven debugging information
  debug: false

  # The list of file suffixes to be ignored
  excludeSuffixs:
    - ".DS_Store"
    - ".asc"
    - ".lastUpdated"
    - ".md5"
    - ".repositories"
    - ".sha1"
    - ".sha256"
    - ".sha512"
    - ".xml"

clean:
  enable: false

主要关注如下几个配置

  • localRepository: Maven localRepository 本地路径
  • deploy.enable: 启用 deploy
  • deploy.settingXml: Maven 的 setting.xml 配置路径
  • deploy.id: 私服仓库的 ID,需要与 setting.xml 中配置的私服账号 ID 一致
  • deploy.url: 私服仓库的地址

执行如下命令开始上传

./tools_localRepo --config ./config.yaml

如果需要输出项目更详细的信息可以将 verbose 设置为 true,如果需要输出 Maven 执行的更详细的信息,可以将 deploy.debug 设置为 true。

3.3 清理 localRepository 中指定后缀的文件

拷贝 config.yaml.template 为 config.yaml,简单配置如下信息:

# 是否输出项目的 debug 信息
verbose: false
logLevel: "INFO"

# Maven localRepository 本地路径
localRepository: "~/.m2/repository"

deploy:
  enable: false

clean:
  # If it is in cleaning mode, the list of file suffixes that will be cleaned up
  enable: true
  suffixs:
    - ".DS_Store"
    - ".lastUpdated"

主要关注如下几个配置

  • localRepository: Maven localRepository 本地路径
  • deploy.enable: 关闭 deploy
  • clean.enable: 启用 clean
  • clean.suffixs: 需要清理 localRepository 中的后缀文件列表

执行如下命令开始上传

./tools_localRepo --config ./config.yaml

同样,如果需要输出项目更详细的信息可以将 verbose 设置为 true,如果需要输出 Maven 执行的更详细的信息,可以将 deploy.debug 设置为 true。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/926409.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【linux学习指南】详解Linux进程信号保存

文章目录 &#x1f4dd;保存信号&#x1f320; 信号其他相关常⻅概念&#x1f309;在内核中的表⽰ &#x1f320; sigset_t&#x1f320;信号集操作函数&#x1f309;sigprocmask&#x1f309;sigpending &#x1f6a9;总结 &#x1f4dd;保存信号 &#x1f320; 信号其他相关常…

【C++】 算术操作符与数据类型溢出详解

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;C 算术操作符详解基本算术操作符整数除法与取模行为类型转换在算术运算中的作用自增与自减操作符 &#x1f4af;数值溢出&#xff1a;当值超出类型范围时数据类型的取值范围…

【继承】—— 我与C++的不解之缘(十九)

前言&#xff1a; 面向对象编程语言的三大特性&#xff1a;封装、继承和多态 本篇博客来学习C中的继承&#xff0c;加油&#xff01; 一、什么是继承&#xff1f; ​ 继承(inheritance)机制是⾯向对象程序设计使代码可以复⽤的最重要的⼿段&#xff0c;它允许我们在保持原有类…

使用redis-plus-plus库连接redis

使用redis-plus-plus库连接redis 一、安装redis-plus-plus1.1安装hiredis1.2编译安装redis-plus-plus 二、redis的连接使用2.1创建redis对象2.2向redis中添加元素2.3判断元素是否存在2.4获取元素2.5设置获取过期时间2.6获取类型2.7 删除当前数据库 一、安装redis-plus-plus C …

JMeter 并发策略-针对准点秒杀场景的压测实现

一、场景的压测实现 1&#xff0c;创建线程组&#xff0c;10并发用户执行5次&#xff1b; 2&#xff0c;创建 Synchronizing Timer 元件,用于同步线程&#xff0c;设置同步元件 Synchronizing Timer 3&#xff0c;创建 http 请求4&#xff0c;创建 view results in table 元件…

记一次搞校园网的经历

接教室的校园网&#xff0c;到另一个屋子玩电脑&#xff0c;隔墙想放大一下AP的信号&#xff0c;发现死活不行 这是现状 由于校园网认证的存在&#xff0c;无法用桥接&#xff0c;桥接需要路由器有IP&#xff0c;而这个IP无法用未刷机的路由器来打开校园网页面认证 解决 将一…

打latex公式可以练到像手写一样快吗?

这里分享两个Python Latex工具latexify和handcalcs。 latexify生成LaTeX 数学公式 import math import latexify @latexify.with_latex #调用latexify的装饰器 def solve(a, b, c):return (-b + math.sqrt(b**2 - 4*a*c)) / (2*a)solve 更多例子.......

【Linux】常用命令二

1、cat 用于查看内容较少的纯文本文件。 参数-n可以显示行号。 2、more 用于查看内容较多的纯文本文件。 它会在最下面使用百分比的形式来提示你已经月读了多少内容&#xff0c;你可以使用空格键或回车键向下翻页。 3、head 用于查看纯文本文档的前N行。 4、tail 用于查看…

SolarCube: 高分辨率太阳辐照预测基准数据集

太阳能作为清洁能源在减缓气候变化中的作用日益凸显&#xff0c;其稳定的供应对电网管理至关重要。然而&#xff0c;太阳辐照受云层和天气变化的影响波动较大&#xff0c;给光伏电力的管理带来挑战&#xff0c;尤其是在调度、储能和备用系统管理方面。因此&#xff0c;精确的太…

第三方Express 路由和路由中间件

文章目录 1、Express 应用使用回调函数的参数&#xff1a; request 和 response 对象来处理请求和响应的数据。2、Express路由1.路由方法2.路由路径3.路由处理程序 3. 模块化路由4. Express中间件1.中间件简介2.中间件分类3.自定义中间件 1、Express 应用使用回调函数的参数&am…

nginx+php压测及报错优化

测试环境&#xff1a;虚拟机centos7&#xff0c;nginxphp 压测工具&#xff1a;Apipost 访问的php程序中添加sleep()增加程序执行时长&#xff0c;使用Apipost进行压测&#xff0c;根据服务器配置设置一个大概可能触发报错的并发和轮训次数&#xff0c;若无报错逐渐增加并发和…

探索Python词云库WordCloud的奥秘

文章目录 探索Python词云库WordCloud的奥秘1. 背景介绍&#xff1a;为何选择WordCloud&#xff1f;2. WordCloud库简介3. 安装WordCloud库4. 简单函数使用方法5. 应用场景示例6. 常见Bug及解决方案7. 总结 探索Python词云库WordCloud的奥秘 1. 背景介绍&#xff1a;为何选择Wo…

AOSP的同步问题

repo sync同步时提示出错: error: .repo/manifests/: contains uncommitted changesRepo command failed due to the following UpdateManifestError errors: contains uncommitted changes解决方法&#xff1a; 1、cd 进入.repo/manifests cd .repo/manifests2、执行如下三…

Shell脚本小练习

学习了这么长时间Shell脚本&#xff0c;总得来一次小小的练习吧&#xff0c;那么请看下文&#xff01; 1.用Shell写一个小计算器。 通过read命令获取用户输入的表达式&#xff0c;表达式的格式设定为操作数1 运算符 操作数2&#xff0c;例如53&#xff0c;然后利用设计的脚本…

k8s Init:ImagePullBackOff 的解决方法

kubectl describe po (pod名字) -n kube-system 可查看pod所在的节点信息 例如&#xff1a; kubectl describe po calico-node-2lcxx -n kube-system 执行拉取前先把用到的节点的源换了 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"re…

Git 快速入门:全面了解与安装步骤

Git 快速入门&#xff1a;全面了解与安装步骤 一、关于Git 1.1 简介 Git 是一个开源的分布式版本控制系统&#xff0c;由 Linus Torvalds 于 2005 年创建&#xff0c;最初是为了更好地管理 Linux 内核开发而设计。 Git用于跟踪计算机文件的变化&#xff0c;特别是源代码文件…

springboot358智慧社区居家养老健康管理系统(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 智慧社区居家养老健康管理系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&…

探索 IntelliJ IDEA 中 Spring Boot 运行配置

前言 IntelliJ IDEA 作为一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;为 Spring Boot 应用提供了丰富的运行配置选项&#xff0c;定义了如何在 IntelliJ IDEA 中运行 Spring Boot 应用程序&#xff0c;当从主类文件运行应用程序时&#xff0c;IDE 将创建…

快速讲图片中的公式粘贴到word中

只是个人学习记录&#xff0c;不具备教学意义 目的&#xff1a; 比如下面图片中的公式 我们想把这个公式整到我们的word上&#xff0c;传统的方法是通过安装MathType插件&#xff0c;然后慢慢打。我说这样你就慢了。 解决办法&#xff1a; 前提准备&#xff1a; 我们需要…

【STM32+HAL】FreeRTOS学习小札

一、RTOS程序任务结构 如上图所示&#xff0c;在实时操作系统中&#xff0c;开发人员可以把要实现的功能划分为多个任务&#xff0c;每个任务负责实现其中的一部分&#xff0c;每个任务都是一个很简单的程序&#xff0c;通常是一个死循环。 二、多任务系统基本概念 1、FreeRTO…