当前位置: 首页 > 知识库问答 >
问题:

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

刁茂才
2023-03-14

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

项目的外部库:

共有3个答案

危寒
2023-03-14

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

夏星阑
2023-03-14

只需从您的超级罐子中过滤签名文件

 <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>
明财
2023-03-14

你的一些依赖JAR是一个签名的JAR,所以当你把它们都放在一个JAR中并运行这个JAR时,签名的JAR的签名不匹配,因此你会得到一个关于签名不匹配的安全异常。

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

马文:

xml prettyprint-override"><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。因此,按照上述方法系统地排除与签名相关的文件,例如。顺丰, .断续器或 .DES 或其他算法文件是前进的正确方法。

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

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

 类似资料:
  • 我有一个google cloud app engine应用程序,这个应用程序是用Java11实现的,并且可以编译它。但由于某种原因,当我将I部署到app engine上时,google无法创建此应用程序的实例。

  • 我已经检查了有这个问题的其他线程,但是他们的情况和解决方案不适用于我的情况。 该程序应该在蓝牙设备和计算机之间建立连接,并且应该从所述设备接收数据。因此,我正在使用蓝牙连接所需的库,这些库本身包含清单文件。我猜想,这就是问题发生的地方。 我已经尝试使用不同的JDK,但没有成功。 以下是整个错误消息:

  • 我在google上搜索过,但没有找到有类似问题的人。我在我自己的几个项目以及像这样的eclipse JAR中遇到了这个错误。由于这些问题,我的项目无法编译。 !ENTRYile.java:4064 2 2012-09-04 17:17:18.695!消息从插件调用代码时出现问题:“org.eclipse.pde.internal.core.”。!STACK 0ache.extract安全异常:无效

  • 我使用并使用相同的安装程序安装了。 java-jar“C:\ProgramFiles(x86)\HP\LeanFT\Tools\TestExportTool\test export tool.jar”“C:\LeanFT\MyTestNGTests.jar”-类路径:“C:\TestNG\TestNG.jar” 清单主属性的签名文件摘要无效 我使用从测试用例生成了工件。

  • 我已经通过提取jar,更改其MANIFEST. MF文件并使用命令jar cfmnew-6.0.1.jar将其转换为bundle,将jar转换为OSGI bundle。\META-INF\MANIFEST. MF.但是当我试图运行代码时,我得到了错误java.lang.Security异常:无效的签名文件摘要为清单主要属性请提供您的建议如何解决此错误。