【问题标题】:Invalid signature file digest for Manifest main attributes exception while trying to run jar file尝试运行 jar 文件时 Manifest 主要属性异常的签名文件摘要无效
【发布时间】:2016-04-23 16:16:58
【问题描述】:

我正在尝试运行我的项目的 jar 文件。我正在研究 intelliJ 并使用工件来生成 jar 文件。但是每次我尝试运行我的 jar 文件时,它都会给我异常。

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 sun.misc.JarIndex.getJarIndex(JarIndex.java:137)
    at sun.misc.URLClassPath$JarLoader$1.run(URLClassPath.java:839)
    at sun.misc.URLClassPath$JarLoader$1.run(URLClassPath.java:831)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.misc.URLClassPath$JarLoader.ensureOpen(URLClassPath.java:830)
    at sun.misc.URLClassPath$JarLoader.<init>(URLClassPath.java:803)
    at sun.misc.URLClassPath$3.run(URLClassPath.java:530)
    at sun.misc.URLClassPath$3.run(URLClassPath.java:520)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.misc.URLClassPath.getLoader(URLClassPath.java:519)
    at sun.misc.URLClassPath.getLoader(URLClassPath.java:492)
    at sun.misc.URLClassPath.getNextLoader(URLClassPath.java:457)
    at sun.misc.URLClassPath.getResource(URLClassPath.java:211)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:365)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" 

这是我的清单文件:

Manifest-Version: 1.0
Main-Class: Main

然后将外部库添加到我的项目中

我做错了什么??

更新

【问题讨论】:

  • 您的 JAR 的内容是什么,您能打开 JAR 并发布其内容的屏幕截图吗??
  • 我已经更新了这个问题....检查一下@hagrawal
  • @Fay007 你好!有没有找到解决办法,我也遇到了同样的问题,找了好久也没找到好的解决办法。谢谢!
  • 有点晚了,但我会评论:您的依赖项至少包含一个签名的 jar。您不应按照此处的说明提取依赖项:stackoverflow.com/questions/41746177/…

标签: java intellij-idea jar


【解决方案1】:

您的某些依赖项 JAR 是已签名的 JAR,因此当您将所有 JAR 合并到一个 JAR 并运行该 JAR 时,已签名 JAR 的签名不匹配,因此您会收到有关签名不匹配的安全异常。

要解决此问题,您需要首先确定哪些依赖项 JAR 是已签名的 JAR,然后排除它们。根据您使用的是 MAVEN 还是 ANT,您必须采取适当的解决方案。以下是hereherehere 的更多内容。

Maven:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.6</version>
    <executions>
        <execution>
            <id>unpack-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>unpack-dependencies</goal>
            </goals>
            <configuration>
                <excludeScope>system</excludeScope>
                <excludes>META-INF/*.SF,META-INF/*.DSA,META-INF/*.RSA</excludes>
                <excludeGroupIds>junit,org.mockito,org.hamcrest</excludeGroupIds>
                <outputDirectory>${project.build.directory}/classes</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

蚂蚁:

<jar destfile="app.jar" basedir="${classes.dir}">
    <zipfileset excludes="META-INF/**/*" src="${lib.dir}/bcprov-jdk16-145.jar"></zipfileset>
    <manifest>
        <attribute name="Main-Class" value="app.Main"/>
    </manifest>
</jar>

根据 OP 的评论更新:

“sqljdbc4.jar”是 OP 外部库中的签名 JAR。因此,按照上述方法系统地排除 .SF、.RSA 或 .DES 等签名相关文件或其他算法文件是前进的正确方法。

如果不排除这些签名文件,则会因为签名不匹配而出现安全异常。

如何知道 JAR 是否已签名?:如果 JAR 包含 .SF、.RSA 或 .DES 等文件或其他算法文件,则它是已签名的 JAR。或者运行jarsigner -verify jarname.jar,看看它是否输出“已验证”

【讨论】:

  • 我在我的项目中没有看到类似的文件
  • 这似乎是最有用的答案/建议
  • 我正在使用 Maven,但这并没有解决它,是否有任何新的解决方案。 @hagrawal?
  • 指定多个排除项的正确方法应该是用逗号分隔的列表,如下所示:“META-INF/*.SF,META-INF/*.DSA,META-INF/ *.RSA";否则只会排除最后一个
  • 使用dependency-plugin对我没有帮助,但过滤器也可以在shade-pluginstackoverflow.com/questions/64063528/…中配置
【解决方案2】:

就我而言,我正在通过 maven-shade-plugin 使用 uber-jar,@ruhsuzbaykus 回答 here 是解决方案。该策略似乎与@hagrawal 提出的非常相似,但排除项是作为 maven-shade-plugin 的过滤器配置添加的。

【讨论】:

【解决方案3】:

只需从您的 uber jar 中过滤签名文件

 <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.2.4</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <minimizeJar>true</minimizeJar>
                <filters>
                    <filter>
                        <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>

【讨论】:

  • 此解决方案为我修复了 SecurityException,但 &lt;minimizeJar&gt; 选项破坏了我的应用程序,因为它依赖于通过 ServiceLoader 机制加载其 XML 解析器的库(因此对解析器没有静态依赖)。启用&lt;minimizeJar&gt; 后,maven-shade-plugin 认为解析器是无法访问的代码,将其从 jar 中删除,然后我从 ServiceLoader 获得java.util.ServiceConfigurationError。从上面删除&lt;minimizeJar&gt; 让我进入工作状态!
【解决方案4】:

编译后的jar中需要删除安全签名的文件。为此,请遵循此命令

zip -d jarfile.jar 'META-INF/.SF' 'META-INF/.RSA' 'META-INF/*SF'

【讨论】:

    【解决方案5】:

    我没有删除 META-INF 文件,而是更改了 Artifact 定义中的方法。我从 Artifact 中删除了“Extracted”库,并将其再次添加为“Put into Output Root”。

    这样库将被合并,而新的 jar 文件中没有任何更改,我认为这是签署库的目的...

    顺便说一下,我也在用sqljdbc.jar。

    【讨论】:

    • 工作就像一个魅力,我也更喜欢这个解决方案。我在 IntelliJ IDEA 中看到,文件/项目结构/项目设置/模块您可以选择每个库的范围:编译、测试、运行时、提供。我不知道这是否也可能相关;我已经有十多年没有使用 java 了,并且正在重新学习。
    【解决方案6】:

    我在build.gradle.kts 中添加了以下行,它解决了问题

    tasks.withType<org.gradle.jvm.tasks.Jar>() {
        exclude("META-INF/BC1024KE.RSA", "META-INF/BC1024KE.SF", "META-INF/BC1024KE.DSA")
        exclude("META-INF/BC2048KE.RSA", "META-INF/BC2048KE.SF", "META-INF/BC2048KE.DSA")
    }
    

    【讨论】:

    • 对于我的 build.gradle,将此行添加到已经存在的 jar 任务中完成了这项工作:exclude("META-INF/*.RSA", "META-INF/*.DSA", "META-INF/*.SF")
    【解决方案7】:

    在我的情况下,不使用 gradle 或 maven 进行构建,我将 Artifacts 创建为 Jar 类型

    构建 Artifacts 后,我得到的结果是一个 jar 文件。我将其重命名为 .rar(或 .zip)并将其作为存档文件打开,然后找到 META-INF 文件夹并删除所有带有 .SF、.DSA、.RSA 扩展名的查找,再次重新存档并重命名为 .jar。完成。

    【讨论】:

    • 如果你使用7-Zip,你可以右击“打开存档”,查看内部文件,然后直接删除你需要的。 (比提取和重新压缩快得多)
    【解决方案8】:

    基于Venryx's comment,您可以在7-Zip 中将jar 文件作为存档打开并直接删除.RSA、.SF 和.DSA 文件。之后您可以重建依赖于已签名库的工件,错误应该会消失。

    【讨论】:

      【解决方案9】:

      对于同样的问题,我已经完成了全新安装并且问题消失了。因此,全新安装是您可以使用新下载的 jar 进行构建的一种选择。

      【讨论】:

        【解决方案10】:

        对于使用 Android gradle 应用程序的任何人,您可以通过在 packagingOptions 部分中排除 build.gradle 中的文件来解决此问题。

        这是一个例子:

        packagingOptions {
          exclude 'META-INF/LICENSE'
          exclude 'META-INF/LICENSE.txt'
          exclude 'META-INF/MSFTSIG.SF'
          exclude 'META_INF/ECLIPSE_.SF'
          exclude("META-INF/*.kotlin_module")
        }
        

        注意:由于某种原因,使用正则表达式 (META-INF/*.SF) 对我不起作用。所以我必须给出完整的名称才能工作。

        【讨论】:

          【解决方案11】:

          我在运行应用程序时遇到了同样的问题。在构建步骤 Maven 阴影插件警告我有关重叠的资源。我意识到我有多余的 jar 依赖。删除后问题解决了。

           [INFO] Skipping pom dependency com.sun.xml.ws:jaxws-ri:pom:2.3.2 in the shaded jar.
           [WARNING] Discovered module-info.class. Shading will break its strong encapsulation.
           ...
           ...
          
           [WARNING] maven-shade-plugin has detected that some class files are
           [WARNING] present in two or more JARs. When this happens, only one
           [WARNING] single version of the class is copied to the uber jar.
          

          【讨论】:

            猜你喜欢
            • 2015-11-14
            • 2019-03-03
            • 2021-05-17
            • 2018-10-05
            • 2019-12-18
            • 2021-06-15
            • 2018-11-13
            • 1970-01-01
            • 2021-11-19
            相关资源
            最近更新 更多