我如何判断哪个签名jar导致maven shade插件失败?
要运行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>
<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