我知道这个问题被问了很多,也有很多答案,但我仍然得到了它,我不明白为什么……
我正在尝试从一个带有gradle依赖项的项目中生成一个.jar。
我有一个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) }
}
}我使用$>gradle assemble生成jar,然后$>java -jar path/to/my/.jar和我得到错误消息“无法找到或加载主类启动器”……
我不明白为什么,当我查看.jar时,我有启动器类,而在META-INF中,我有我的清单

很抱歉在2018年还在问这个问题,但我正在发疯,试图找出问题出在哪里。我希望有人能给我答案!
发布于 2018-07-21 20:29:46
我在本地转载了你的问题。
只需将exclude 'META-INF/*.RSA', 'META-INF/*.SF', 'META-INF/*.DSA'添加到jar任务中。
这将排除干扰依赖项的签名。
示例:
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'
}发布于 2018-07-21 20:04:24
在构建一个FAT JAR时,您遇到了一个主要问题:
您的一个源jar是签名的,将其合并到一个fat jar中会破坏签名。
看起来Java认识到有未签名的类,并忽略除已签名的类之外的所有内容。因为所有不属于带符号的库的类都是无符号的(就像您的Launcher类一样),所以它们会被忽略,因此不能加载。
在您的示例中,com.auth0:java-jwt:3.1.0的依赖项org.bouncycastle:bcprov-jdk15on:1.55看起来是签名的jar文件。因为当我取消对这个依赖项的注释时,我的示例项目正确地执行了Launcher。
Bouncy castle是一个需要有效签名的加密提供商,否则根据我的经验它将无法运行。因此,不可能为您的项目创建一个只包含所有类的fat jar。
您可以尝试使用除Bouncycastle之外的所有内容创建一个胖jar,并将Bouncycastle JAR分开发货。
或者是一个fat JAR,其中包含所有必需的jar文件(JAR中的JAR),并且使用特殊的类加载器,能够从JAR中的JAR中加载类。请参见示例:https://stackoverflow.com/a/33420518/150978
发布于 2018-08-20 02:41:25
尝试排除.SF .DSA .RSA文件,如下例所示
希望这对你有用
task customFatJar(type: Jar) {
baseName = 'XXXXX'
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
with jar
exclude "META-INF/*.SF"
exclude "META-INF/*.DSA"
exclude "META-INF/*.RSA"
manifest {
attributes 'Main-Class': 'com.nipun.MyMainClass'
}
}https://stackoverflow.com/questions/51455197
复制相似问题