合并jar包导致gradle传递依赖失效

news2024/12/24 8:31:50

目录

  • 零、背景
  • 一、合并jar包
    • 1.1、自定义一组jar包
    • 1.2、自定义合并jar的任务
    • 1.3、定义打包jar的任务
  • 二、发布jar包
    • 2.1、未合并jar包之前的合并方式
    • 2.2、合并jar包之后的合并方式
  • 三、发现问题
    • 3.1、确定gradle中的依赖关系
    • 3.2、对比maven是否缺失依赖
    • 3.3、对比合并前后的pom.xml
    • 3.4、额外上传pom文件

零、背景

有2个gradle工程,分别是sdk-jni和java-sdk,后者静态依赖前者。

dependencies {
    compile fileTree(dir: 'libs', includes: ['*jar'])
	...
}

还有一些应用层的java工程,通过gradle动态依赖它们。起初,应用层工程需要分别添加sdk-jni和java-sdk这2个依赖。
为了保持java-sdk依旧静态依赖sdk-jni的前提下,需要合并sdk-jni.jar到java-sdk.jar中,这样,各应用层工程只需要引入java-sdk一个依赖即可。

一、合并jar包

1.1、自定义一组jar包

自定义一组jar包,分别是java-sdk本身的jar和sdk-jni本身的jar,为后续的合并中备用,

dependencies {
    configurations {
        customJars
    }
    customJars files('dist/apps/chain-java-sdk-' + project.version + '-raw.jar', 'dist/lib/chain-sdk-jni-' + project.version + '.jar')
    ...
}

1.2、自定义合并jar的任务

自定义gradle任务mergeJars,将第一步中准备好的这一组中间产物jar(chain-java-sdk-v2.2.4-raw.jar和chain-sdk-jni-v2.2.4.jar)合并为最终产物chain-java-sdk-v2.2.4.jar,

task mergeJars(type: Jar) {
    archiveFileName = 'chain-java-sdk-' + project.version + '.jar'
    destinationDir = file('dist/apps/')
    from {
        configurations.customJars.collect {it.isDirectory() ? it : zipTree(it)}
    }
    doLast {
        def dependencies = project.configurations.customJars.files
        dependencies.each { dependency ->
            copy {
                from zipTree(dependency)
                into temporaryDir
            }
        }
        from temporaryDir
    }
}

1.3、定义打包jar的任务

定义gradle任务jar,将java-sdk本身打包为纯粹的不包含sdk-jni的jar包,名为chain-java-sdk-v2.2.4-raw.jar,并通过finalizedBy使得执行jar任务后自动执行合并的任务,

jar {
    archiveName "chain-java-sdk-" + project.version + "-raw" + '.jar'
    exclude '**/*.xml'
    exclude '**/*.properties'

    doLast {
        copy {
            from destinationDirectory
            into 'dist/apps'
        }
        copy {
            from configurations.runtimeClasspath
            into 'dist/lib'
        }
        copy {
            from file('src/test/resources/config-example.toml')
            from file('src/test/resources/clog.ini')
            from file('src/test/resources/log4j.properties')
            into 'dist/conf'
        }
    }
}
jar.finalizedBy mergeJars

二、发布jar包

2.1、未合并jar包之前的合并方式

定义publishing任务,将java-sdk本身的jar包发布到maven仓库,

publishing {
    publications {
        maven(MavenPublication) {
            from components.java
        }
    }
    repositories {
        maven {
            url = version.endsWith("-SNAPSHOT") ?
                    "http://192.168.1.231:8081/repository/maven-snapshots" :
                    "http://192.168.1.231:8081/repository/maven-releases"
            print url
            //认证用户和密码
            credentials {
                username 'nexus'
                password 'Nexus@123'
            }
        }
    }
}

2.2、合并jar包之后的合并方式

合并sdk-jni到java-sdk之后,无法再通过publishing任务,将合并后的jar包发布到maven仓库,我们选择通过mvn deploy:deploy-file命令手动上传合并后的jar包,

mvn deploy:deploy-file -DgroupId=com.szh.chain.java-sdk -DartifactId=chain-java-sdk -Dversion=2.2.4-SNAPSHOT -Dpackaging=jar -Dfile=/Users/songzehao/Downloads/chain-java-sdk-2.2.4.jar -Durl=http://192.168.1.231:8081/repository/maven-snapshots/ -DrepositoryId=deploySnapshot

执行这一步,必须保证maven的配置文件settings.xml定义好maven库的信息,

<?xml version="1.0" encoding="utf-8"?>
 
<settings>
  <localRepository>/opt/maven_repo/szh_repo</localRepository> 
  <offline>false</offline> 
  <pluginGroups>
    <!--
        <pluginGroup>com.snda.toolkit.plugins
            </pluginGroup>
            <pluginGroup>com.meidusa.toolkit.plugins
        </pluginGroup> --> 
    <pluginGroup>org.mortbay.jetty</pluginGroup>
  </pluginGroups> 
  <mirrors>
    <!-- <mirror>
      <id>central</id>
      <name>Central</name>
      <url>http://repo1.maven.org/maven2</url>
      <mirrorOf>central</mirrorOf>
    </mirror>
     -->
  </mirrors> 
  <servers>
    <server>
      <id>deployRelease</id> 
      <username>nexus</username> 
      <password>Nexus@123</password>
    </server> 
    <server>
      <id>deploySnapshot</id> 
      <username>nexus</username> 
      <password>Nexus@123</password>
    </server>
  </servers> 
  <profiles>
    <profile>
      <id>szhMaven</id> 
      <repositories>
        <repository>
          <id>deployRelease</id> 
          <url>http://192.168.1.231:8081/repository/maven-releases/</url> 
          <releases>
            <enabled>true</enabled>
          </releases> 
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </repository> 
        <repository>
          <id>deploySnapshots</id> 
          <url>http://192.168.1.231:8081/repository/maven-snapshots/</url> 
          <releases>
            <enabled>true</enabled>
          </releases> 
          <snapshots>
            <enabled>true</enabled>
          </snapshots>
        </repository>
      </repositories>
    </profile>
  </profiles> 
  <activeProfiles>
    <activeProfile>szhMaven</activeProfile>
  </activeProfiles>
</settings>

三、发现问题

合并jar包并手动上传jar包后,发现应用层构建会缺失依赖cn.hutool:hutool-all:5.5.1。

3.1、确定gradle中的依赖关系

implementation不会传递依赖,api会传递依赖。自Gradle3之后,等同于apicompile不推荐使用,避免传递太多,导致构建太慢。
经确认,缺失的这些依赖是从java-sdk中预期要被传递进来的。也就是说,合并jar包导致gradle传递依赖失效。

3.2、对比maven是否缺失依赖

因为之前在maven工程中使用过mvn deploy:deploy-file来手动上传包,没有出现过缺失依赖的问题,所以简单写个maven工程来验证是否能成功传递依赖到maven应用层工程。经验证,maven工程中可以成功传递依赖,而在gradle工程中不能成功传递依赖进来。

3.3、对比合并前后的pom.xml

合并之前确认是可以成功传递依赖到应用层的gradle工程,合并之后失败,所以登录nexus对比前后的jar包相关的区别。
合并之后的maven仓库中,java-sdk的pom文件内容:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.szh.chain.java-sdk</groupId>
	<artifactId>chain-java-sdk</artifactId>
	<version>2.2.4-SNAPSHOT</version>
</project>

合并之前的maven仓库中,java-sdk的pom文件内容:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <!--  This module was also published with a richer model, Gradle metadata,   -->
    <!--  which should be used instead. Do not delete the following line which   -->
    <!--  is to indicate to Gradle or any Gradle module metadata file consumer   -->
    <!--  that they should prefer consuming it instead.  -->
    <!--  do_not_remove: published-with-gradle-metadata  -->
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.szh.chain.java-sdk</groupId>
    <artifactId>chain-java-sdk</artifactId>
    <version>2.2.2-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.5.1</version>
            <scope>compile</scope>
            <exclusions>
                <exclusion>
                    <artifactId>logback-classic</artifactId>
                    <groupId>ch.qos.logback</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>brave-tests</artifactId>
                    <groupId>io.zipkin.brave</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        ...
        <dependency>
            <groupId>org.yaml</groupId>
            <artifactId>snakeyaml</artifactId>
            <version>1.33</version>
            <scope>compile</scope>
            <exclusions>
                <exclusion>
                    <artifactId>logback-classic</artifactId>
                    <groupId>ch.qos.logback</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>brave-tests</artifactId>
                    <groupId>io.zipkin.brave</groupId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
</project>

对比出来了明显的差异,合并后的pom文件只有java-sdk本身的坐标,缺失了自己需要传递出去的其他包的依赖。

3.4、额外上传pom文件

解决方案是需要在通过mvn deploy:deploy-file手动上传jar包的同时,添加-DpomFile参数一起上传pom文件即可。
那么一个依赖很复杂的gradle工程,如何快速得到对应的pom.xml文件?gradle提供了publishToMavenLocal命令,执行后得到build/publications/pom-default.xml
所以调整上传命令:

mvn deploy:deploy-file -DgroupId=com.szh.chain.java-sdk -DartifactId=chain-java-sdk -Dversion=2.2.4-SNAPSHOT -Dpackaging=jar -Dfile=/Users/songzehao/Downloads/chain-java-sdk-2.2.4.jar -Durl=http://192.168.1.231:8081/repository/maven-snapshots/ -DrepositoryId=deploySnapshot -DpomFile=/Users/songzehao/Downloads/pom-default.xml

在这里插入图片描述
上传完毕再次查看maven仓库中的pom.xml,已经有完整的依赖关系。重新构建应用层的gradle工程,已经可以成功拉取到传递的依赖包。最后还是建议尽量少用静态依赖。

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

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

相关文章

【生态经济学】利用R语言进行经济学研究技术——从数据的收集与清洗、综合建模评价、数据的分析与可视化、因果推断等方面入手

查看原文>>>如何快速掌握利用R语言进行经济学研究技术——从数据的收集与清洗、综合建模评价、数据的分析与可视化、因果推断等方面入手 近年来&#xff0c;人工智能领域已经取得突破性进展&#xff0c;对经济社会各个领域都产生了重大影响&#xff0c;结合了统计学、…

Midjourney API 国内申请及对接方式

在人工智能绘图领域&#xff0c;想必大家听说过 Midjourney 的大名吧&#xff01; Midjourney 以其出色的绘图能力在业界独树一帜。无需过多复杂的操作&#xff0c;只要简单输入绘图指令&#xff0c;这个神奇的工具就能在瞬间为我们呈现出对应的图像。无论是任何物体还是任何风…

7-10 查验身份证

分数 15 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下&#xff1a; 首先对前17位数字加权求和&#xff0c;权重分配为&#xff1a;{7&#xff0c;9&#xff0c;10&#xff0c…

No mapping found for HTTP request with URI

参考: 参考地址 说明 ssm老项目,接过来别人的项目 临时建了一个Controller方便测试用的,结果访问掉不通,报: No mapping found for HTTP request with URIxxxx 这样的错误 解决办法 看了下web,xml配置 在 webmvc-config.xml 配置文件里面添加了几行配置 说明: com.iph.h…

如何使用 JavaScript Promise – 回调、异步等待和 Promise 方法解释

在本教程中,您将学习有关在 JavaScript 中使用 Promise 和 async/await 所需了解的所有内容。 那么让我们开始吧。 为什么在 JavaScript 中使用 Promise? ES6 引入了 Promise 作为原生实现。在 ES6 之前,我们使用回调来处理异步操作。 让我们了解什么是回调以及 Promise…

8.部署项目

项目地址&#xff1a;RuoYi-Cloud-Plus: 项目正式入驻 dromara 开源社区 迁移地址: https://gitee.com/dromara/RuoYi-Cloud-Plus 1.获取源码 需要有gitee账户 先把源码fork到自己的仓库中 需要多等待一段时间 勾选对应的环境 构建项目 2.sql导入 将sql导入到与sql文件名…

PHP 房产网站系统Dreamweaver开发mysql数据库web结构php编程计算机网页项目

一、源码特点 PHP 房产网站系统是一套完善的WEB设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 源码 https://download.csdn.net/download/qq_41221322/88233553 论文 https://download…

深入理解Java线程

进程、线程和协程 进程 程序由指令和数据组成&#xff0c;但程序要运行就要将指令加载进CPU以及数据加载进内存&#xff0c;并且在指令运行过程中可能还会用到磁盘、网络等设备。进程就是用来加载指令、管理内存和IO的。当一个程序被运行&#xff0c;从磁盘加载这个程序的代码…

基本定时器

1.简介 1. 基本定时器 TIM6 和 TIM7 包含一个 16 位自动重载计数器 2. 可以专门用于驱动数模转换器 (DAC), 用于触发 DAC 的同步电路 3. 16 位自动重载递增计数器 4. 16 位可编程预分频器 5. 计数器溢出时, 会触发中断/DMA请求 从上往下看 1.开始RCC供给定时器的时钟 RCC_APB1…

python解析小说

前言 在信息爆炸的时代&#xff0c;网络上充斥着大量的小说资源&#xff0c;让人们能够随时随地尽享阅读的乐趣。然而&#xff0c;有些小说网站要求用户付费才能获取完整的内容&#xff0c;这给许多人带来了困扰&#xff0c;尤其是像我这类对金钱概念模糊的人。不过&#xff0…

Android 12 源码分析 —— 应用层 二(SystemUI大体组织和启动过程)

Android 12 源码分析 —— 应用层 二&#xff08;SystemUI大体组织和启动过程&#xff09; 在前一篇文章中&#xff0c;我们介绍了SystemUI怎么使用IDE进行编辑和调试。这是分析SystemUI的最基础&#xff0c;希望读者能尽量掌握。 本篇文章&#xff0c;将会介绍SystemUI的大概…

工业类LMQ61460AASRJRR,汽车类LMQ61460AFSQRJRRQ1、LMQ61460AASQRJRRQ1 6A、降压转换器简化原理图

一、LMQ61460AASRJRR器件概述&#xff1a; LMQ61460 是一款具有集成旁路电容器的高性能直流/直流同步降压转换器。该器件具有集成式高侧和低侧MOSFET&#xff0c;能够在 3.0V 至 36V 的宽输入电压范围内提供高达 6A 的输出电流&#xff1b;可耐受 42V 电压&#xff0c;简化了输…

智影 R100:首款三维Mesh建模的SLAM激光扫描仪

近年来&#xff0c;激光SLAM系统凭借其更加快速且准确获取更丰富信息的优势&#xff0c;迅速风靡测绘领域&#xff0c;让原本耗时耗力的外业测量变得更加高效。手持激光扫描仪作为基于激光SLAM技术衍生的众多产品之一&#xff0c;相较于架站式激光扫描仪更加轻巧便利&#xff0…

AUTOSAR规范与ECU软件开发(实践篇)5.2 ETAS ISOLAR-A工具入门

目录 1、 ISOLAR-A安装方法 2 、ISOLAR-A界面说明 1、 ISOLAR-A安装方法 ISOLAR-A工具安装方法较为便捷, 按照安装提示默认操作即可。双击打开ETAS ISOLAR-A的安装包文件夹, 双击运行Autostart.exe, 会出现如图5.2所示的安装界面, 然后点击Main, 会弹出如图5.3所示界面,…

Stable Diffusion web UI 部署详细教程

前言 本文使用 AutoDL 平台进行 Stable Diffusion web UI 云端部署 AutoDL 官网&#xff1a;AutoDL算力云 | 弹性、好用、省钱。租GPU就上AutoDL Stable Diffusion web UI 官网&#xff1a;AUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UI (github.com) 步…

string(模拟实现与深拷贝)

目录 深拷贝与浅拷贝 浅拷贝&#xff1a; 深拷贝 写时拷贝(了解) 模拟实现 准备 完整代码 深拷贝与浅拷贝 浅拷贝&#xff1a; 也称位拷贝&#xff0c;编译器只是将对象中的值拷贝过来。如果对象中管理资源&#xff0c;最后就会导致多个对象共享同一份资源&#xff0c;当一…

AMSET计算极化声子频率

前面已有文章介绍过amset这个软件&#xff0c;包括形变势VASPAMSET计算形变势、迁移率散射AMSET计算不同散射机制下载流子迁移率的计算和绘制功能中能带结构VASPAMSET plot 绘制能带图的使用。 同时&#xff0c;通过amset可以处理密度泛函微扰计算&#xff08;DFPT&#xff09;…

软件产品鉴定测试需要哪些材料?选择第三方软件检测机构的必要性

在当今数字化时代&#xff0c;软件产品无论是在企业还是个人生活中都扮演着重要的角色。然而&#xff0c;随着软件产品的不断增多和市场竞争的加剧&#xff0c;软件产品进行鉴定测试显得尤为重要。 一、软件鉴定测试需要提供哪些材料? 1、软件产品的版本号和更新说明 2、软…

2023国赛数学建模思路 - 案例:感知机原理剖析及实现

文章目录 1 感知机的直观理解2 感知机的数学角度3 代码实现 4 建模资料 # 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 感知机的直观理解 感知机应该属于机器学习算法中最简单的一种算法&#xff0c;其…

docker容器的基础操作

一、安装docker服务&#xff0c;配置镜像加速器 1.安装必要的一些系统工具 2.添加软件源信息 3.更新源并安装 Docker-ce 4.安装校验 [rootnode ~]# docker version 5.docker镜像加速 可以在阿里云的容器镜像服务中查看配置镜像加速器 二、下载系统镜像&#xff08;Ubuntu、 …