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

我有以下问题:我正在使用带有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)

3 years ago

EchoServer(真的不应该在默认包中,BTW:这是不好的做法)似乎依赖于库中的类,但这些库不在类路径中 . 所以这个类无法加载 .

Java在jar文件中执行 NOT 加载jar文件 . 它从jar文件的jar文件 outside 加载类,如果它们在类路径中:

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