执行生成的jar文件时出错。

5

我有一个Java项目,其中嵌入了Jetty服务器和Jersey库以提供REST服务。我使用Intellij来运行该项目,它能正常运行。

问题在于当我尝试执行生成的jar文件时。

因此,我在build.gradle文件中编写了一个用于生成jar文件的任务。以下是build.gradle中的任务:

task fatJar(type: Jar) {
    baseName = project.name + '-all'
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
    with jar
    manifest {
        attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': 1.0
        attributes 'Main-Class': 'EmbeddedJetty.EmbeddedJettyMain'
    }
}

当我运行以下命令时,会生成jar文件。
gradle clean build fatJar

当我尝试使用命令运行生成的jar文件时,遇到了以下错误:

java -jar projectname.rar

Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" 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:273)
    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.URLClassPath$JarLoader$2.getInputStream(URLClassPath.java:940)
    at sun.misc.Resource.cachedInputStream(Resource.java:77)
    at sun.misc.Resource.getByteBuffer(Resource.java:160)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:454)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
    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)

能否有人提供反馈,说明可能出了什么问题?

2个回答

8
这很可能是将第三方库jar包打包时签名以防篡改的结果。你的打包很可能会在'fat' jar的清单中包含这些jar的签名文件。您可以使用如下指令显式地排除签名文件: exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA' 相关问题:"尝试运行.jar文件时出现无效的签名文件"

1
这行代码应该添加在哪里?是在build.gradle文件中吗?我在将这行代码添加到build.gradle时遇到了语法错误,你能否粘贴一个带有这行代码的示例build.gradle文件。 - Arjun Bora
Arjun,需要在你的build.gradle文件中的JAR插件配置中添加exclude指令。请参阅JAR插件文档中的exclude(s)属性/方法。此外,这个答案包含了一个简单的例子。 - dkichler

0

您说您生成了Jar文件,现在想使用java -jar来运行.rar文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接