使用Maven Shade插件创建具有Dependent jar的依赖项文件夹

时间:2017-04-04 07:46:25

标签: maven bouncycastle maven-shade-plugin

我正在使用maven shade插件创建一个胖罐,其中包括一些充气城堡罐。但是由于Bouncy Castle的未签名版本,这就产生了问题。

java.lang.SecurityException:JCE无法验证提供程序BC

现在解决方法之一是拥有依赖项的外部文件夹,并在fat jar的manifest文件中定义此类路径。

例如:

<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中,我需要插入一个创建依赖文件夹的部分(插件)(只有充气城堡jar)

3 个答案:

答案 0 :(得分:1)

使用依赖项插件,您可以调用dependency:copy将依赖项复制到文件夹

https://maven.apache.org/plugins/maven-dependency-plugin/copy-mojo.html

答案 1 :(得分:1)

在编译依赖BouncyCastle的超级jar时我看到同样的错误:

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

我意识到在你的情况下你很善于将jar导出到一个单独的目录,但对于那些对单个jar感兴趣的人来说,问题是Maven的shade插件会破坏破坏加密签名的jar文件(this explanation详情)。

您可以使用executable packer maven plugin solution使用jar-in-jar方法,该方法在单个可执行jar中保留JCE的签名。

答案 2 :(得分:0)

如果您正在寻找不解压缩库而使​​用特殊的JAR类加载器的Fat JAR解决方案,请查看my project here

免责声明:我没有编写代码,只是打包并将其发布在Maven Central上,并在我的自述文件中描述了如何使用它。

我个人使用它来创建包含BouncyCastle依赖项的可运行uber JAR。也许对您也有用。