使用Maven Shade插件创建依赖文件夹和相关的jar包

5
我正在使用Maven Shade插件创建一个fat jar,其中包括一些Bouncy Castle的jar包。但是这会因为Bouncy Castle的未签名版本而产生问题。
java.lang.SecurityException: JCE无法验证提供者BC
现在解决方案之一是拥有外部依赖文件夹,并在fat jar的清单文件中定义此类路径。
例如:
<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.3</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                            <artifactSet>
                                <excludes>
                                    <exclude>org.bouncycastle:*:*:*</exclude>
                                </excludes>
                            </artifactSet>
                        <finalName>Relay-S3-Monitor-jar-with-dependencies</finalName>
                        <filters>
                            <filter>
                                <artifact>*:*</artifact>
                                <excludes>
                                    <exclude>META-INF/*.SF</exclude>
                                    <exclude>META-INF/*.DSA</exclude>
                                    <exclude>META-INF/*.RSA</exclude>
                                </excludes>
                            </filter>
                        </filters>
                        <transformers>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>at.seresunit.lecturemanager_connector.App</mainClass>
                            </transformer>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/spring.handlers</resource>
                            </transformer>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/spring.schemas</resource>
                            </transformer>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                 <manifestEntries>
                                    <Main-Class>com.pb.relay.s3.CamelBoot</Main-Class>
                                    <Class-Path>. bouncycastle_libs/bcpg-jdk15on-1.55.jar bouncycastle_libs/bcprov-jdk15on-1.55.jar bouncycastle_libs/bcprov-jdk16-1.45.jar</Class-Path>
                                </manifestEntries>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin

现在我需要的是:在同一个pom.xml文件中,我需要插入一个部分(插件),该插件将创建一个依赖文件夹(仅包含Bouncy Castle jar文件)。
3个回答

1

当我编译一个依赖于BouncyCastle的Uber Jar时,我看到了相同的错误:

Exception in thread "main" java.security.NoSuchProviderException: JCE cannot authenticate the provider BC

我知道在你的情况下,将jar导出到单独的目录是可行的,但对于那些想使用单个jar的人来说,问题在于Maven的shade插件会解压缩jar文件,从而破坏了加密签名(有关详细信息,请参见此说明)。
相反,您可以使用可执行打包器Maven插件解决方案,该方案采用jar-in-jar方法,在一个可执行的jar中保留JCE的签名。

1
如果您正在寻找一种无需解压缩库,但具有特殊的JAR类加载器的Fat JAR解决方案,请查看我的项目
免责声明:我没有编写代码,只是将其打包并发布到Maven Central,并在自己的read-me中描述如何使用它。
我个人使用它来创建可运行的超级JAR,其中包含BouncyCastle依赖项。也许对您也有用。

1

这真是救了一天 :) - ademg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接