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

我正在尝试运行我的项目的jar文件。 我正在研究intelliJ并使用工件来生成jar文件。 但每次我试图运行我的jar文件时它给我exception。

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.(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,因此当您在一个JAR中组合并运行该JAR时,签名的JAR的签名不匹配,因此您将获得有关签名不匹配的安全性exception。

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

Maven的:

  org.apache.maven.plugins maven-dependency-plugin 2.6   unpack-dependencies package  unpack-dependencies   system META-INF/*.SF META-INF/*.DSA META-INF/*.RSA junit,org.mockito,org.hamcrest ${project.build.directory}/classes     

ant:

       

根据OP的评论更新:

“sqljdbc4.jar”是OP外部库中签名的JAR。 因此,遵循上述方法系统地排除签名相关文件,如.SF,.RSA或.DES或其他算法文件是向前发展的正确方法。

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

如何知道JAR是否已签名?:如果JAR包含诸如.SF,.RSA或.DES等文件或其他算法文件的文件,则它是签名的JAR。

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

通过这种方式,库将被合并而不会对新的jar文件进行任何更改,我认为这是签署库的目的…

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

在我的情况下,我正在使用maven-shade-plugin和@ruhsuzbaykus处理超级jar 这里是解决方案。 该策略似乎与@hagrawal提出的非常相似,但排除项被添加为maven-shade-plugin的filter配置。