首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gradle - FatJar -无法找到或加载主类

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

Stack Overflow用户
提问于 2018-07-21 18:33:51
回答 3查看 10.7K关注 0票数 21

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

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

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

这就是我的build.gradle

代码语言:javascript
复制
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年还在问这个问题,但我正在发疯,试图找出问题出在哪里。我希望有人能给我答案!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-21 20:29:46

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

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

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

示例:

代码语言:javascript
复制
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'
}
票数 42
EN

Stack Overflow用户

发布于 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

票数 9
EN

Stack Overflow用户

发布于 2018-08-20 02:41:25

尝试排除.SF .DSA .RSA文件,如下例所示

希望这对你有用

代码语言:javascript
复制
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'
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51455197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档