gradle的各个环境依赖jar包的同一个版本导致的严重后果

news/2025/11/27 21:35:49/文章来源:https://www.cnblogs.com/dreamroute/p/19279513
  1. 背景:我司的A项目(gradle)、B项目(maven),且公司无maven私服,jar包均放在gitlab的项目的package registry中

  2. A项目依赖B项目的api包,我的做法如下:

    1. B项目版本定义成1.0-SNAPSHOT版本,永远都是这个版本
    2. 在gitlab创建3个项目,分别是maven-dev、maven-stg、maven-prod
    3. 部署的时候,分别把B项目的dev、stg、prod的包deploy到maven-dev、maven-stg、maven-prod中去
  3. 我的默认想法是:A项目分别从3个仓库中拉取,但是事与愿违,我的A项目配置的仓库信息为:

    repositories {mavenCentral()maven { url 'https://repo.spring.io/milestone' }maven {url = "https://gitlab.com/api/v4/groups/xxx/-/packages/maven"credentials(HttpHeaderCredentials) {def credentials = getGitLabCredentials()name = credentials.typevalue = credentials.token}authentication {header(HttpHeaderAuthentication)}}
    }
    
  4. 上方的url其实是包含了我司的所有项目,因此我的dev、stg、prod仓库也被包含在其中

  5. 由于上一步的原因,A项目拉取B项目的依赖时,会从3个仓库中去拉取,而3个仓库的排序我是不清楚的(清楚也没用),会从第一个仓库拉取,我这里是prod。所以就导致了一个现象是:我改了B,deploy到dev之后,A拉取的永远是prod(第一个)的。

  6. 实际上就是A不会根据环境区拉取我的B的各个环境的包。这就是gradle坑爹的地方执意,maven就没这个问题。所以能不用gradle就不用吧。

  7. 解决办法:

    1. 在A项目中为B的不同环境配置不同的仓库,很麻烦
    2. B的在各个环境中的版本不一致
    3. 我选择改变版本
  8. 解决办法实操:

    1. 在B中定义3个<profile>来代表3个换进

      <profile><id>dev</id><activation><activeByDefault>true</activeByDefault></activation><properties><revision>1.0.0-SNAPSHOT</revision></properties>
      </profile>
      <profile><id>dev</id><activation><activeByDefault>true</activeByDefault></activation><properties><revision>1.5.0-SNAPSHOT</revision></properties>
      </profile>
      <profile><id>dev</id><activation><activeByDefault>true</activeByDefault></activation><properties><revision>2.0.0-SNAPSHOT</revision></properties>
      </profile>
      
    2. 在A中根据3个环境使用不同的版本

  9. 我解决这个问题的思路:

    1. 发现B改动了,但是A中的包没动静,不变化,即便我把本地B包删了,拉取下来的依然是旧的版本,两天前的版本

    2. 反复试验都不行

    3. 我最先在dev、stg、prod中deploy了1.0-SNAPSHOT版本

    4. 后来我把B改为1.0.0-SNAPSHOT,增加了1位版本号,发现没问题了,我以为是版本号规则问题,实际上并不是(实际原因是stg/prod根本没有3位这个版本),所以每次B改动deploy,A立马就能拉取最新的,于是我认为是版本号码需要3位才行。但是这个理论问了下chatgpt,回答模棱两可,表示有可能。问了gemini回答很肯定,不是版本号太短的问题。曾几何时我依稀记得在哪里看过说2位版本号码会有问题,但是我内心也其实也不相信这个理论。

    5. 于是一步一步给gemini贴配置代码,他一步一步帮我分析,最终发现有2个包下有B包的metadata.xml信息,如下:

      MacBook-Pro modules-2 % find . -type f -name "maven-metadata.xml" -exec grep -l "b-api" {} \;
      ./resources-2.1/69/3ecf46f9d1b384fd9c9562420c6e5388dcbef1f9/maven-metadata.xml
      ./resources-2.1/69/ca93e6109fca15ef792aebcfb428e1eb4bcab438/maven-metadata.xml
      ./resources-2.1/69/a1310a8210427b69f2aba4155c69a4ff61e970bd/maven-metadata.xml
      ./resources-2.1/69/14eea55ff435b509135d19bf004df42c01b6faef/maven-metadata.xml
      ./resources-2.1/69/8805c4bf152b42b7bf332af1f418bbf886e79f61/maven-metadata.xml
      ./resources-2.1/49/41143eb420aef00487e7d7514868cc546edac6dc/maven-metadata.xml
      
    6. 挨个查看上面6个文件的内容,发现69,和49开头的,进一步分析,发现69开头的都是我刚刚不断deploy B包的metadata信息,而49那个就是我观察日志拉取下来的旧包的信息

    7. gemini提说可能是我的api来自多个仓库,于是我依稀记得前两天创建3个环境的仓库的时候,分别deploy了一下试了一下是否可用,于是检查3个仓库,果然发现拉取的旧的就在我的prod那个仓库里面

    8. 此刻还没意识到是3个仓库的优先级问题,后面在提另外一个问题的时候灵光一闪,意识到了3个仓库的问题(这是根本原因)

    9. 于是就有了上方的解决方案。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20251127

我这个忘浑蛋又忘了写博客了,最近想弄个远程服务器试试javaweb,阿里云好像有学生特权,一会儿去看看。

一定要扪心自问

你如果还只是理解的那么片面,学了那么多有什么用 一定要思考 就像这道题吧: 1.min考虑的是初始值0x3f3f3f3f; 2.选了和没选而不是无脑的dp[][]; 不可以再像之前一样永远无脑的dp[][]!!!; #include <bits/stdc++.h…

2025年租房APP推荐:官方测评与精选攻略

2025年租房APP推荐:官方测评与精选攻略在城市青年的居住选择谱系中,租房早已不再是“找个落脚处”那么简单。信息冗杂的品牌公寓、良莠不齐的中介平台、真假难辨的个人房源,将租客推向一场耗时耗力的拉锯战。人们不…

Day26字体图标--上传矢量图

上传矢量图是为了解决项目需要的图片到iconfont图标库,生成字体 首先上传图片的后缀要是svg 进入inconfont之后寻找这个图标从左往右数第一个云朵样式的 点击之后从文件夹选择要上传的图标即可

从零开始:用Python和Gemini 3四步搭建你自己的AI Agent

很多人第一次看到 AI Agent 自己编辑文件、跑代码、修 bug,还能一直运行下去的时候,都觉得挺神奇。其实远没有想象中那么复杂。这里没什么秘密算法,也没有什么"智能体大脑"这种玄学概念。 AI Agent核心就三…

【机器学习】突破分类瓶颈:用逻辑回归与Softmax回归解锁多分类世界 - 指南

【机器学习】突破分类瓶颈:用逻辑回归与Softmax回归解锁多分类世界 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-famil…

双特异性抗体:抗癌 “双面手”,两种模式精准杀伤癌细胞

双特异性抗体是免疫治疗的 “升级款利器”,能同时精准结合两种不同抗原或表位 —— 既可以是同一癌细胞上的两个靶点,也能是癌细胞与免疫细胞上的不同靶点,通过两种核心作用模式,实现对癌细胞的高效杀伤,比单特异…

机器翻译模型跨领域自适应技术解析

本文介绍了一种结合弹性权重巩固与数据混合的神经机器翻译多领域自适应方法,有效平衡新旧任务性能,在EMNLP 2021会议上发表的研究成果。适应机器翻译模型到新领域 结合弹性权重巩固和数据混合能在旧任务和新任务性能…

高级程序语言第七次作业

高级程序语言第七次作业这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/gjyycx这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/gjyycx/homework/15587学号 222200424姓名 赵伟豪(1)定义一个二维…

Chatbox 安装 for Windows - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025.11.27

上课,吃饭,睡觉,录档案,取快递,吃饭

windows和linux下jar包graalvm打包生native程序 - yebinghuai-qq

windows和linux下jar包graalvm打包生native程序windows环境准备:安装Visual Studio Community2026Setup.exe安装完在开始菜单栏搜索native以管理员身份运行,如下图所示 从github网站https://github.com/graalvm/gra…

Day25字体图标

如何下载字体图标呢?<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial…

P31_完整的模型验证套路

P31_完整的模型验证套路完整的模型验证(测试,demo)套路——利用已经训练好的模型,然后给它提供输入 1.png和jpg格式的图片通道数 (1)png格式的图片是4通道(RGB三通道+透明度通道),jpg格式的图片是3通道(RGB)…

赋能第一期 新员工角色转换主题培训

1、无论是公司组织的还是商院组织的,每一场培训的目的都是为了让我们更快的适应职场,而我们正是通过这一次又一次的培训,达到了量变到质变的效果,积攒了作为员工,如何更好的工作,向上级汇报,先说结论再层次递进…

从技术管理者到战略决策者,揭秘IT技术负责人的四个价值层次,看看您在第几层?

本文将IT团队负责人价值划分为任务执行者、流程优化者、技术战略家、业务共创者四个递进层次,剖析各层次本质与跃迁方法,揭示从被业务驱动到驱动业务的认知转变,为IT负责人成长为战略决策者提供实践指南。文 / Keny…

DS优化建图

线段树优化建图

深入解析:Leetcode 43

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

十一月份《代码大全》观后感二

在学校的作业环境中,我们往往是“乐观主义者”。我们假设用户的输入总是合理的,假设文件总是存在且可读,假设网络永远畅通。这种乐观主义在现实世界中是致命的。《代码大全2》中的“防御式编程”思想,像一盆冷水,…

解读Spring Boot框架中不同位置抛出异常的处理流程

背景知识 对于Java Web开发而言,客户端发起的HTTP请求处理顺序为:Servlet容器 -> Filter -> Servlet -> Interceptor -> Controller,参考:Spring拦截器HandlerInterceptor与Filter方法执行顺序探究。 …