我正在尝试运行我的项目的 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
然后将外部库添加到我的项目中
我究竟做错了什么??
更新
原文由 Fay007 发布,翻译遵循 CC BY-SA 4.0 许可协议
您的某些依赖项 JAR 是已签名的 JAR,因此当您将所有 JAR 组合在一个 JAR 中并运行该 JAR 时,已签名 JAR 的签名不匹配,因此您会收到有关签名不匹配的安全异常。
要解决此问题,您需要首先确定哪些依赖项 JAR 是已签名的 JAR,然后排除它们。根据您使用的是 MAVEN 还是 ANT,您必须采取适当的解决方案。以下是,但您可以 在此处、 此处 和 此处 阅读更多内容。
马文:
蚂蚁:
根据 OP 的评论更新:
“sqljdbc4.jar”是 OP 外部库中的签名 JAR。因此,按照上述方法系统地排除签名相关文件,如 .SF、.RSA 或 .DES 或其他算法文件是前进的正确方法。
如果不排除这些签名文件,则会由于签名不匹配而发生安全异常。
如何知道 JAR 是否已签名?: 如果 JAR 包含像 .SF、.RSA 或 .DES 等文件或其他算法文件之类的文件,则它是已签名的 JAR。或者运行
jarsigner -verify jarname.jar
看看它是否输出“已验证”