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,所以, 好像不行。
我开发了一个自定义 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,所以, 好像不行。