Gradle - FatJar - 无法找到或加载主类

Had*_*ien 10 java gradle fatjar

我知道这个问题被问了很多并且有很多答案,但我仍然明白了,我不明白为什么......

我正在尝试.jar从带有gradle的依赖项的projet 生成一个.

我有一个班级src/main/java/Launcher.java,我有自己的main方法.

有我的 build.gradle

plugins {
    id 'java'
    id 'application'
}

version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
mainClassName = 'Launcher'

repositories {
    mavenCentral()
}

dependencies {
    compile 'commons-io:commons-io:2.1'
    compile 'io.vertx:vertx-core:3.4.0'
    compile 'io.vertx:vertx-web:3.4.0'
    compile 'com.google.code.gson:gson:1.7.2'
    compile "com.auth0:java-jwt:3.1.0"
    compile 'org.mongodb:mongo-java-driver:3.4.1'
    compile 'com.google.guava:guava:24.1-jre'
    compile 'commons-io:commons-io:2.6'
}

jar {
    manifest {
        attributes "Main-Class": mainClassName
    }

    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }
}
Run Code Online (Sandbox Code Playgroud)

$>gradle assemble用来生成我的jar然后$>java -jar path/to/my/.jar 我得到错误"无法找到或加载主类Launcher"...

我不明白为什么,当我查看.jar​​时,我有Launcher类和META-INF我有我的清单

截图

很抱歉在2018年仍然问这个问题,但是我在想弄清楚什么是错的.我希望somone能得到答案!

And*_*ann 14

我在本地转载了您的问题.

只需添加exclude 'META-INF/*.RSA', 'META-INF/*.SF', 'META-INF/*.DSA'到jar任务即可.

这将排除干扰依赖关系的签名.

  • 非常感谢,这解决了问题! (2认同)
  • @Hadrien:确保您的应用程序确实按预期工作。Bouncycastle 是一个需要签名的加密提供程序,因此删除签名会使所有依赖于 BouncyCastle JCE 的代码部分失败。 (2认同)
  • 谢谢你!谢谢你!谢谢你! (2认同)

Rob*_*ert 5

在构建FAT JAR时遇到一个主要问题:

您的其中一个源JAR已签名,并将其合并到一个胖罐中会破坏签名。

看起来Java识别出存在未签名的类,并且忽略除了已签名的类之外的所有内容。由于所有不属于已签名库的Launcher类都是未签名的(例如您的类),因此它们将被忽略,因此无法加载。

在你的情况下,它看起来像依赖org.bouncycastle:bcprov-jdk15on:1.55com.auth0:java-jwt:3.1.0是签名的JAR文件。因为Launcher当我取消注释此依赖项时,示例项目将正确执行。

有弹性的城堡是需要有效签名的加密提供者,否则我的经验将无法解决。因此,不可能为仅包含所有类的项目创建一个胖子。

您可以尝试用除Bouncycastle之外的所有内容创建一个胖子罐,并分别运送Bouncycastle JAR。

或者是一个胖罐子,里面包含所有必需的JAR文件(JAR内的JAR),并使用特殊的类加载器,该加载器能够从JAR内的此类JAR内加载类。参见例如:https : //stackoverflow.com/a/33420518/150978