我正在IntelliJ中执行Gradle项目,并且IntelliJ无法识别某些软件包。当我转到项目结构->模块-> <my module>
->依赖关系时,包含这些包的jar文件就在那里。 (我已经用jar tfv <file>
检查了jar文件,以确保有问题的类在文件中。)
有问题的类为红色,将它们悬停在它们上时,出现诸如“无法解析符号'somepackagename'”或“无法解析符号'SomeClassName'”之类的错误。
但是,gradle项目可以从命令行正常编译。
我已经尝试了所有可以找到的现有建议,但是到目前为止,没有任何帮助。首先,我已经尝试过:
如何使IntelliJ识别这些jar文件中的软件包?
答案 0 :(得分:3)
我在多项目 Gradle 构建中也遇到过这个问题,它仍然可以用最新的(在撰写本文时)IntellijIDEA 2020.3.2
重现。看起来像是某种内部缓存问题,因为即使 IDEA 抱怨它无法识别可以成功执行构建的类。
最初我通过使缓存无效并重新启动 IDEA 来修复它,正如这里所建议的,但后来发现如果我在 Gradle 工具窗口中重新加载项目,它就会消失:
对我来说它每次都有效。
答案 1 :(得分:1)
我有同样的问题。我的IntelliJ无法识别build.gradle中的某些依赖项。我的猜测是它是一个缓存的东西。所以我做了以下事情:
删除gradle缓存目录。
rm -rf ~/.gradle/caches
重新启动IntelliJ并刷新gradle依赖项。
这对我有用,似乎是一个简单的解决方案。
答案 2 :(得分:0)
答案 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和重新加载项目都可能具有相同的效果。
无论哪种方式,经过上述步骤然后撤销它们似乎可以解决问题。