Gradle jar 依赖项中的 NoClassDefFoundError

Gradle NoClassDefFoundError in jar dependency

我开发了一个自定义 Gradle 插件并组装为 jar。此插件有一个依赖项:

plugin/build.gradle

dependencies {
    compile 'com.jcraft:jsch:0.1.53'
}

我已将我的插件包含在另一个消费者项目中(如 libs 中的 jar):

consumer/build.gradle

apply plugin: 'gg-release-plugin'

buildscript {
    repositories {
        flatDir {
            dirs 'libs'
        }
        mavenCentral()
    }
    dependencies {
        classpath 'com.myplugin.plugin:myplugin:1.0'
    }
}

一切正常,但是当执行使用 com.jcraft:jsch:0.1.53 依赖项的 类 的代码时,出现错误:

java.lang.NoClassDefFoundError: com/jcraft/jsch/JSch

我做错了什么?如何在 jar 文件中包含依赖项?

看来,您已经创建了一个具有编译时依赖性的插件 jar 库,它没有包含在您最终的 jar 中。

您可以尝试使用 Gradle FatJar plugin 或其他方式将插件 jar 创建为 fat jar。在这种情况下,您将拥有一个包含所有相关 类 的单个 jar。但这可能会导致问题,如果有人将使用相同的库。

或者您可以尝试提供一个 JSch 库和您的插件 jar,并制作一个消费者构建脚本依赖项,例如:

buildscript {
    repositories {
        flatDir {
            dirs 'libs'
        }
        mavenCentral()
    }
    dependencies {
        classpath 'com.myplugin.plugin:myplugin:1.0'
        classpath 'com.jcraft:jsch:0.1.53'
    }
}

据我所知,如果您使用 Maven 存储库发布您的插件,您可以提供一个 pom.xml 来描述插件的所有依赖项,但正如我所见,您使用的是 flatDir,所以, 好像不行。