jar 依赖项中的 Gradle NoClassDefFoundError

标签 gradle dependency-management

我开发了一个自定义 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,所以,它似乎不是成为可能。

关于jar 依赖项中的 Gradle NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33143977/

相关文章:

jenkins - Jenkins没有将buildInfo属性文件传递给gradle

bash - 通过 Shell Bash 脚本从 build.gradle 获取 Gradle 项目版本

java - 如何处理版本控制托管的不同项目之间的外部资源?

java - 如何在 Eclipse 中添加 Maven 依赖项?

gradle - gradlew包装器更新到新版本错误,您具有旧版本

android - 错误:任务 ':packageAllReleaseClassesForMultiDex'的执行失败

spring - 使用 Play Framework 和 Gradle 运行 Spring 上下文

android - Gradle:在项目依赖项中设置属性

java - 依赖项依赖于项目中已使用的库的旧版本

gradle - Gradle中的configuration.files和configuration.copy方法之间有什么区别?