【问题标题】:Gradle throws NoClassDefFoundError for dependencies with implementation keywordGradle 为具有 implementation 关键字的依赖项抛出 NoClassDefFoundError
【发布时间】:2021-10-09 11:53:12
【问题描述】:

我正在使用 Intellij Idea,gradlew 6.8 版。

每当我将 implementation 关键字指向 build.gradle 中的依赖项时,我都会得到(带有 gson 依赖项的示例)这个异常:

Exception in thread "main" java.lang.NoClassDefFoundError: com/google/gson/Gson
        at com.epam.adnocove.search.job.EmailVerifier.<clinit>(EmailVerifier.java:19)
        at com.epam.adnocove.search.job.UserIndexPipeline.<clinit>(UserIndexPipeline.java:31)
Caused by: java.lang.ClassNotFoundException: com.google.gson.Gson
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:636)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:182)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:519)
        ... 2 more 

我的 build.gradle 文件:

plugins {
    id 'java'
}

group 'com.epam.adnocove'
version '1.0'

repositories {
    mavenCentral()
}

jar {
    manifest {
        attributes 'Main-Class': 'Program'
    }

    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }

    exclude 'META-INF/*.RSA', 'META-INF/*.SF', 'META-INF/*.DSA'
}

dependencies {
    implementation 'com.google.code.gson:gson:2.8.2'
    testImplementation 'junit:junit:4.12'
}

如果我输入 compile 而不是 implementation - 一切都按预期工作。但是,如果我不想要传递依赖怎么办。为什么 gradle 不把我的依赖放到我的 jar 中?

【问题讨论】:

  • build.gradleGroovy 脚本,而compile 是包含在implementation 中的(过时的)依赖项集合。这就是为什么在您的脚本configurations.compile 中迭代一个空集的原因。使用configurations.implementation 将你的实现依赖添加到fat jar。

标签: java gradle dependencies


【解决方案1】:

问题在于,默认情况下仅与 java 插件一起构建 - Gradle 不会将依赖项打包到 jar 中 - 因此我们会遇到异常。

解决办法: 我们可以使用fat jars(通过单独的任务),或者使用java application plugin,它将创建可以运行已构建jar的特定于操作系统的启动应用程序。

【讨论】:

    猜你喜欢
    • 2020-03-12
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 2013-04-25
    • 1970-01-01
    • 2011-11-24
    • 2016-08-20
    相关资源
    最近更新 更多