使用Guava类时的NoClassDefFoundError,即使Guava包含在Gradle构建文件和类路径中

时间:2017-07-24 18:49:51

标签: java gradle guava

当我使用Gradle构建我的Guava依赖项目时:

//build.gradle

plugins {
    id 'java'
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'com.google.guava', name: 'guava', version: '22.0'
}

task wrapper(type: Wrapper) {
    gradleVersion = '3.3' //Tried 3.1 - 4.0.1 
    distributionUrl = "https://services.gradle.org/distributions/gradle-$gradleVersion-all.zip"
}

在Intellij中运行项目时出现以下运行时错误:

Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/collect/Multiset

这些库肯定在类路径中,我无法弄清楚为什么会发生这种情况。

我已经通过切换到较旧的Gradle版本(3.1,3.2,3.3全部工作)解决了这个问题。

因此,我认为问题在于Gradle 3.4+(3.4,3.5.1,4.0和4.0.1),我尝试过并收到NoClassDefFoundError。

Guava documentation

中没有提及Gradle版本

Guava与较新版本的Gradle不兼容吗?

2 个答案:

答案 0 :(得分:0)

这种行为背后的原因在于你的类路径。编译时类路径与运行时的类路径不同。您将guava传递给javac,但在运行时没有它。

这里有类似问题的非常好的解释:NoClassDefFoundError at Runtime with Gradle。我无法在本地重现此问题。考虑转到您的gradle缓存并删除所有内容。

答案 1 :(得分:0)

问题最终出现在我正在使用的Intellij版本(2016.3.1)

一旦我将Intellij更新到2016.3.7,该项目就可以在所有版本的Gradle中正常运行。