一、概述

本人在研究java最新的算法,要用到新版本的bouncycastle,项目中已有的功能依赖不少jar包,搞不清他们是怎么依赖bouncycastle

二、开发平台

操作系统:windows10
eclipse:版本2021-06 (4.20.0)
JDK:版本1.8

三、问题

pom.xml如下添加依赖

<dependency>
	    <groupId>org.bouncycastle</groupId>
	    <artifactId>bcprov-jdk18on</artifactId>
	    <version>1.83</version>
	</dependency>
	<dependency>
	    <groupId>org.bouncycastle</groupId>
	    <artifactId>bcpkix-jdk18on</artifactId>
	    <version>1.83</version>
	</dependency>
	<dependency>
	    <groupId>org.bouncycastle</groupId>
	    <artifactId>bcmls-jdk18on</artifactId>
	    <version>1.83</version>
	</dependency>
	<dependency>
	    <groupId>org.bouncycastle</groupId>
	    <artifactId>bcutil-jdk18on</artifactId>
	    <version>1.83</version>
	</dependency>

编译没问题但运行报错:
Exception in thread “main” java.lang.SecurityException: class “org.bouncycastle.pqc.jcajce.provider.Rainbow$Mappings”'s signer information does not match signer information of other classes in the same package
如下图:

在这里插入图片描述

四、分析

1、通过大量网上查阅这个错误,和下面的一系列操作,确定是bouncycastle版本冲突问题
2、在工程的Maven Dependencies里面确实能看到同时依赖两个不同版本的bouncycastle(1.83和1.68),直接删不掉的,如下图
在这里插入图片描述
3、查看自动下载保存的jar包,默认保存在目录:C:\Users\Administrator.m2\repository\org\bouncycastle,可以看到有两个包是另外的版本的,即使删了之后重新生成还是这样,如下图:
在这里插入图片描述

4、我在pom.xml并没有配置1.68版本的bouncycastle,但是从上面几部操作查看实际上依赖了1.68版本的bouncycastle,这说明是其他包间接依赖了1.68版本的bouncycastle。

本问题解决的核心,找到哪个jar包依赖1.68版本的bouncycastle,并排除掉这个1.68版本依赖,让它依赖新的1.83版本。

五、查找依赖

AI搜索,用这个命令可以实现

mvn dependency:tree

接下来问题是怎么在eclipse上面执行这个命令,项目右键菜单,Run As->Maven build…如下图
在这里插入图片描述

弹出的对话框,Goals这个编辑框填:dependency:tree
然后点击Run按钮,如下图:
在这里插入图片描述

输出一大堆,包含各种依赖关系,如下图:
在这里插入图片描述

在里面搜索bouncycastle,本人复制出来用notepad–搜索,注意到1.68版本的地方,如下:
在这里插入图片描述

可以看出来,poi-ooxml-5.0.0.jar依赖bouncycastle 1.68版本

四、问题解决

在pom.xml找到如下依赖配置

<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi-ooxml</artifactId>
  <version>5.0.0</version>
</dependency>

将bouncycastle 1.68版本的模块依赖排除掉,改为如下

<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi-ooxml</artifactId>
  <version>5.0.0</version>
  <exclusions>
	<exclusion>
		<groupId>org.bouncycastle</groupId>
		<artifactId>bcprov-jdk15on</artifactId>
	</exclusion>
	<exclusion>
		<groupId>org.bouncycastle</groupId>
		<artifactId>bcpkix-jdk15on</artifactId>
	</exclusion>
  </exclusions>
</dependency>

将项目生成目标文件的文件夹target删除,重新生成一下就好了。

五、小结

本文首先确定是bouncycastle版本冲突,然后通过命令查看依赖关系,对依赖低版本的包排除掉,从而解决问题。
如果这一步还是没有解决,还有一种方法就是把新版本bouncycastle包重命名,在我的工程里面需要修改的太多,已经解决就不继续这样做了。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐