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

目录

  • 零、背景
  • 一、合并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.filesdependencies.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 destinationDirectoryinto 'dist/apps'}copy {from configurations.runtimeClasspathinto '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.mzph.cn/news/46834.shtml

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

相关文章

Source Insight配置Cppcheck做静态测试(Windows)

1.安装cppcheck 先从cppcheck官方网站下载cppcheck的安装包。 注&#xff1a; &#xff08;1&#xff09;官网地址&#xff1a;https://sourceforge.net/projects/cppcheck &#xff08;2&#xff09;截止2023年8月&#xff0c;官方发布的最新版本是cppcheck-2.11-x64-Setup.…

子集-回溯方法

class Solution {//题解思路//LinkedList<Integer> path new LinkedList<>(); List<List<Integer>> results new ArrayList<>();public List<List<Integer>> subsets(int[] nums) {//主方法中调用方法同时传入指定的参数初始值bac…

【数据挖掘】使用 Python 分析公共数据【01/10】

一、说明 本文讨论了如何使用 Python 使用 Pandas 库分析官方 COVID-19 病例数据。您将看到如何从实际数据集中收集见解&#xff0c;发现乍一看可能不那么明显的信息。特别是&#xff0c;本文中提供的示例说明了如何获取有关疾病在不同国家/地区传播速度的信息。 二、准备您的…

【计算机视觉|生成对抗】改进的生成对抗网络(GANs)训练技术

本系列博文为深度学习/计算机视觉论文笔记&#xff0c;转载请注明出处 标题&#xff1a;Improved Techniques for Training GANs 链接&#xff1a;[1606.03498v1] Improved Techniques for Training GANs (arxiv.org) 摘要 本文介绍了一系列应用于生成对抗网络&#xff08;G…

ICCV23 | Ada3D:利用动态推理挖掘3D感知任务中数据冗余性

​ 论文地址&#xff1a;https://arxiv.org/abs/2307.08209 项目主页&#xff1a;https://a-suozhang.xyz/ada3d.github.io/ 01. 背景与动因 3D检测(3D Detection)任务是自动驾驶任务中的重要任务。由于自动驾驶任务的安全性至关重要(safety-critic)&#xff0c;对感知算法的延…

HCIP STP总结

网桥的4个选举 根网桥&#xff1a; 有且仅有一台&#xff0c;且由BPDU中的桥ID来决定 桥ID 网桥优先级&#xff08;0-65535公有&#xff09; 默认32768 MAC地址&#xff08;只有存在svi接口…

Pinia基础教程

Pinia wiki Pinia 起始于 2019 年 11 月左右的一次实验&#xff0c;其目的是设计一个拥有组合式 API 的 Vue 状态管理库。从那时起&#xff0c;我们就倾向于同时支持 Vue 2 和 Vue 3&#xff0c;并且不强制要求开发者使用组合式 API&#xff0c;我们的初心至今没有改变。除了安…

数据结构-->栈

&#x1f495;休对故人思故国&#xff0c;且将新火试新茶&#xff0c;诗酒趁年华&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;详解链表OJ题 前言&#xff1a; 前面已经学习过顺序表&#xff0c;链表。他们都是线性表&#xff0c;今天要学习的栈也是一种线…

【C++】C 语言 和 C++ 语言中 const 关键字分析 ② ( const 常量分配内存时机 | const 常量在编译阶段分配内存 )

文章目录 一、const 常量内存分配时机二、使用如下代码验证 const 常量内存分配时机三、分析验证结果 - const 常量在编译阶段分配内存 一、const 常量内存分配时机 在上一篇博客中 , 讲到了获取 const 常量的地址 , 代码如下 : // 定义常量// 该常量定义在了 符号表 中// 符号…

C++--深度理解智能指针

PS:智能指针简单应用看这里 http://t.csdn.cn/qN7IK 1.智能指针的介绍 在C中&#xff0c;智能指针有三个版本&#xff0c;分别为&#xff1a; auto_ptr unique_ptr shared_ptr 这三个版本的智能指针中&#xff0c;shared_ptr最为完善&#xff0c;auto_ptr基本上没有太大用…

leetcode 213. 打家劫舍 II

2023.8.20 本题是 打家劫舍 的进阶版&#xff0c;房屋之间形成一个环了&#xff0c;也就是第一个房屋和最后一个房屋不能一起偷了。那么能偷的情况分为下列三种&#xff1a; 不考虑偷首房间。不考虑偷尾房间。不考虑偷首尾房间。 第三种情况包含于第一和第二种情况了&#xff…

【vue3】对axios进行封装,方便更改路由并且可以改成局域网ip访问(附代码)

对axios封装是在main.js里面进行封装&#xff0c;因为main.js是一个vue项目的入口 步骤&#xff1a; 在1处创建一个axios实例为http&#xff0c;baseURL是基础地址&#xff08;根据自己的需求写&#xff09;&#xff0c;写了这个在vue界面调用后端接口时只用在post请求处写路由…

Docker实战:Docker常用命令

一、镜像相关 1.1、查看镜像 docker images1.2、拉取镜像 docker pull nginx1.3、保存镜像 docker save -o nginx.tar nginx:latest1.4、移除镜像 docker rmi -f nginx:latest1.5、导入镜像 docker load -i nginx.tar二、容器相关 2.1、启动容器 docker run --name red…

每天一道leetcode:934. 最短的桥(图论中等广度优先遍历)

今日份题目&#xff1a; 给你一个大小为 n x n 的二元矩阵 grid &#xff0c;其中 1 表示陆地&#xff0c;0 表示水域。 岛 是由四面相连的 1 形成的一个最大组&#xff0c;即不会与非组内的任何其他 1 相连。grid 中 恰好存在两座岛 。 你可以将任意数量的 0 变为 1 &#…

基于X86六轮差速移动机器人运动控制器设计与实现(二)规划控制算法

带输入约束的 MPC 路径跟踪控制 MPC 算法是一种基于控制对象模型的控制方法&#xff0c;其优势在于在控制中考虑了 系统的多种物理约束&#xff0c;同时基于模型与当前机器人的反馈信息预估出未来机器人 位姿信息的处理方法可以解决控制迟滞的问题。 4.1 MPC 路径跟踪控…

iOS 17 正式版预计 9 月中下旬发布,部分新功能延后推出

苹果公司预计将在 9 月中下旬推出 iOS 17 正式版&#xff0c;iPhone XS 及更新的机型可免费更新。这次更新包含了许多新功能&#xff0c;但是根据苹果公司的网站显示&#xff0c;并不是所有的功能都会立即可用。苹果表示有一些功能“将在今年晚些时候推出”&#xff0c;比如&am…

mysql(3)

分库分表 分库&#xff1a;将数据库中的数据分散到不同数据库上&#xff0c;可以垂直分库和水平分库。 1.垂直分库&#xff1a;把单一的数据按照业务进行划分&#xff0c;不同的业务使用不同的数据库&#xff0c;进而将一个数据库的压力分散到多个数据库。 2.水平分库&#…

接口自动化yaml文件读取与写入

前言 在走进yaml文件之前大家应该都很想知道他是用来干嘛的&#xff1f; 是的是的&#xff0c;他是用来做接口自动化测试的。 我们一起来学习他吧&#xff01;——&#xff08;一定要收藏带走哦❤&#xff09; 1、yaml文件有什么作用呢&#xff1f; ①可作为配置文件使用—…

WMS仓库管理系统选择指南:如何确保您的仓库提高效率?

如何选择WMS仓库管理系统&#xff1f;仓库管理主要包括以下四个方面&#xff1a; 1.商品出入库管理 2.库存调拨 3.库存盘点 4.虚拟库存/实际库存管理 为了更好地管理仓库&#xff0c;我们需要确保基本的硬件设施得以满足&#xff0c;例如划分存储区域、使用货架以及进行员工培训…

使用Mybatis Plus进行DAO层开发

一、特性 Mybatis应该大家现在都知道&#xff0c;而且在项目中都在使用&#xff0c;因为这块ORM框架让大家能专心业务SQL的编写&#xff0c;数据库的连接&#xff0c;连接池的使用都不用关心&#xff0c;极大的提高了生产效率。 今天要给大家介绍的另外一款ORM框架&#xff0…