New Gradle版本与依赖性产生冲突

时间:2017-05-14 14:27:26

标签: intellij-idea gradle

我有一个简单的构建脚本(为了清晰起见而缩短),它使用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中不可行的其他内容。据我所知,这个版本的GradleGuava之间存在一些依赖性冲突,但根据this帖子 - 这是不可能的。

我知道jar已就位+使用gradle dependencyInsight --dependency com.google.guava显示依赖项存在:

:dependencyInsight
com.google.guava:guava:21.0
\--- compile

感谢您的帮助

修改 在其他计算机上测试后,似乎问题只发生在我更新wrapper任务,执行它然后通过单击刷新所有Gradle项目按钮刷新gradle项目时(见附图)。当运行执行的分发脚本时,每件事都可以正常工作 - 所以它只发生在Intellij中。我猜我错过了Gradle Wrapper的工作原理或何时执行它......

enter image description here

修改 在Gradle 3.4版上测试,问题就出现了。

1 个答案:

答案 0 :(得分:0)

如果其他人遇到类似问题,答案是here

我的Intellij版本(2016.2.5)中的一个错误导致compile范围内的依赖关系被Intellij转换为provided范围的依赖关系。反过来,这使得依赖关系仅出现在Intellij的compile classpath中,而不出现在runtime classpath中。这就是为什么在运行./gradlew run命令时问题无法再现,因为Gradle's部分没有问题。

升级Intellij版本(2017.1)解决了这个问题。