我如何判断哪个签名jar导致maven shade插件失败?

我如何判断哪个签名jar导致maven shade插件失败?,maven,maven-3,manifest.mf,jar-signing,maven-shade-plugin,Maven,Maven 3,Manifest.mf,Jar Signing,Maven Shade Plugin,要运行maven shade插件,我必须使用由于签名依赖关系而描述的方法,如下所示: <plugin> <artifactId>maven-shade-plugin</artifactId> <executions> <execution> <phase>package</phase> <goals><goal>

要运行maven shade插件,我必须使用由于签名依赖关系而描述的方法,如下所示:

<plugin>
    <artifactId>maven-shade-plugin</artifactId>
    <executions>
        <execution>
            <phase>package</phase>
            <goals><goal>shade</goal></goals>
            <configuration>
                <filters>
                    <filter>
                        <!-- filter out signature files from signed dependencies, else repackaging fails with security ex -->
                        <artifact>*:*</artifact>
                        <excludes>
                            <exclude>META-INF/*.SF</exclude>
                            <exclude>META-INF/*.DSA</exclude>
                            <exclude>META-INF/*.RSA</exclude>
                        </excludes>
                    </filter>
                </filters>
            </configuration>
        </execution>
    </executions>
</plugin>

shade插件正在为包含的依赖项解包所有jar,并将其内容填充到单个jar文件中。有点像是你自己写的

配置告诉shade插件不要移动任何以.SF、.DSA或.RSA结尾的文件,如果它们包含在名为META-INF的目录中

所以你需要做的就是找出哪个jar有这些文件


我要做的第一件事是注释掉过滤器部分并重新构建。然后为这些扩展grep你的着色jar。它可能会给你一个包裹的线索

jar命令上的-t选项将列出归档文件中的所有文件,而不提取它们。一般来说,jar语法与tar非常相似

jar -tvf target/myapp-1.0.3-SNAPSHOT.jar | grep -i dsa

META-INF/BCKEY.DSA
就我而言,这是很明显的。我最近添加了Bouncy Castle作为附属项。DSA看起来可能是有弹性的城堡钥匙

为了确认我刚刚在bouncy castle罐子上执行了相同的操作。因为我是用maven构建的,所以jar在我的本地存储库中:

tar -tvf .m2/repository/org/bouncycastle/bcprov-jdk15on/1.48/bcprov-jdk15on-1.48.jar | grep -i dsa
-rwxrwxrwx  0 0      0           0 Feb  9  2013 META-INF/BCKEY.DSA

要获得Maven和bash+awk+sed的签名JAR列表,可以尝试以下方法:

#!/bin/bash
mvn_classpath=`mvn dependency:build-classpath -B | awk '/Dependencies classpath:/{getline; print}' | sed -e s/:/\\\\n/g`

for jar in $mvn_classpath; do 
        echo -n `jarsigner -verify $jar | grep verified | wc -l`; echo " $jar"; 
done

这将列出您的项目使用的JAR文件-那些经过签名和验证的文件前面是1,未签名的文件前面是0。我没有无法验证的签名JAR,因此我不确定在这种情况下逻辑应该是什么样子。

您是否尝试使用-X选项构建?是;这就是产生调试输出的原因,如图所示。“然后为这些扩展grep你的着色jar。这可能会给你一个关于包的线索。”。。。不幸的是,这里的名称是完全空的-着色的jar是空的,无论过滤器部分是否处于活动状态都没有区别。未隐藏的jar不包含任何签名文件。除此之外,这个答案让我不知道如何纠正这个问题。
#!/bin/bash
mvn_classpath=`mvn dependency:build-classpath -B | awk '/Dependencies classpath:/{getline; print}' | sed -e s/:/\\\\n/g`

for jar in $mvn_classpath; do 
        echo -n `jarsigner -verify $jar | grep verified | wc -l`; echo " $jar"; 
done