java - 执行生成的jar文件出错

标签 java intellij-idea gradle executable-jar

我有一个 Java 项目,其中包含用于 REST 服务的嵌入式 jetty 服务器和 Jersey 库。我正在使用 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)

有人可以就可能出现的问题提供反馈吗?

最佳答案

这可能是捆绑已签名以防止篡改的第三方库 jar 的结果。您的 bundle 可能会在您的“胖” jar list 中包含来自这些 jar 的签名文件。您可以使用如下指令明确排除签名文件:

排除'META-INF/*.RSA'、'META-INF/*.SF'、'META-INF/*.DSA'

相关问题:"Invalid signature file" when attempting to run a .jar

关于java - 执行生成的jar文件出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37848553/

相关文章:

java - Spring AMQP (Rabbit) 监听器在异常情况下进入循环

android - 如何在Android上设置Kinvey?

android - IntelliJ IDEA 找不到android sdk

intellij-idea - 开始规则 : <select from navigator or grammar> in antlr plugin in IntelliJ

Android gradle 在合并时更改资源

jetty - 在 Gradle 中使用 jettyRun 将环境变量发送到 jetty

java - 在多个模块上运行 Maven 插件目标

java - jbutton 上的 keyListener 不工作

java - 无法调用 persistence.xml 文件中的 JNDI 资源

scala - IntelliJ 集成 Play 2 应用程序抛出的库 'scala-2.10.0-RC1 not used'