因为自己本身是做互联网金融业务,平时会对接比较多的银行,最近对接的一家给的加解密包,版本比较低导致在现有项目中不能使用,bcprov-jdk16-1.46.jar (12年的包),直接在现有项目中引入的话,直接报错。

Exception in thread "main" java.lang.IllegalAccessError: tried to access method
 org.bouncycastle.math.ec.ECPoint$Fp.<init>(Lorg/bouncycastle/math/ec/ECCurve;Lorg/bouncycastle/math/ec/ECFieldElement;
 Lorg/bouncycastle/math/ec/ECFieldElement;)V from class SM2Utils.SM2 at SM2Utils.
 SM2.<init>(SM2.java:51) at SM2Utils.SM2.Instance(SM2.java:36) at 
 SM2Utils.SM2SignUtils.sign(SM2SignUtils.java:120) at EncryptUtils.EncryptUtils.encryptText(EncryptUtils.java:22) at 

大概错误信息如下 非法的访问错误,尝试访问xxx.下的方法,失败了,仔细想下为什么,看了源码之后才发现原来项目中依赖传递直接使用的是高版本的bcprov包,所以导致低版本的jar不会被引入到其中。具体原因就是同一个jar中出现,包名+类名 在类加载的时候,因为双亲委派机制只会加载一次,而加载进来的正好是高版的的jar,并且高版本中不兼容低版本所以问题就出现。

画一个图如下,

解决方案1(尝试不同版本的jar)

所以可以看出来,解决办法,刚开始的时候是想办法通过bcprov包其他版本看是否可以兼容低版本的bcprov-jdk16-1.46版本。发现基本上都试了一下。都不可以使用。

解决方案2(手动升级jar)

https://qxlxi.blog.csdn.net/article/details/122419383
然后在同事的提示下说可以尝试将资方给的加解密包进行手动升级,新建一个项目,然后把依赖的bcprov-jdk16-1.46升级到bcprov-jdk15to18-1.68 版本,然后重新升级之后发现,加解密是没有问题的,验签的话出现问题,不能使用

解决方案3 (maven-shade-plugin)

既然重写资方的jar不能使用,那么有没有高低版本可以在项目中直接使用的相关配置呢,于是查到有这种方式。

https://segmentfault.com/a/1190000038382111 具体可以文章。

相关配置如下

<plugin>
      <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-shade-plugin</artifactId>
			 <version>3.2.1</version>
			 <configuration>
			 <createDependencyReducedPom>false</createDependencyReducedPom>
			 </configuration>
			 <executions>
				 <execution>
					 <!-- Maven 的生命周期 -->
					 <phase>package</phase>
					 <goals>
					 <!-- 插件目标 -->
					 <goal>shade</goal>
					 </goals>
		    <configuration>
				<!-- <minimizeJar>true</minimizeJar>-->
				 <!-- 配置多版本 jar 包中类路径的重命名
			 <relocations>
				 <relocation>
					 <pattern>org.bouncycastle</pattern>
					 <shadedPattern>org.new.bouncycastle</shadedPattern>
				 </relocation>
			 </relocations>
			 <filters>
				 <filter>
					 <artifact>*:*</artifact>
				 <excludes>
				 <exclude>META-INF/*.SF</exclude>
				 <exclude>META-INF/*.DSA</exclude>
				 <exclude>META-INF/*.RSA</exclude>
				 </excludes>
				 </filter>
				 </filters>
 				</configuration>
		 </execution>
		</executions>
 </plugin>
 配置如何设置为true的话,在maven私服不能打包。需要删除。 
<dependency>-->
	<groupId>commons-codec</groupId>
	<artifactId>commons-codec</artifactId>
    <version>1.7</version>
    </dependency>
<dependency>
  <groupId>commons-httpclient</groupId>
  <artifactId>commons-httpclient</artifactId>
  <version>3.0.1</version>
  </dependency>

jar中还包含其他的包,直接打入项目中,发现对一些类会有冲突,还是因为类加载机制的原因,只会加载一个类。所以删除无用的包

重新打包,发现可以在测试环境和本地可以使用。

1.遇到问题不能慌张,需要慢慢分析出问题的来龙去脉,找到具体的原因。

2.jar冲突的问题,a.我们可以直接使用maven-helper进行直接jar冲突解决,但是对于高低版本不兼容的情况下,需要使用maven的插件进行解决。

具体的使用,https://maven.apache.org/plugins/maven-shade-plugin/shade-mojo.html

https://blog.csdn.net/yangguosb/article/details/80619481

1.https://blog.csdn.net/yangguosb/article/details/80619481
2.https://www.playpi.org/2019120101.html
3.https://maven.apache.org/plugins/maven-shade-plugin/
4.https://xie.infoq.cn/article/5a18670154051e26591e2090f

既然通过重命名jar包可以同一个项目中加载相同的jar不同版本,具体是什么原理呢,将打的包进行javap -c 看到后就恍然大雾。
在这里插入图片描述
原来,在生成的.class字节码文件中编译,构建包的时候替换成了新的包名,所以记载的时候相同jar不同版本就可以加载了。比较神奇,牛。

背景概述因为自己本身是做互联网金融业务,平时会对接比较多的银行,最近对接的一家给的加解密包,版本比较低导致在现有项目中不能使用,bcprov-jdk16-1.46.jar (12年的包),直接在现有项目中引入的话,直接报错。Exception in thread "main" java.lang.IllegalAccessError: tried to access method org.bouncycastle.math.ec.ECPoint$Fp.&lt;init&gt;(Lorg/bouncyc
bcprov-jdk15on 简介、中文文档、中英对照文档 下载;bcprov-jdk15on、org.bouncycastle、中文文档、中英对照文档、下载、jar、原API文档、源代码、Maven依赖信息文件、翻译后的API文档、jdk15on、bouncycastle、bcprovjarjava、中英对照文档;bcprov-jdk15on-1.68.jarbcprov-jdk15on-1.60.jarbcprov-jdk15on-1.59.jarbcprov-jdk15on-1.58
关于java的国密算法原理以及sm2、sm3、sm4的演示demo,很多博主都写过。但是如果说自身项目中用到的bcprov这个依赖jar版本,和别人博客里演示的不一样,或者说引用了多个版本bcprovjar,这种情况怎么办呢?一般有两个方案,第一个是直接全部白嫖别人的版本,这种方案不是本文所讲内容。另一种方案就是弄明白每个版本依赖的区别,这样我们的项目就可以只保留一个版本的依赖了,而且想要留哪一个版本也不在话下。重要说明: 在看代码前我做一些说明,bcprov这个在高版本中增加了一些国密相关的
今天在迁移一个项目,结果成功启动,但是在登录的时候,提示如下错误!翻译发现是因为签名不匹配。百度说是因为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 原来这个res
注:下文中的 *** 代表文件名中的版本号。 # 【bcprov-jdk15on-***.jar中文文档.zip】 中含: 中文文档:【bcprov-jdk15on-***-javadoc-API文档-中文(简体)版.zip】 jar下载地址:【bcprov-jdk15on-***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【bcprov-jdk15on-***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【bcprov-jdk15on-***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【bcprov-jdk15on-***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: bcprov-jdk15on-***.jar中文文档.zip,java,bcprov-jdk15on-***.jar,org.bouncycastle,bcprov-jdk15on,***,jar,Maven,第三方jar,组件,开源组件,第三方组件,Gradle,bouncycastle,bcprov,jdk15on,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【bcprov-jdk15on-***.jar中文文档.zip】,再解压其中的 【bcprov-jdk15on-***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件; # Maven依赖: <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>***</version> </dependency> # Gradle依赖: Gradle: implementation group: 'org.bouncycastle', name: 'bcprov-jdk15on', version: '***' Gradle (Short): implementation 'org.bouncycastle:bcprov-jdk15on:***' Gradle (Kotlin): implementation("org.bouncycastle:bcprov-jdk15on:***") # 含有的 Java package()(此处仅列举3个): org.bouncycastle org.bouncycastle.asn1 org.bouncycastle.asn1.anssi ...... # 含有的 Java class(类)(此处仅列举3个): org.bouncycastle.LICENSE org.bouncycastle.asn1.ASN1ApplicationSpecific org.bouncycastle.asn1.ASN1ApplicationSpecificParser ...... public void test(){ String str = "adf4976d917a07e0513dce45b6981919"; String miwei = "{\"你好\":\"2020\"}"; String abc = ""; byte[] cipherText = null; byte[] decr
问题源: 错误一:jboss java.lang.SecurityException: JCE cannot authenticate the provider BC 错误二:java.lang.NoClassDefFoundError: org/bouncycastle/jce/provider/BouncyCastleProvider 工作环境中,调用了【bcprov-jdk1
bcprov-jdk16java安全加密库Bouncy Castle的一个版本,noclassfound则说明在使用该库时未找到相应的类。 出现这样的错误可能有以下几个原因: 1. 或类名错误:在引用bcprov-jdk16时,可能出现名或类名错误的情况。需要检查相关引用的名和类名是否正确。 2. 缺失依赖库:bcprov-jdk16是一个开源的库,它可能依赖于其他的库。如果缺少相关依赖库,则会出现noclassfound错误。 3. 版本兼容:有时,bcprov-jdk16版本与项目中其他的库版本兼容。这时需要确认bcprov-jdk16版本是否正确,并检查是否有其他库版本冲突问题。 4. 缺失jarbcprov-jdk16需要将相应的jar加入到项目中才能使用。如果缺失相应的jar,则会出现noclassfound错误。 解决noclassfound错误的方法可以是: 1. 检查名和类名是否正确引用。 2. 确认相关依赖库是否已经安装或者已经被加载。 3. 确认版本是否与其他的库兼容,并解决版本冲突问题。 4. 将相应的jar加入到项目中。 最后,noclassfound是常见的错误之一,在遇到时需要有耐心,仔细排查问题,解决相应的错误。
CSDN-Ada助手: 真诚夸赞:热烈欢迎您的文章,经过您的努力与用心,这篇关于分布式系统架构的博客给我们带来了更全面的视野。您将复杂的主题阐述得相当清晰易懂,使我们不仅受益匪浅,还激发了我们对分布式系统架构理解的探索热情。感谢您的分享,我们期待您的下一篇文章。 下一篇可能创作的博客标题:分布式系统数据传输的瓶颈和优化策略 【分布式系统】分布式锁实现之Redis CSDN-Ada助手: 恭喜你这篇博客进入【CSDN月度精选】榜单,全部的排名请看 https://bbs.csdn.net/topics/615647796。 【分布式系统】分布式锁实现之Redis CSDN-Ada助手: 恭喜你这篇博客进入【CSDN每天值得看】榜单,全部的排名请看 https://bbs.csdn.net/topics/615470767。