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

2022-09-01 21:49:06

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

我正在尝试从具有 gradle 依赖关系的 projet 生成一个。.jar

我有一个类,其中我有我的方法。src/main/java/Launcher.javamain

有我的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) }
    }
}

我用来生成我的jar,然后我得到错误“找不到或加载主类启动器”...$>gradle assemble$>java -jar path/to/my/.jar

我不明白为什么,当我在.jar中查看时,我有启动器类,而在META-INF中,我有我的清单

screenshot

很抱歉在2018年仍然问这个问题,但我正在失去理智,试图找出问题所在。我希望索蒙能有答案!


答案 1

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

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

这将排除干扰依赖项的签名。

例:

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

    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }
    exclude 'META-INF/*.RSA'
    exclude 'META-INF/*.SF'
    exclude 'META-INF/*.DSA'
}

答案 2

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

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

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

在你的例子中,看起来的依赖关系是签名的jar文件。因为我的示例项目在取消注释此依赖项时会正确执行。org.bouncycastle:bcprov-jdk15on:1.55com.auth0:java-jwt:3.1.0Launcher

充气城堡是一个加密提供商,需要有效的签名,否则它不会从我的经验中运行。因此,不可能为您的项目创建一个只包含所有类的胖罐。

您可以尝试使用除Bouncycastle之外的所有内容创建一个胖罐,并单独发布Bouncycastle JAR。

或者一个胖jar,它包含所有必需的JAR文件(JAR内部JAR),并且使用一个特殊的类装入器,该类装入器能够从JAR内的此类JAR中装入类。例如,请参见:https://stackoverflow.com/a/33420518/150978


推荐