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

时间:2018-07-21 10:33:51

标签: java gradle fatjar

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

我正在尝试从具有gradle依赖性的projet生成fp_items = SWTypes.objects.filter(pk__in=id,swtype__in=swtype).values('fp_items') fp = fp_items.split(';')

我有一个类.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) } } } 来生成我的jar 然后$>gradle assemble 而且我收到错误消息“找不到或加载主类启动器” ...

我不明白为什么,当我查看.jar​​时,我有了Launcher类,而在META-INF中却有清单

screenshot

很抱歉仍然在2018年问这个问题,但我想弄清楚什么地方出了问题。我希望有人能得到答案!

3 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:3)

构建FAT JAR时遇到一个主要问题:

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

看起来Java识别出存在未签名的类,并且忽略除了已签名的类之外的所有内容。由于所有不属于已签名库的类都是未签名的(例如您的Launcher类),因此它们将被忽略,因此可以#T加载。

在您的情况下,org.bouncycastle:bcprov-jdk15on:1.55的依赖项com.auth0:java-jwt:3.1.0似乎是签名的jar文件。因为当我取消注释此依赖项时,我的示例项目正确执行了Launcher

Bouncy castle是一个加密货币提供程序,需要有效的签名,否则它将无法运行。因此,不可能为仅包含所有类的项目创建一个胖子。

您可以尝试用除Bouncycastle之外的所有内容创建一个胖子罐,并分别运送Bouncycastle JAR。

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

答案 2 :(得分:0)

尝试排除.SF .DSA .RSA文件,例如下面的示例,Nipun

希望这对您有用

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'
  }
}