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任务即可.
这将排除干扰依赖关系的签名.
在构建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
| 归档时间: |
|
| 查看次数: |
3218 次 |
| 最近记录: |