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

标签 java intellij-idea jar

我正在尝试运行我的项目的 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" 

这是我的 list 文件:

Manifest-Version: 1.0
Main-Class: Main

项目的外部库:

enter image description here

最佳答案

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

要解决这个问题,您需要首先确定哪些依赖 JAR 是签名的 JAR,然后排除它们。根据您使用的是 MAVEN 还是 ANT,您必须采取适当的解决方案。以下是但您可以阅读更多 here , herehere .

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>

Ant :

<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 看看它是否输出“verified”

关于java - 尝试运行 jar 文件时 Manifest 主要属性异常的签名文件摘要无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34855649/

相关文章:

java - BluetoothEventLoop(2255) : Device property changed. 蓝牙连接丢失

java - ’字符在 jdbc 中被转换为’

intellij-idea - PhpStorm 中的自动换行

java - Groovy 打包到 Jar 中,无法使用 Maven 工作。由 : java. lang.AbstractMethodError 引起

java - 将 zip 文件导入为库 - Eclipse Java

java - 从另一个 Java 程序访问变量

java - 如何避免在 Axis 生成的代码中硬编码 url?

Java,使用比较器对ArrayList进行排序

maven - 具有模块依赖性的Intellij maven war项目,如何只部署需要的东西?

java - IntelliJ IDEA 调试器跟随子进程