如何判断哪个签名的 jar 导致 maven-shade-plugin 失败?
Posted
技术标签:
【中文标题】如何判断哪个签名的 jar 导致 maven-shade-plugin 失败?【英文标题】:How can I tell which signed jar is causing maven-shade-plugin to fail? 【发布时间】:2015-07-23 19:24:46 【问题描述】:要运行 maven-shade-plugin,我必须使用 here 描述的方法,因为签名依赖项,如下所示:
<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>
问题:我如何知道 是哪个 JAR 导致插件失败?它似乎不是最近提到的。
调试输出的尾部:
[DEBUG] We have a duplicate org/jdom2/xpath/util/AbstractXPathCompiled.class in C:\Users\me\aaaa-1.11.0-SNAPSHOT.jar
[DEBUG] We have a duplicate org/jdom2/xpath/util/XPathDiagnosticImpl.class in C:\Users\me\aaaa-1.11.0-SNAPSHOT.jar
[DEBUG] Processing JAR C:\Users\me\bbbb-1.11.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] Retrievers JAR ................................ FAILURE [ 9.581 s]
[INFO] Retrievers .................................... SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 10.208 s
[INFO] Finished at: 2015-05-12T14:20:54-05:00
[INFO] Final Memory: 100M/726M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-shade-plugin:2.3:shade (default) on project aaa-retrievers-jar: Error creating shaded jar: Invalid signature file digest for Manifest main attributes -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-shade-plugin:2.3:shade (default) on project aaa-retrievers-jar: Error creating shaded jar: Invalid signature file digest for Manifest main attributes
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:216)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:108)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:76)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:116)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:361)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:155)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:584)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:213)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:157)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
Caused by: org.apache.maven.plugin.MojoExecutionException: Error creating shaded jar: Invalid signature file digest for Manifest main attributes
at org.apache.maven.plugins.shade.mojo.ShadeMojo.execute(ShadeMojo.java:566)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:133)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
... 19 more
Caused by: java.lang.SecurityException: Invalid signature file digest for Manifest main attributes
at sun.security.util.SignatureFileVerifier.processImpl(SignatureFileVerifier.java:284)
at sun.security.util.SignatureFileVerifier.process(SignatureFileVerifier.java:238)
at java.util.jar.JarVerifier.processEntry(JarVerifier.java:316)
at java.util.jar.JarVerifier.update(JarVerifier.java:228)
at java.util.jar.JarFile.initializeVerifier(JarFile.java:383)
at java.util.jar.JarFile.getInputStream(JarFile.java:450)
at org.apache.maven.plugins.shade.DefaultShader.shade(DefaultShader.java:147)
at org.apache.maven.plugins.shade.mojo.ShadeMojo.execute(ShadeMojo.java:471)
... 21 more
[ERROR]
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
【问题讨论】:
您是否尝试使用 -X 选项进行构建? 是的;这就是产生显示的调试输出的原因。 【参考方案1】: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 作为依赖项。 BCKEY.DSA 看起来可能是充气城堡钥匙。
为了确认我刚刚对充气城堡罐执行了相同的操作。由于我使用 maven 构建了这个 jar,因此该 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
【讨论】:
“然后用 grep 查找那些扩展的阴影 jar。它可能会给你一个包的线索。” ...不幸的是,它完全是空的 这里相同 - 阴影罐是空的,过滤器部分是否处于活动状态没有区别。无阴影的 jar 不包含任何签名文件。除此之外,这个答案让我不知道如何解决这个问题。【参考方案2】:要使用 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,所以我不确定如何这种情况下的逻辑应该是这样的。
【讨论】:
以上是关于如何判断哪个签名的 jar 导致 maven-shade-plugin 失败?的主要内容,如果未能解决你的问题,请参考以下文章
关于Maven中引用的jar的version配置为版本区间自动使用最新的版本,maven是如何判断哪个版本更加新?
关于Maven中引用的jar的version配置为版本区间自动使用最新的版本,maven是如何判断哪个版本更加新?
Java:知道一个类的路径,如何知道这个类是来自哪个Jar包呢