【问题标题】:IntelliJ inspection gives "Cannot resolve symbol" but still compiles codeIntelliJ 检查给出“无法解析符号”但仍编译代码
【发布时间】:2022-01-25 04:08:30
【问题描述】:

平台:IntelliJ 社区版 10.0.3
SDK:jdk1.6.0_21
操作系统:Windows 7

所以我在使用 IntelliJ 时遇到了一个奇怪的情况,这让我完全被难住了。我设置了一个 Maven 项目并将 log4j 作为依赖项添加到 pom.xml 文件中。 IDEA 检查运行良好,我的单元测试全部编译并运行。

然后我使用 mvn install:install-file 将 hunnysoft 的 jmime 库添加到我的本地 maven 存储库,如下所示。

mvn install:install-file -Dfile=jmime.jar -DgroupId=jmime \
-DartifactId=jmime -Dversion=3.1.1e -Dpackaging=jar

Maven 将 jar 文件安装到我的本地存储库中。

然后我进入 IntelliJ 的设置 => Maven => 存储库服务并更新了我的本地存储库(以便 IntelliJ 重新索引存储库内容)。

最后,我在我的 pom.xml 文件中添加了以下依赖项(就在 log4j 依赖项上方)。

<dependency>
    <groupId>jmime</groupId>
    <artifactId>jmime</artifactId>
    <version>3.1.1e</version>
</dependency>

我现在创建一个新类如下:

package com.stackoverflow.question;

import org.apache.log4j.Logger;
import com.hunnysoft.jmime.ByteString;
import com.hunnysoft.jmime.Field;
import com.hunnysoft.jmime.FieldBody;

public class StackOverflowQuestion {
    public Field create(String name, String text) {
        Logger.getLogger(getClass()).debug("create entered");
        FieldBody body = new FieldBody();
        body.setText(new ByteString(text));
        Field field = new Field();
        field.setFieldName(name);
        field.setFieldBody(body);
        return field;
    }
}

现在是奇怪的。 IntelliJ 的意图机制可以很好地识别并识别 maven pom 文件中的 Logger 导入。但是,对于所有 hunnysoft 导入,它报告:“无法解析符号 'ByteString/Field/FieldBody'”,BUT Build => Compile 'StackOverflowQuestion.java' 正确编译所有内容,我创建的单元测试因为这个类运行良好(尽管意图将 create() 的调用也标记为问题区域)。

所以不知何故,IntelliJ 忽略了意图子系统的 jmime.jar 文件。我很困惑,因为 log4j 依赖项工作正常,一切都编译并运行良好。 F12(“Go To Declaration”)适用于 Logger 导入,但会中断所有 jmime 导入。

哦,另一件事,如果我进入“项目”窗口中的“包”视图,则会出现“com.hunnysoft.jmime”包,我可以看到我在代码 sn-p 中导入的所有类上面的“库”下。从 pom.xml 文件中删除上述依赖会导致该包消失,编译中断。

检查的类路径似乎已损坏,但在设置 => 意图 | 中的任何地方似乎都没有此设置编译器区域(不是我期望的任何此类设置,我相信 IDEA 应该已经知道基于 pom 文件和 JDK 的正确类路径)。

作为最后的实验,我创建了一个全新的标准 J2SE 应用程序项目(不使用 maven)并将 jmime.jar 文件作为其库之一直接添加到项目中。我在这个新项目中遇到了与上述完全相同的问题。

这是 jmime jar 文件中的 MANIFEST.MF。

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.5.4
Created-By: 10.0-b23 (Sun Microsystems Inc.)

Name: com/hunnysoft/jmime/
Sealed: true
Specification-Title: Hunny JMIME
Specification-Version: 3.1.1
Specification-Vendor: Hunny Software, Inc.
Implementation-Title: com.hunnysoft.jmime
Implementation-Version: 3.1.1E
Implementation-Vendor: Hunny Software, Inc.

我在这个 jar 文件中没有看到任何异常。

我最好的猜测是,问题可能是缺少依赖问题。但是 AFAIK jmime 应该是自包含的(JarAnalyzer 没有提供任何东西,但我不确定如果缺少依赖项 jar 是否会这样做)。

那么,有人有什么想法吗?

【问题讨论】:

  • 如果它无法解析属于 maven 依赖项的符号,另请参阅 stackoverflow.com/questions/15046764/… [对我来说,这是缺少的 M2_HOME]
  • 2018.3.3.还是一样的错误...
  • File>Invalidate Caches/Restart 在 2020.03 版本中为我工作。

标签: java maven intellij-idea intellij-inspections


【解决方案1】:

首先您应该尝试File | Invalidate Caches,如果没有帮助,请删除IDEA system directory。然后重新导入 Maven 项目,看看是否有帮助。

在某些奇怪的情况下,编译的类可能会报告错误信息并混淆 IDEA。使用 javap 验证此 jar 中的类报告的名称是否正确。

【讨论】:

  • 我删除了项目文件,目录,但直到无效缓存并重新启动才修复它。谢谢你的提示!我想知道是否有某种方法应该自动完成。你会这么想的。我的意思是,我什至完全从 pom.xml 重新导入了项目,它仍然没有“使”它的缓存“无效”。
  • FWIW,这些修复对我不起作用。我有一个依赖于另一个项目的 Maven 项目。构建在 IDEA 10.5 内部和外部工作,但来自其他项目的一些符号在依赖项目中标记为红色。缓存无效并重新启动。没有运气。还删除了 IDEA 文件并重新导入了依赖项目。没有运气。
  • 感谢您的回复。最后,我不得不告诉 IDEA“使用 Maven 3 导入我的 Maven 项目”。在设置->Maven->导入下。在与 support@jetbrains.com 进行长时间的电子邮件交流后发现。
  • 菜单选项现在是“File | Invalidate Caches/Restart”(Android Studio 0.8.2, linux)。
  • invalidate 无论我尝试了多少次都不起作用。我删除了 .idea 文件夹,然后用 build.gradle 重新导入了项目。现在可以了。
【解决方案2】:

以下技巧为我解决了这个问题:

  • 右键单击代码编辑器
  • 将鼠标悬停在 Maven 上并展开
  • 点击重新导入

我的idea版本是12.0.4

【讨论】:

  • 如何在 IntelliJ for Mac OS 中执行此操作?
  • @AnkitRustagi for Mac OS 右键单击​​项目面板下的项目目录。 Maven -> 重新导入。也可以使用热键,双击shift,或者Shift+Command+A,搜索“reimport all maven projects”
  • 右键单击对我来说是一个提示。显然我的 pom.xml 没有标记为 Maven 文件,因此我需要右键单击并标记为 Maven。我启用了“自动导入 Maven 项目”以及之后导入的所有包。
  • 对于 2017.1.x 正在重新导入 maven 项目:View -&gt; Tool Windows -&gt; Maven Projects,然后单击循环箭头图标。
  • 重新导入 Maven 模块对我也有帮助,我很惊讶它没有重新导入,因为依赖项发生了变化......
【解决方案3】:

以上解决方案都不适合我。所做的是手动删除 main.iml 文件,它突然起作用了。

【讨论】:

  • 非常感谢!这也是解决我遇到的问题的唯一解决方案。发生的事情是我的项目被重命名,而 IntelliJ 不知何故没有清除 .idea/modules 下的旧 .iml 文件。删除那些额外的 .iml 文件并重建项目修复了问题。
  • 成功了!伟大的!但如果有人能解释为什么它会起作用,那就太好了。
  • 那个文件在哪里??我删除了 .idl,现在项目结构消失了!!此外,由于iml文件不存在,无法加载设置
  • 完美运行。我尝试更改 JDK,使缓存无效,重新导入项目,但没有任何效果。删除 main.iml 有效。
  • @KansaiRobot 不要删除 .idl,删除 main.idl 文件,它在主文件夹中 :)。它也对我有用。
【解决方案4】:

在同一问题here 的另一个答案中提到了这一点,但仅此一项就为我解决了这个问题。我在 IntelliJ 之外的单独终端中进行所有构建。因此缓存需要为 IntelliJ 应用程序设置适当的权限才能读取它们。

从项目的根文件夹运行它。

$ mvn -U idea:idea

【讨论】:

  • 我认为这可能会有所帮助......但不幸的是,运行它会导致连接超时。无法连接到 repo :(
【解决方案5】:

对于 Gradle 用户:

您可能需要将您的项目与您的build.gradle 文件同步。

您可以在“项目”窗格下右键单击您的 gradle 文件来执行此操作,但是这似乎对我没有任何作用(我怀疑我的版本中存在错误)。您会知道这是否会发生,因为它不会启动您将等待的任何 IntelliJ 任务。相反,open up the Gradle Tool pane,然后单击同步(刷新)按钮。这对我有用,而使缓存无效并重新启动没有。

我自己的情况:我正在使用带有 Gradle 的 Scala 项目并且必须这样做。

【讨论】:

  • 我只是想说明一下,我需要在稍微重构一下构建系统后再次执行此操作;不知何故,IntelliJ 在我的 build.gradle 文件中发现了一些以前没有弹出的问题。最后,能够相当快地完成所有工作。
  • Gradle 工具窗格位于:View &gt; Tool Windows &gt; Gradle
  • @bbarker - 我刚刚将 IntelliJ 更新到 2017 年 8 月 6 日星期日的最新版本。您提到的问题仍然存在.幸运的是,您在 Gradle 工具窗口(视图 -> 工具窗口 -> Gradle)中使用刷新按钮的提示效果很好。
  • 关于 build.gradle 问题的说明:如果您没有运行配置,有时 IntelliJ 会发现不存在的问题。我曾经有一些奇怪的mavenCentral() could not be resolved,直到我重新添加了 jUnit 配置(我通过创建一个新的 Gradle 项目将整个项目移植到 Gradle,然后复制所有源文件)。
  • 不幸的是没有解决我的问题(也没有使缓存失效)。不清楚解决方案,但为我的多个项目重新组织 gradle 构建依赖项删除了错误并成功构建。就我而言,它对主项目使用了错误的依赖项。
【解决方案6】:

一个额外的步骤,当我执行 File -> Invalidate Caches 并重新启动 IDE 时,打开一个项目。它在右上角弹出了一个 toastbox 询问我是否启用自动导入并解决了问题。

【讨论】:

    【解决方案7】:

    要检查的另一件事:确保不重复依赖项。在我的情况下,我发现表现出这种行为的模块配置错误如下:它依赖于另一个模块,并且依赖于另一个模块生成的 jar。这意味着重复引用的每个符号都是模棱两可的。

    【讨论】:

      【解决方案8】:

      项目结构中的模块名称不一致/重复导致我出现此问题。

      1. 转到File -&gt; Project Strucutre -&gt; Modules
      2. 在点击带有红色下划线的模块
      3. 转到“依赖项”选项卡
      4. 确保红色的依赖项确实存在于依赖项列表中。如果不是,请重命名它们以匹配现有的依赖项名称

      当 IntelliJ 未正确关闭并因此无法正确保存重命名的模块名称时,可能会发生这种情况。

      【讨论】:

      • 最后。由于某种原因,我列出了两个模块,“main”和我的项目名称。删除了 main,错误消失了。
      【解决方案9】:

      是否已发布修复程序?由于 2013 年的“编译器大修”,出现的问题最初影响 v11/12。截至 2014 年底,有关 Jira 中的相关问题的讨论。 http://youtrack.jetbrains.com/issue/IDEA-98425

      同样在 Jira 上 IDEA-98425 被标记为已修复未验证(在 v12.0.3 上)。以下解决方法都无法帮助解决 Windows 上的 13.1.1“无法解析符号”问题

      一个。删除 .IdealIC13 文件夹(然后,File \ Invalidate Caches / Restart)

      b.从 Maven 项目 窗口,

      b.1 mvn -U idea:idea ->执行这个maven目标假设重新加载依赖项。这在上一个工作,但自上次 FRI 以来,执行这个 maven 目标失败,因为它试图重新编译项目(当然它失败为“无法解析符号”,这就是我试图通过首先运行这个命令来解决的问题) mvn -version — 显示引用 3.2.5 的 maven 版本并且它正在工作

      b.2 只需右键单击项目,然后重新导入

      b.3 文件\使缓存无效/重新启动

      c。尝试启用和禁用此设置:文件 -> 设置 -> Maven -> 导入 -> “使用 maven3 导入项目”

      d。 Settings \ Maven \ Multiproject build fail policy = Fail at end(而不是默认)

      没有任何作用。 Maven 上的 IntelliJ 支持发生了什么变化。

      https://youtrack.jetbrains.com/issue/IDEA-99302

      来自 JetBeans 发布历史,https://www.jetbrains.com/company/history.jsp

      IntelliJ v14 2014 年 11 月

      IntelliJ v13 2013 年 12 月

      我假设 v12 已修复(尽管 未验证)将包含在后续版本中。任何人与哪个 IntelliJ 版本有类似问题?请分享你的经验。 IntelliJ maven 支持似乎已损坏。

      【讨论】:

      • 问题消失了......在我“打开”项目而不是“导入”项目之后......该死的奇怪。
      • 这对我有用! :) 失去了一天的工作,但它奏效了。我想知道 open 和 import 有什么不同
      【解决方案10】:

      其他答案都不适合我。我的导入没有得到解决,因为 IntelliJ 指向了错误的 .m2 文件。

      IntelliJ 版本:IntelliJ Idea 2018.1.5

      .m2 目录的位置指向了错误的路径。我所做的只是将 IntelliJ 重新指向正确的 .m2 目录并进行更新。

      首先,进入:文件->设置->构建、执行、部署->构建工具->Maven

      我必须将 用户设置文件:本地存储库: 更改为我的 .m2 目录的正确位置。

      之后转到:文件->设置->构建、执行、部署->构建工具->Maven->存储库

      然后点击更新按钮。

      【讨论】:

      • 我的本地存储库指向错误的位置。你的回答救了我的命!!!!!!
      【解决方案11】:

      按“shift”两次>“重新导入所有 Maven 项目”总是对我有用。

      【讨论】:

      • 现在称为“重新加载所有 Maven 项目”。
      【解决方案12】:

      我的项目结构:

      src -> main -> scala -> mypackages
      

      什么有效:

      右击scala文件夹,点击“Mark Directory as Sources Root”。

      【讨论】:

        【解决方案13】:

        如果你的 maven 项目是多模块项目,请检查 intellij 是否忽略了某些模块。

        1. 点击View -> Tool Windows -> Maven Projects,查看是否有部分模块被忽略(忽略的模块为灰色,例如下图中的gs-multi-module)。

        1. 右键单击被忽略的模块并选择Unignore Projects

        然后等待intellij完成索引,之后就可以工作了。

        【讨论】:

          【解决方案14】:

          我嫉妒所有通过文件/无效缓存解决问题的人。我只是花了几个小时尝试这个问题的所有内容以及网络上的其他一些问题。

          魔法菜单项没有为我做这件事,所以我自己通过 nuking %USERPROFILE%\AppData\Local\JetBrains\IntelliJIdea2020.3\caches 使缓存无效

          一旦我这样做并重新启动 IntelliJ (2020.3),索引就会重建,我的错误就消失了。

          【讨论】:

            【解决方案15】:

            对于 Gradle 项目:

            1. 退出IntelliJ IDEA
            2. 删除&lt;problematic-project-root&gt;/.idea目录
            3. 删除&lt;problematic-project-root&gt;/.gradle目录
            4. 删除&lt;problematic-project-root&gt;中的所有.iml文件
              • windows 命令提示符DEL /S /Q *.iml
              • linux:find . | grep -e .iml$ | xargs rm
            5. 使用 Gradle 将项目重新导入 IntelliJ IDEA

            【讨论】:

              【解决方案16】:

              我在使用 Maven Importer JDK 时遇到了问题 - 不知何故,它自己切换到了 JDK 11,但 Maven Project reload 仅适用于 JDK 8。

              【讨论】:

              • 这里一样,必须切换回JDK 1.8.0_252
              【解决方案17】:

              是的,听起来您必须创建包含所需 JAR 的库,并将它们作为依赖项添加到您的模块中。

              【讨论】:

                【解决方案18】:

                另一种选择。

                我在使用 JDK7_07 时也遇到了这个问题。我在这里尝试了所有答案(除了删除 IDEA 系统目录)。但是,我仍然遇到了问题。所以我做的是:

                安装最新的JDK(JDK7_45),并将Intellij的JDK设置为新的,就可以了。

                【讨论】:

                【解决方案19】:

                重新导入项目对我有用。 右键单击项目 -> Maven ->重新导入

                当我执行 File -> Invalidate Caches 并重新启动 IDE 时,打开一个项目。它在右上角“检测到 Maven 更改”上显示了一个对话框,并提供了导入和启用自动导入的选项。即使在这里导入项目后,我也遇到了同样的问题。上述步骤解决了问题。

                【讨论】:

                  【解决方案20】:

                  建议的解决方案无效。我必须通过右键单击 pom => maven => unignore 项目来unignore 几个项目。

                  然后在一个

                  mvn clean install -T 6 -DskipTests
                  

                  在控制台中,IntelliJ 又高兴了。不知道这些项目是如何被忽视的......

                  【讨论】:

                    【解决方案21】:

                    有时,我只是打开项目结构,然后单击项目,然后单击choose a SDK version

                    【讨论】:

                      【解决方案22】:

                      就我而言,我正在尝试从 IntellijIdea 打开一个 Spring Boot 项目,但遇到了同样的问题,例如无法导入所有与 Spring 相关的文件。

                      然后我做了:

                      文件->关闭项目->导入项目->从外部模型导入->选择Gradle->下一步->从文件位置选择项目->完成

                      现在一切正常。

                      我在这里看到了很多答案,但我终于找到了这个解决方案。它可能适用于像我这样的人。

                      【讨论】:

                        【解决方案23】:

                        我刚刚遇到了这个问题,而且它不会消失。我最终清除了~ 中的 IntelliJ 配置目录,并从头开始重建了我的 IntelliJ 项目。 (最终只花了大约 15 分钟,而花一个小时试图解决缓存文件等问题。)

                        请注意,我的猜测是最初的问题是由 javathings.blogspot.com/2009/11/too-many-open-files-in-intellij-idea.html 之类的东西引起的(注意:截至 2018 年,该链接已失效,但 archive.org 在首次编写此答案时就有 a copy of the page -ed .) 或磁盘空间/内存问题导致 Java 崩溃。 IntelliJ 似乎刚刚损坏。

                        【讨论】:

                          【解决方案24】:

                          使我的缓存失效并重新启动后;并确认我的 maven 设置没问题,我仍然看到我明确设置为依赖项的模块的“无法解析符号”。原来我把它设置为错误的范围。

                          您可以通过右键单击您的模块并选择打开模块设置来进行检查。单击依赖项选项卡并验证您的不可解析依赖项的范围是否设置为编译。

                          【讨论】:

                            【解决方案25】:
                            1. 打开“设置”
                            2. 搜索“Maven”
                            3. 点击“Maven”下的“Ignored Files”
                            4. 取消选中 pom.xml 文件包含缺少的依赖项
                            5. 点击“确定”
                            6. 单击文件 -> 使缓存无效/重新启动...
                            7. 点击“失效并重启”

                            【讨论】:

                            • 4中屏幕没有pom.xml,
                            【解决方案26】:

                            就我而言,我的项目使用的是Lombok,而我在 IntelliJ 中缺少 Lombok 插件。安装后一切正常。

                            【讨论】:

                              【解决方案27】:

                              在 IntelliJ IDEA 2020.3 中,选择:

                              1. 文件 > 使缓存失效/重启... > 使缓存失效并重启

                              2. 当提示 下载预建的共享索引

                                不导入共享索引:关闭对话框或选择更多操作 > 不再显示

                              【讨论】:

                                【解决方案28】:

                                就我而言,仅删除了 buildDir。 在这种情况下,File | Invalidate Caches 不起作用。

                                当我在File | Invalidate Caches 之前执行Build | Make Project 时,一切正常。

                                【讨论】:

                                • 它抛出了一个错误:Java error releasevestion 5 is not supported
                                • @KansaiRobot 听起来您已将项目配置为使用 Java 5。现在大多数库至少需要 Java 8,并且没有太多理由使用更低的版本(JDK 中发生了很多事情,两者都是就新特性和性能而言),因此请使用 Java 8 或更高版本重试。
                                【解决方案29】:

                                以上解决方案都没有为我解决这个问题。我有同样的问题,代码编译得很好,但 IntelliJ 显示它找不到导入。即使 IntelliJ 建议首先从代码完成中导入。

                                我的解决方案是将所有内容移至默认包,删除 com.foo.bar 包,然后重新创建它并将所有内容移回。

                                【讨论】:

                                  【解决方案30】:

                                  mvn idea:idea 为我工作。找到它here。花了一个多小时,希望对大家有所帮助

                                  【讨论】:

                                    猜你喜欢
                                    • 2011-03-24
                                    • 2020-08-03
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 2016-10-12
                                    相关资源
                                    最近更新 更多