Bouncycastle依赖冲突

时间:2018-10-31 12:39:12

标签: java spring-boot itext bouncycastle

我有一个使用Spring Boot创建的Web应用程序。我添加了碧玉报告,iText和bouncycastle maven依赖项。 Jasper和iText都包含bouncycastle库,因此,该Web应用程序无法正常工作。

错误是:java.security.NoSuchProviderException:JCE无法认证提供者BC。请注意,我已经添加了以下代码: Security.addProvider(new BouncyCastleProvider());

这在使用Spring Boot嵌入式tomcat时非常有效,但在导出到在wildfly服务器上运行的war文件时却无法使用。

这是我声明pom的方式。

<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcpkix-jdk15on</artifactId>
    <version>1.58</version>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13</version>
</dependency>
<dependency>
    <groupId>net.sf.jasperreports</groupId>
    <artifactId>jasperreports</artifactId>
    <version>6.4.0</version>
    <exclusions>
        <exclusion>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk14</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcmail-jdk14</artifactId>
        </exclusion>
    </exclusions>
</dependency>

创建战争文件后,这是包含的库的列表:

  • bcmail-jdk14-138
  • bcprov-jdk14-138

bcpkix-jdk15on并未包含在内,即使我按提供的方式指定了

1 个答案:

答案 0 :(得分:1)

直接引用Maven docs

  

提供

     

这很像编译,但是表明您希望JDK或容器在运行时提供依赖项。例如,在为Java Enterprise Edition构建Web应用程序时,您将对Servlet API和相关Java EE API的依赖关系设置为提供的范围,因为Web容器提供了这些类。此作用域仅在编译和测试类路径上可用,并且不可传递。

换句话说,它使用标记为“已提供”的.jar来编译(和测试)您的软件,但是当打包时,它将不包含在.war中:您期望运行时系统提供这些类的(可能不同)版本。

尝试删除将依赖项的范围更改为“编译”,以查看是否可以解决您的问题。