IntelliJ 混淆了 Gradle 依赖与不同的项目 - 仍然有效

IntelliJ confuses Gradle dependency with different project - still works

情况:我在 IntelliJ idea 中导入了两个单独的 Gradle 项目。这两个项目都使用一个名为 Mason 的框架。项目A是最先导入的,没有问题,它使用较新版本的Mason,它存储在本地一个名为'lib'的文件夹中,作为Mason。20.jar(Mason的none这里使用的版本在 Maven Central 上)。项目 B 是后来导入的,使用的是较旧的版本,该版本存储在文件夹中,也称为 'lib',如 Mason.19.jar(某些元素与 Mason.20 不兼容)。这两个项目的结构相同,并且都将库文件夹设置为“Root/lib/”,但除此之外,这两个项目完全相互独立,甚至不相互引用。

实际问题:IntelliJ 现在在评估项目 B 时遇到问题,因为它在“ProjectB/lib/Mason.20.jar”中寻找“Mason.20.jar”,即使它不是在项目 B 的 build.gradle 文件中的任何位置引用。而且项目本身也完全没问题,我可以 运行 Gradle 任务没有任何问题,在 IntelliJ 内外。这个问题也是在我最近设置笔记本电脑后才出现的。

我尝试了 IntelliJ 中的 Gradle 同步按钮并检查依赖项是否搞砸了,但找不到任何东西。我猜 IntelliJ 只是混淆了两个项目的缓存,但我不知道如何解决这个问题。

这是我用来为项目 B 生成 jar 文件的 Gradle 任务,也是错误所在:

task distribute(type: Jar){
    from sourceSets.main.output
    from (configurations.compile.collect {zipTree(it)}){ <--this is where IntelliJ complains
        exclude 'META-INF/MANIFEST.MF'
        exclude 'META-INF/*.SF'
        exclude 'META-INF/*.DSA'
        exclude 'META-INF/*.RSA'
    }

    manifest {
        attributes 'Main-Class': project.mainClassName
    }

    doLast{
        copy {
            from "/build/libs/"
            from "./logging.properties"
            into "./jar"
        }
        copy {
            from "./parameters"
            into "./jar/parameters"
        }
        copy{
            from "./README.txt"
            into "./jar"
            }

        copy{
            from "./batch/"
            into "./jar/batch"
        }

        file(new File(projectDir, "/build")).deleteDir()
        file(new File(projectDir, "/jar/batch/linux/buildJar")).delete()
        file(new File(projectDir, "/jar/batch/windows/buildJar.bat")).delete()
    }
}

为了比较,项目 A 的等效 Gradle 任务:

task distribute(type: Jar){
outputs.upToDateWhen { false }
    from sourceSets.main.output
    from (configurations.compile.collect {zipTree(it)}){
        exclude 'META-INF/MANIFEST.MF'
        exclude 'META-INF/*.SF'
        exclude 'META-INF/*.DSA'
        exclude 'META-INF/*.RSA'
    }

    manifest {
        attributes 'Main-Class': project.mainClassName
    }

    doLast {
        copy {
            from "/build/libs/"
            into "./jar"
        }
        copy {
            from "./Config"
            into "./jar/Config"
        }
        copy{
            from "./README.txt"
            into "./jar"
            }
        copy {
            from "./scriptfiles"
            into "./jar/scriptfiles"
        }

        file(new File(projectDir, "/build")).deleteDir()
    }
}

有什么解决办法吗?

经过一番尝试,我或多或少找到了解决方案。 看来 IntelliJ 可能不是问题所在,而是 Gradle 本身。 在我手动删除位于 %USERPROFILE%\.gradle\caches 下的 Gradle 缓存之后 问题消失了,即使我在 IntelliJ 中切换回项目 A(没有重新导入它也没有构建它)它仍然工作正常。但是我不知道如果我重新导入一个项目它会如何表现。需要注意的一件事是项目 A 使用了问题库的较新版本,因此首先使用较旧的库导入项目可能更可靠。它也可能只是一个随机的一次性错误。