排除 BouncyCastle jar,但将所有其他内容包含在 fat jar 中

Exclude BouncyCastle jar but include everything else in a fat jar

因为 BouncyCastle jar 已签名并且在 maven-assembly-plugin 中使用 jar-with-dependencies 会破坏这些签名,我想知道是否可以创建这种输出:

我设法使用如下所示的程序集文件排除了我的 fat jar 中的 BC jar :

<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>jar-with-dependencies</id>
<formats>
    <format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
    <dependencySet>
        <outputDirectory>/</outputDirectory>
        <unpack>true</unpack>
        <excludes>
            <exclude>org.bouncycastle:bcprov-jdk15on</exclude>
        </excludes>
    </dependencySet>
</dependencySets>

现在,我如何告诉 maven-assembly-plugin 将 BC jar 作为独立 jar 放在 lib/ 文件夹中,但仍然在清单文件中引用它?

此致。

编辑: 我尝试执行以下操作(没有我想要的那么干净,但如果可行,就足够了):

我从程序集中排除了 BC jar,并在 maven-assembly-plugin 的 maven archiver 部分添加了自定义 class-path 注入:

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.1.0</version>
            <configuration>
                <appendAssemblyId>false</appendAssemblyId>
                <descriptors>
                    <descriptor>src/main/assembly/jar.xml</descriptor>
                </descriptors>
                <archive>
                    <manifest>
                        <mainClass>${mainClass}</mainClass>
                        <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                    </manifest>
                    <manifestEntries>
                        <Class-Path>lib/bcprov-jdk15on.jar</Class-Path>
                    </manifestEntries>
                </archive>
                <outputDirectory>${staging.dir}</outputDirectory>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

清单文件已按预期修改:

Manifest-Version: 1.0
Implementation-Title: MyCode
Implementation-Version: 2.0.27.3
Built-By: ixo
Implementation-Vendor-Id: my.package
Class-Path: lib/bcprov-jdk15on.jar
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_144
Implementation-Vendor: foo
Main-Class: my.package.Main

但是jvm好像没有考虑class路径入口,我不明白为什么

编辑 2: 好的,我找到了为什么之前的编辑不起作用,maven-assembly-plugin 生成 index.list 文件,如果这个文件存在,它被用来代替 manifest.mf,因为我添加了 BC jar 通过覆盖 maven-archiver 部分中的 class 路径,那么 index.list 是错误的。如果使用 fat jar 生成,禁用索引不起作用。

好的,这是我真正肮脏的解决方案,我对此并不感到自豪,如果有人可以 post 更好的解决方案,我会很乐意为他的解决方案投赞成票。

下面是用 BC jar(s) 在外面制作一个胖罐子的步骤:

  1. 创建一个排除您想要的任何 BC 依赖项的程序集文件<exclude>org.bouncycastle:bcprov-jdk15on</exclude>
  2. 使用 maven archiver 在 manifest.mf 文件中附加自定义 class-path 条目 <manifestEntries><Class-Path>lib/bcprov-jdk15on-1.57.jar</Class-Path></manifestEntries>
  3. 使用 truezip-maven-plugin 从 fat jar 中删除 index.list 文件

完成了。