bcprov-jdk15to18和其他的bcprov版本jar包冲突(不同版本jar兼容)解决,与东方通bcprov-jdk15on.jar冲突解决

这篇具有很好参考价值的文章主要介绍了bcprov-jdk15to18和其他的bcprov版本jar包冲突(不同版本jar兼容)解决,与东方通bcprov-jdk15on.jar冲突解决。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

项目需要新集成一个sdk进行服务调用,在本地使用 Tomcat 开发调试好好的,更新到服务器上发现不行了,服务都被起不来了。报错 SecurityException: JCE cannot authenticate the provider BC
更换和东方通一样的版本jar后,又报错 java.lang.SecurityException class "org.bouncycastle.crypto.digests.GeneralDigest"'s signer information does not match signer information of other classes in the same package,版本太低又不满足sdk的使用

解决思路

在尝试不同的解决方法后

方式 结果
项目依赖的jar进行降级 项目报错
置换东方通的jar 各种奇葩错
对sdk依赖的jar版本进行降级到与东方通的jar版本一致 修改量比较大

同时也看到使用maven打包方式解决 【复盘】bcprov-jdk16包冲突问题(不同版本jar兼容) 以及 maven-shade-plugin的使用 ,可惜我用不了。同时给我提供了一个思路:更换包名

思路有了那就网上看看有没有好用的工具,最终发现一个打包替换工具:jarjar.jar

通过jarjar.jar来替换JAR包名的详细介绍

  • 获取jar
    https://mvnrepository.com/artifact/com.googlecode.jarjar/jarjar 这个jar版本比较老,针对有注解的jar包不能处理,java8的函数特性也不能有效处理
    https://mvnrepository.com/artifact/com.eed3si9n.jarjar/jarjar-assembly/1.13.1版本比较新,使用规则和较老的jarjar比较像,放心使用
    使用 java -jar jarjar-1.3.jar 可以查看帮助
houzw@DESKTOP-J9FIROU MINGW64 ~/Downloads/testtt
$ java -jar jarjar-1.3.jar
Jar Jar Links - 一个重新打包和嵌入Java库的工具
Copyright 2007 Google Inc.

命令行用法:

  java -jar jarjar.jar [help]

    打印此帮助消息。

  java -jar jarjar.jar strings <cp>

    转储类路径<cp>中的所有字符串字面值。如果类具有调试信息,则将包含行号。

  java -jar jarjar.jar find <level> <cp1> [<cp2>]

    打印类路径<cp1>中对类路径<cp2>的依赖项。如果省略<cp2>,则两个参数都使用<cp1>。

    level参数必须是"class""jar"。前者打印各个类之间的依赖关系,
	而后者仅打印 jar->jar 依赖关系。这里的"jar"实际上是任何类路径组件,
	可以是jar文件、zip文件或父目录(见下文)java -jar jarjar.jar process <rulesFile> <inJar> <outJar>

   转换jar文件,将新的jar文件写入。任何以。命名的现有文件将被删除。
   转换是由rules参数指定的文件中的一组规则定义的(见下文)。

类路径的格式:

  classpath参数是目录、jar文件或zip文件的冒号或分号分隔集(取决于平台)。有关更多详细信息,请参阅以下页面:
  http://java.sun.com/j2se/1.5.0/docs/tooldocs/solaris/classpath.html

  Mustang-style 通配符支持:
  http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6268383

规则文件格式:

  规则文件是一个文本文件,每行一个规则。前导和尾随空格将被忽略。有三种类型的规则:

    rule <pattern> <result>
    zap <pattern>
    keep <pattern>

  标准规则("rule")用于重命名类。所有对重命名类的引用也将被更新。
  如果一个类名与多个规则匹配,则只应用第一个规则。

  <pattern> 是带有可选通配符的类名。 "**" 将匹配任何有效的类名子字符串。为了匹配单个
包装组件(从匹配中排除"."), 可以使用单个"*"代替。

  <result> 是一个类名,它可以选择性地引用由通配符匹配的子字符串。对<pattern>中的每个"*""**"都有编号引用,从左到右:"@1", "@2",等。
  一个特殊的"@0"引用包含了整个匹配的类名。

  "zap" 规则将导致从生成的jar文件中删除任何匹配的类。在重命名规则之前处理所有zap规则。

  "keep" 规则将所有匹配的类标记为"roots"。如果定义了任何keep规则,那么在编写输出jar时,
  不能通过依赖分析从根目录访问的所有类都将被丢弃。这是重命名和删除之后的最后一步。

使用jarjar修改sdk和bcprov等jar

编写rule.txt

rule org.bouncycastle.** shade.bouncycastle.@1

替换 package 和 import

houzw@DESKTOP-J9FIROU MINGW64 ~/Downloads/testtt
$ java -jar jarjar-1.3.jar process rule.txt bcprov-jdk15to18-1.67.jar shade-bcprov-jdk15to18-1.67.jar
houzw@DESKTOP-J9FIROU MINGW64 ~/Downloads/testtt
$ java -jar jarjar-1.3.jar process rule.txt bcpkix-jdk15to18-1.67.jar shade-bcpkix-jdk15to18-1.67.jar
houzw@DESKTOP-J9FIROU MINGW64 ~/Downloads/testtt
$ java -jar jarjar-1.3.jar process rule.txt send-api-sdk-1.2.1.jar newsend-api-sdk-1.2.1.jar

最终反编译结果如下
bcprov-jdk15to18,笔记,jar,java,maven
bcprov-jdk15to18,笔记,jar,java,maven
可以发现对package,import 都进行了替换。将替换后的sdk和bcprov给替换到线上,原来冲突的jar给删除,服务正常,到此完结撒花~~

拓展:如果有个性化的修改也可以使用增量更新的方式(一般用不到,此处只是抛砖引玉)

注意:如果只是A.jar依赖B.jar 只是想 A和B的依赖绑定,使用上面的方法对 A.jar 和 B.jar 都修改就可以满足需求,下面的个性化修改场景是,不光对依赖有修改,其中的逻辑也有修改,可以利用 java 同包同名类覆盖的特性进行某个 class 重新编译。
替换原来sdk的jar中class调用替换包名后的加密JAR,具体可以移步《Java项目中 Jar 包增量更新办法,解压修改 Jar 包中的文件后重新打成 Jar 包》

houzw@DESKTOP-J9FIROU MINGW64 ~/Downloads
$ cd aaaaaaa/

houzw@DESKTOP-J9FIROU MINGW64 ~/Downloads/aaaaaaa
$ ll
total 60
-rw-r--r-- 1 houzw 197121 58060 Oct  7 17:29 send-api-sdk-1.2.1.jar

houzw@DESKTOP-J9FIROU MINGW64 ~/Downloads/aaaaaaa
$ jar -xvf send-api-sdk-1.2.1.jar
  ▒Ѵ▒▒▒: META-INF/
  ▒ѽ▒ѹ: META-INF/MANIFEST.MF
  .
  .
  .
houzw@DESKTOP-J9FIROU MINGW64 ~/Downloads/aaaaaaa
$ jar -uvf0 send-api-sdk-1.2.1.jar cn

保留替换的class,其他无关的文件都删除掉,执行 jar -uvf0 xxx.jar文件 文件夹使用文件夹jar文件进行增量更新。
更新完后反编译看一下,确实是调用新的方法。
bcprov-jdk15to18,笔记,jar,java,maven
将线上服务再次启动,就没有发现报错了,服务调用也正常。完事儿,撒花~~

总结

当有jar包冲突。且出现了既要又要的情况,需要兼容不同版本的jar,无论是maven方案还是自己修改jar 等都是规避jvm的双亲委派机制,层级越高的类加载器越先加载其加载路径下的类。如maven最短依赖路径、自己修改包名等。
所以当上述既要又要的情况,那就将按版本进行包名和import替换无疑是比较好的解决方法,只需要执行命令行一个全新的一套jar就完成了。jarjar.jar无疑也是首要选择

最后祝大家玩的开心!!!文章来源地址https://www.toymoban.com/news/detail-763059.html

到了这里,关于bcprov-jdk15to18和其他的bcprov版本jar包冲突(不同版本jar兼容)解决,与东方通bcprov-jdk15on.jar冲突解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Maven解决jar包版本冲突的4种方法

      先解释下maven的依赖传递:a jar包引入了b jar包,如果项目中引入了a jar包,其实也会把a依赖的b jar包引入。那现在有a、c这2个jar包,a jar包依赖的是1.0.0版本的b jar包,c jar包也依赖了b jar包,版本是2.0.0;如果项目中引入了a、c jar包,那b jar包到底引入哪个版本呢,是1.0.0还

    2024年02月15日
    浏览(38)
  • Maven第八章:如何解决Maven的jar版本冲突

    前言 本文重点讲解Maven依赖冲突原因,maven依赖原则以及如何利用idea Maven Helper插件分析解决问题。 背景 开发过程中引入第三方jar遇到依赖冲突的,非常影响开发,甚至大部分时间都在调试版本兼容。

    2024年02月06日
    浏览(43)
  • jdk版本冲突,java.lang.UnsupportedClassVersionError: JVMCFRE003

    主要是编辑器所用的jdk版本和项目用的不一致导致的,虽然编译通过了,但是运行是会报错 选好后点击Apply点击ok,然后重新编译一遍项目就可以了

    2024年04月26日
    浏览(38)
  • 【Android Studio插件升级以后kotlin jdk版本冲突】

    今天升级一些插件版本后无法编译,发现kotlin jdk 1.8.20和kotlin jdk 1.6.21重复冲突,网上找了挺多方法都没生效,千回百转才解决,发出来希望可以帮助到同样报错的同学 FAILURE: Build failed with an exception. What went wrong: Execution failed for task ‘:app:checkDebugDuplicateClasses’. A failure occurred while

    2024年02月12日
    浏览(83)
  • ubuntu18、20 cv_bridge 与自带opencv版本冲突问题

    背景: nvidia tx2、xvaier 装机自带 ubuntu18 + opencv4  后来我们会安装melodic的ros,ros中的cv_bridge 默认cv版本是3.2.0 编译带cv_bridge的代码时,会报错会崩溃,因为版本冲突了 为了解决该问题, 行之有效的一种解法是重新安装 cv_bridge,使其兼容opencv 4 安装cv_bridge with opencv4 1、git clo

    2024年02月07日
    浏览(47)
  • 【java】查看 Jar 包打包时的JDK版本

    查看 Jar 包编译时的JDK 版本 在 Java 中,jar 包是一种常用的打包和分发 Java 类的格式。如果你想查看一个 jar 包是使用哪个 JDK 版本编译的,可以执行以下步骤: 解压 jar 包。可以使用命令行工具或者压缩软件解压 jar 包到某个文件夹中。 在解压的文件夹中找到 META-INF/MANIFEST

    2024年02月07日
    浏览(37)
  • docker 构建指定版本的jdk容器,并用docker部署jar包

    有在Linux系统安装docker的经验, 会使用docker常用命令,能明白构建docker容器参数的含义 将如下内容拷贝 到 Dockerfile ,保存并退出。 我用的jdk安装包是 jdk-8u361-linux-aarch64.tar.gz ,你只需要修改它换成你的jdk安装包 用 docker build 完 jdk镜像 后,用命令 docker inspect 容器id | grep Arc

    2024年02月09日
    浏览(48)
  • JDK 9 模块化系统 (Module System) 和 多版本兼容 Jar (Multi-Release Jar)

    博文目录 Java 9引入了模块化系统的主要原因是为了解决Java平台面临的复杂性和可维护性方面的挑战。以下是一些采用模块化系统的主要原因: 更好的代码组织:传统的Java应用程序通常由大量的JAR文件组成,这些JAR文件之间的依赖关系可能变得非常复杂。模块化系统允许开发

    2024年02月04日
    浏览(46)
  • 如何在Android studio导入jdk9及以上版本中依赖包,如'rt.jar',' dt.jar'等

    1、如何获取jdk9及以上版本中依赖包,如\\\'rt.jar\\\',\\\' dt.jar\\\'等 ​在jdk9及后续版本中,jdk开始使用模块化规则,实现更好的封装和定义良好的接口,近一步加强了java的自由度,开发者可以定制化SDK ​包括rt.jar在内的依赖均已移除,以模块化形式更高效的存诸在 JAVA_HOME/jmods 目录下

    2023年04月25日
    浏览(51)
  • IDEA报错:Error:Cannot determine path to ‘tools.jar‘ library for 17.0.2 (D:/Java/java-jdk/jdk-17.0.2)

    一、前言:由于发布了JDK17版本,有点好奇,想看看怎么样,结果在IDEA中报错了。报错信息:Error:Cannot determine path to \\\'tools.jar\\\' library for 17.0.2 (D:/Java/java-jdk/jdk-17.0.2)。图示如下:  二、报错原因: 我使用的是IDEA  2020.1.2版本,由于版本原因,IDEA  2020.1.2版本不支持JDK17,JDK版本

    2024年02月08日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包