我有一个简单的构建脚本(为了清晰起见而缩短),它使用Guava
作为依赖
group 'test'
version '0.1.0'
apply plugin: 'java'
apply plugin: 'application'
sourceCompatibility = 1.8
targetCompatibility = 1.8
mainClassName = 'Test'
repositories {mavenCentral()}
task wrapper(type: Wrapper) {gradleVersion = '3.5'}
dependencies {compile 'com.google.guava:guava:21.0'}
运行此代码时:
public class Test {
public static void main(String[] args) {
LoadingCache<Long, String> applicantCache = CacheBuilder.newBuilder()
.maximumSize(30000)
.expireAfterAccess(31, TimeUnit.DAYS)
.build(new CacheLoader<Long, String>() {
@Override
public String load(Long key) {
return "";
}
});
}
}
我收到此错误:
java.lang.NoClassDefFoundError: com/google/common/cache/CacheLoader
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
at java.lang.Class.getMethod0(Class.java:3018)
at java.lang.Class.getMethod(Class.java:1784)
at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Caused by: java.lang.ClassNotFoundException: com.google.common.cache.CacheLoader
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 7 more
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main"
将Gradle Wrapper
版本降级为3.3
时问题已解决,但我需要版本3.5
以获取版本3.3
中不可行的其他内容。据我所知,这个版本的Gradle
和Guava
之间存在一些依赖性冲突,但根据this帖子 - 这是不可能的。
我知道jar
已就位+使用gradle dependencyInsight --dependency com.google.guava
显示依赖项存在:
:dependencyInsight
com.google.guava:guava:21.0
\--- compile
感谢您的帮助
修改
在其他计算机上测试后,似乎问题只发生在我更新wrapper
任务,执行它然后通过单击刷新所有Gradle项目按钮刷新gradle
项目时(见附图)。当运行执行的分发脚本时,每件事都可以正常工作 - 所以它只发生在Intellij
中。我猜我错过了Gradle Wrapper
的工作原理或何时执行它......
修改 在Gradle 3.4版上测试,问题就出现了。
答案 0 :(得分:0)
如果其他人遇到类似问题,答案是here。
我的Intellij版本(2016.2.5)中的一个错误导致compile
范围内的依赖关系被Intellij转换为provided
范围的依赖关系。反过来,这使得依赖关系仅出现在Intellij的compile classpath
中,而不出现在runtime classpath
中。这就是为什么在运行./gradlew run
命令时问题无法再现,因为Gradle's
部分没有问题。
升级Intellij版本(2017.1)解决了这个问题。