【发布时间】: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.gradle是Groovy 脚本,而compile是包含在implementation中的(过时的)依赖项集合。这就是为什么在您的脚本configurations.compile中迭代一个空集的原因。使用configurations.implementation将你的实现依赖添加到fat jar。
标签: java gradle dependencies