在IntelliJ中使用gradle构建jar。无法找到或加载主类

时间:2017-07-10 09:52:07

标签: java intellij-idea gradle

我有以下问题:我正在使用带有gradle的IntelliJ Idea。我可以毫无问题地构建jar,但是我在使用 java -jar 执行jar时遇到无法找到或加载主类的错误。

我不认为它是版本冲突,因为IDE中的java版本与我在控制台中使用的版本匹配。

代码的路径是gradle项目的标准路径,所以src / main / java。 build.gradle 的有趣部分如下所示:

jar {
   manifest {
       attributes 'Implementation-Title': 'Implementation_Group_C',
            'Implementation-Version': version,
            'Main-Class': 'EchoServer'
   }

    from sourceSets.main.output
}

task fatJar(type: Jar){
    manifest.from jar.manifest
    classifier = 'all'
    from {
       configurations.runtime.collect{it.isDirectory() ? it : zipTree(it)}
    } {
     exclude 'META_INF/*.SF'
     exclude 'META_INF/*.DSA'
     exclude 'META_INF/*.RSA'
    }
    with jar
}

当我检查jar时,我发现EchoServer.class位于主目录中(应该是正确的,因为它的目录是 /src/main/java/EchoServer.java )和META-INF / MANIFEST.MF看起来像这样:

Manifest-Version: 1.0
Implementation-Title: Implementation_Group_C
Implementation-Version: 1.1-SNAPSHOT
Main-Class: EchoServer

对我来说很好看,但我仍然得到无法找到或加载主类的错误。 如果有人能帮助我,我会非常感激。

1 个答案:

答案 0 :(得分:1)

EchoServer(它真的不应该在默认包中,BTW:这是不好的做法)似乎依赖于库中的类,但这些库不在类路径中。因此无法加载课程。

Java在jar文件中加载 NOT 加载jar文件。它从jar文件的外部加载类,如果它们在类路径中:

因此,简而言之,胖jar无法工作,除非jar文件中的主类是一个自定义类加载器,它从bundle jar文件中读取其他类。请注意,gradle有一个应用程序插件,用于创建标准Java应用程序zip文件,包含启动应用程序的所有库和脚本。