IntelliJ无法识别Gradle项目中的某些导入

时间:2018-11-14 20:45:22

标签: java gradle intellij-idea

我正在IntelliJ中执行Gradle项目,并且IntelliJ无法识别某些软件包。当我转到项目结构->模块-> <my module>->依赖关系时,包含这些包的jar文件就在那里。 (我已经用jar tfv <file>检查了jar文件,以确保有问题的类在文件中。)

有问题的类为红色,将它们悬停在它们上时,出现诸如“无法解析符号'somepackagename'”或“无法解析符号'SomeClassName'”之类的错误。

但是,gradle项目可以从命令行正常编译。

我已经尝试了所有可以找到的现有建议,但是到目前为止,没有任何帮助。首先,我已经尝试过:

  • 删除.idea文件夹并重新导入
  • 从build.gradle根文件中重新导入项目
  • 点击“刷新所有gradle项目”按钮
  • 升级IntelliJ
  • 单击“使缓存无效并重新启动”

如何使IntelliJ识别这些jar文件中的软件包?

6 个答案:

答案 0 :(得分:3)

我在多项目 Gradle 构建中也遇到过这个问题,它仍然可以用最新的(在撰写本文时)IntellijIDEA 2020.3.2 重现。看起来像是某种内部缓存问题,因为即使 IDEA 抱怨它无法识别可以成功执行构建的类。

最初我通过使缓存无效并重新启动 IDEA 来修复它,正如这里所建议的,但后来发现如果我在 Gradle 工具窗口中重新加载项目,它就会消失:

enter image description here

对我来说它每次都有效。

答案 1 :(得分:1)

我有同样的问题。我的IntelliJ无法识别build.gradle中的某些依赖项。我的猜测是它是一个缓存的东西。所以我做了以下事情:

  1. 删除gradle缓存目录。

    rm -rf ~/.gradle/caches
    
  2. 重新启动IntelliJ并刷新gradle依赖项。

这对我有用,似乎是一个简单的解决方案。

答案 2 :(得分:0)

就我而言

  1. 现有依赖库删除
  2. 逐步刷新!

参考链接:https://youtu.be/0rLZK6hIpm0

答案 3 :(得分:0)

升级后,我刚遇到了Intellij Idea 2019.2.3的相同问题。似乎文件->“使缓存无效并重新启动”操作已解决了该问题。

我尝试过的其他先前操作(重新导入gradle项目,删除.idea / *和 .ipr / .iml,重新启动intellij)不能解决问题。

答案 4 :(得分:0)

确保您确实在正确的位置包含了依赖

对于 kotlin 示例,在我的 build.gradle.kts 中,我有多个源集,如下所示:

sourceSets{
val jvmTest by getting {
            dependencies {
                implementation(kotlin("test-junit"))
            }
        }
        val jsMain by getting {
            dependencies {
                implementation("khttp:khttp:1.0.0")
            }
        }
}

jsMain 不能访问 junit,jvmTest 不能访问 khttp。

简而言之,如果您有两个名称非常相似的源集,那么您就会混淆。

答案 5 :(得分:-1)

尝试了有关此问题的所有不同建议后,似乎可行的方法是将无法识别的jar从本地Gradle缓存复制到项目中的文件夹中。我还必须告诉Gradle去那里。

总而言之,如果我这样更改根项目build.gradle:

allprojects {
    repositories {
        flatDir {
            dirs 'lib'
        }
    }
    ... existing repos ...
}

和子项目的build.gradle一样:

dependencies {
    ... existing dependencies ...
    compile fileTree(dir: 'lib', include: '*.jar')
}

,然后运行以下命令:

jars=($(find /Users/me/.gradle/caches/modules-2/files-2.1/unrecognizedorg/ -name '*.jar'))
for jar in "${jars[@]}" ; do
    cp "$jar" ~/myproject/lib/
done

,然后在IntelliJ中刷新Gradle,即可识别文件。

当然,那我有一个问题,那就是我不想在项目中提交带有jar的lib文件夹,但是有很多方法可以解决。如果任何依赖项发生更改,还存在使这些文件夹保持最新的问题。

我通过建立指向Gradle缓存目录的符号链接来解决此问题:

ln -s /Users/me/.gradle/caches/modules-2/files-2.1/ lib

这样我就不必复制文件,并且所有更改都会自动提取。

更新

临时删除所有变通办法,以便我可以评估如何使IntelliJ在不提交变通办法的情况下工作(生成脚本更改以及符号链接),我发现它仍然可以工作(!)。也就是说,它现在可以在IntelliJ中运行,而对我来说,不起作用的状态没有任何变化。

我得出的结论是IntelliJ可能有一个损坏的缓存,只有通过使其通过符号链接识别罐子才能修复该缓存。尽管我还没有尝试过,但是删除〜/ .gradle / caches和重新加载项目都可能具有相同的效果。

无论哪种方式,经过上述步骤然后撤销它们似乎可以解决问题。