作者:aska | 来源:互联网 | 2022-12-10 01:03
我知道这个问题被问了很多并且有很多答案,但我仍然明白了,我不明白为什么......
我正在尝试.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) }
}
}
我$>gradle assemble
用来生成我的jar然后$>java -jar path/to/my/.jar
我得到错误"无法找到或加载主类Launcher"...
我不明白为什么,当我查看.jar时,我有Launcher类和META-INF我有我的清单
很抱歉在2018年仍然问这个问题,但是我在想弄清楚什么是错的.我希望somone能得到答案!
1> Andreas Volk..:
我在本地转载了您的问题.
只需添加exclude 'META-INF/*.RSA', 'META-INF/*.SF', 'META-INF/*.DSA'
到jar任务即可.
这将排除干扰依赖关系的签名.
非常感谢,这解决了问题!
2> Robert..:
在构建FAT JAR时遇到一个主要问题:
您的其中一个源JAR已签名,并将其合并到一个胖罐中会破坏签名。
看起来Java识别出存在未签名的类,并且忽略除了已签名的类之外的所有内容。由于所有不属于已签名库的Launcher
类都是未签名的(例如您的类),因此它们将被忽略,因此无法加载。
在你的情况下,它看起来像依赖org.bouncycastle:bcprov-jdk15on:1.55
的com.auth0:java-jwt:3.1.0
是签名的JAR文件。因为Launcher
当我取消注释此依赖项时,示例项目将正确执行。
有弹性的城堡是需要有效签名的加密提供者,否则我的经验将无法解决。因此,不可能为仅包含所有类的项目创建一个胖子。
您可以尝试用除Bouncycastle之外的所有内容创建一个胖子罐,并分别运送Bouncycastle JAR。
或者是一个胖罐子,里面包含所有必需的JAR文件(JAR内的JAR),并使用特殊的类加载器,该加载器能够从JAR内的此类JAR内加载类。参见例如:https : //stackoverflow.com/a/33420518/150978