尝试运行jar文件时,Manifest主要属性异常的签名文件摘要无效

Fay*_*007 30 java intellij-idea

我正在尝试运行我的项目的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" 
Run Code Online (Sandbox Code Playgroud)

这是我的清单文件:

Manifest-Version: 1.0
Main-Class: Main
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

我究竟做错了什么??

更新

在此输入图像描述

hag*_*wal 43

您的一些依赖JAR是一个签名的JAR,因此当您将所有JAR组合在一起并运行该JAR时,签名JAR的签名不匹配,因此您将获得有关签名不匹配的安全性异常.

要解决此问题,您需要首先确定哪些所有依赖项JAR都是已签名的JAR,然后将其排除.根据您使用的是MAVEN还是ANT,您必须采取适当的解决方案.以下是您可以在这里,这里这里阅读更多内容.

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</excludes>
                <excludes>META-INF/*.DSA</excludes>
                <excludes>META-INF/*.RSA</excludes>
                <excludeGroupIds>junit,org.mockito,org.hamcrest</excludeGroupIds>
                <outputDirectory>${project.build.directory}/classes</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)

蚂蚁:

<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>
Run Code Online (Sandbox Code Playgroud)


根据OP的评论更新:

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

如果未排除这些签名文件,则由于签名不匹配将发生安全性异常.

如何知道JAR是否已签名?: 如果JAR包含像.SF,.RSA或.DES等文件或其他算法文件这样的文件,那么它就是一个签名的JAR.

  • 使用依赖插件对我没有帮助,但过滤器也可以在阴影插件中配置/sf/ask/4484446991/属性-wh/64063529#64063529 (3认同)
  • 我正在使用Maven,但这并没有解决它,是否有任何新的解决方案.@hagrawal? (2认同)
  • 指定多个排除项的正确方法应该在逗号分隔的列表中,例如:“ &lt;excludes&gt; META-INF / *。SF,META-INF / *。DSA,META-INF / *。RSA &lt;/ excludes&gt;” ; 否则,将仅排除最后一个 (2认同)

Cof*_*fan 22

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


tom*_*tom 17

只需从您的 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>
Run Code Online (Sandbox Code Playgroud)


小智 8

在编译的jar 中需要删除安全签名文件。要做到这一点,请遵循以下命令

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


the*_*e64 8

我已在我的中添加了以下几行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")
}
Run Code Online (Sandbox Code Playgroud)

  • 对于我的 build.gradle,将此行添加到已经存在的 `jar` 任务中即可完成这项工作:`exclude("META-INF/*.RSA", "META-INF/*.DSA", "META-INF/* .SF")` (2认同)
  • 这个对我有用,谢谢! (2认同)

Tha*_*hLD 5

就我而言,不使用 gradle 或 maven 进行构建,我将 Artifacts 创建为 Jar 类型 在此输入图像描述

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

  • 如果您使用[7-Zip](https://www.7-zip.org/),您可以右键点击“打开压缩包”,查看内部文件,然后直接删除您需要的文件。(比提取和重新压缩快得多) (2认同)