关于java:IntelliJ检查给出“无法解析符号”但仍编译代码

IntelliJ inspection gives “Cannot resolve symbol” but still compiles code

平台:Intellij社区版10.0.3软件开发工具包:JDK1.6.0 U 21操作系统:Windows 7

所以我和Intellij之间有一个奇怪的情况,这让我完全陷入困境。我设置了一个maven项目,并在pom.xml文件中添加log4j作为依赖项。想法检查运行良好,我的单元测试都编译并运行。

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

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

Maven在本地存储库中安装了JAR文件。

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

最后,我将以下依赖项添加到pom.xml文件中(刚好在log4j依赖项之上)。

1
2
3
4
5
<dependency>
    <groupId>jmime</groupId>
    jmime</artifactId>
    <version>3.1.1e</version>
</dependency>

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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文件中获取并识别日志程序导入,这很好。但是,对于所有的HunnSuffic导入,它都会报告:"不能解析符号"ByTyScord/Field/FieldStand",但Buff= =编译"StaskOfFultQuest.Java'正确地编译所有的东西,并且为这个类创建的单元测试运行良好(尽管意图标记为CeaTeE()的调用也是一个问题区域)。

因此,不知何故,intellij忽略了意向子系统的jmime.jar文件。我很困惑,因为log4j依赖关系工作得很好,所有的编译和运行都很好。F12("go to declaration")在记录器导入上工作,但在所有JMIME导入上中断。

哦,还有一件事,如果我转到"项目"窗口中的"包"视图,"com.hunnysoft.jmme"包就会出现,我可以看到我在上面"库"下的代码段中导入的所有类。从pom.xml文件中删除上述依赖项会导致此包消失,编译中断。

似乎检查的类路径被破坏了,但是在设置=>意图编译器区域的任何地方似乎都没有这样的设置(不是我预期的任何这样的设置,我相信这个想法应该已经知道了基于pom文件和jdk的正确类路径)。

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

这是jmime jar文件中的manifest.mf。

1
2
3
4
5
6
7
8
9
10
11
12
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文件中没有看到任何异常。

我的最佳猜测是,问题可能是缺少依赖性问题。但是AfaikJMIME应该是自包含的(JarAnalyzer不提供任何东西,但我不确定如果缺少依赖性JAR,它会不会)。

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


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

在一些奇怪的情况下,编译的类可能会报告错误的信息并混淆想法。验证这个jar中的类使用javap报告正确的名称。


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

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

我的想法版本是12.0.4


对于Gradle用户:

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

您可以右键单击项目窗格下的Gradle文件来执行此操作,但这似乎对我没有任何帮助(我怀疑我的版本中存在错误)。您将知道这是否发生,因为它不会启动您将等待的任何Intellij任务。相反,打开渐变工具窗格,然后单击同步(刷新)按钮。这对我很有效,因为无效的缓存和重新启动都没有。

我自己的情况:我和Gradle一起使用一个scala项目,必须这样做。


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


另外一个步骤是,当我执行文件->使缓存无效并重新启动IDE时,打开一个项目。它在右上角弹出一个烤面包盒,问我是否启用自动导入,解决了这个问题。


这个问题的另一个答案也提到了这个问题,但这一点为我解决了这个问题。我在Intellij之外的一个单独的终端中完成所有构建。所以缓存需要为Intellij应用程序设置适当的权限才能读取它们。

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

1
$ mvn -U idea:idea


另一件要检查的事情是:确保依赖项不重复。在我的例子中,我发现一个显示这种行为的模块被错误地配置为:它依赖于另一个模块,并且它依赖于另一个模块生成的JAR。这意味着每一个重复引用的符号都是模棱两可的。


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

  • File -> Project Strucutre -> Modules
  • 在带有红色下划线的点击模块中
  • 转到"依赖项"选项卡
  • 确保依赖项列表中实际存在红色的依赖项。如果没有,则重命名它们以匹配现有的依赖项名称
  • 如果Intellij没有正确关闭,因此无法正确保存重命名的模块名,则会发生这种情况。


    固定出版了吗?由于2013的"编译器大修",出现的问题最初影响V11/12。对吉拉2014年底的相关问题进行讨论。HTTP//YouTrcC.JETBROUNS.COM/SUMED/IDEA 98425

    JIRA-IDEA 98425也被标记为固定的,但未经验证(V2.0.3)。下面的所有工作都没有帮助解决Windows上的"无法解决的符号"问题

    删除.IDEALLIC13文件夹(然后,文件无效的缓存/重新启动)

    从Maven项目窗口,

    B.1MVN-U思想:想法。执行这个Maven目标假设重新加载依赖项。这在prev中有效,但是自从上一个fri以来,执行这个maven目标失败了,因为它试图重新编译项目(当然它失败了,因为"无法解析符号",这是我试图通过首先运行这个命令来修复的)mvn-version-显示引用了3.2.5的maven版本,并且它正在工作。

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

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

    c.尝试同时启用和禁用此设置:文件->设置->maven->导入->"使用maven3导入项目"

    d.settingsmavenmultiproject build fail policy=结束时失败(而不是默认设置)

    没有效果。对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支持似乎已中断。


    没有其他的回答对我起作用。由于ItILLJ指向错误.m2文件,我的导入没有得到解决。

    iTeliJ版本:ITELLIJ理念20181.5

    我在.m2目录中的位置指向了错误的路径。我所做的就是将intellij重新指向右边的.m2目录并更新它。

    首先,转到:文件->设置->生成、执行、部署->生成工具->Maven

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

    在此之后,转到:文件->设置->构建、执行、部署->构建工具->maven->存储库。

    然后单击更新按钮。


    我的项目结构:

    1
    src -> main -> scala -> mypackages

    有效的:

    右键单击scala文件夹,然后单击"将目录标记为源根目录"。


    我只是有这个问题,它不会消失。我最终清除了~中的intellij config目录,重新构建了我的intellij项目。(这最终只花了大约15分钟,而花了一个小时试图解决缓存文件等问题。)

    请注意,我的猜测是,最初的问题是由EDOCX1的2个原因引起的(NB:2018,链接已经死了,但是存档。ORG有一个页面的拷贝,当这个答案是第一次写的时候)。或者是磁盘空间/内存问题导致Java崩溃。Intellij似乎刚被破坏。


    有时,我只是打开项目结构,单击项目,然后选择一个SDK版本。


    重新导入为我工作的项目。右击project->maven->reimport

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


    在我的缓存无效并重新启动之后,确认我的Maven设置是好的,我仍然看到一个我已经设置为依赖项的模块"不能解析符号"。原来我把它设置在错误的范围。

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


    另一种选择。

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

    安装最新的JDK(它是JDK7 U45),并将Intellij的JDK设置为新的JDK,它就可以工作了。


    在我的例子中,我试图从Intellijidea打开一个Spring引导项目,但遇到了同样的问题,比如无法导入所有与Spring相关的文件。

    然后我做到了:

    File -> Close Project -> Import Project -> Import from external model -> Choose Gradle -> Next -> Select the project from file location -> Finish

    现在一切顺利。

    我在这里看到了很多答案,但最终我找到了解决办法。它可能会用到像我这样的人身上。


    如果您的Maven项目是多模块项目,请检查Intellij是否忽略了某些模块。

  • 单击View(视图)->Tool Windows(工具窗口)->Maven Projects(maven项目),检查是否忽略了某些模块(忽略的模块为灰色,如下图中的gs-multi-module)。
  • enter image description here

  • 右键单击忽略的模块并选择Unignore Projects
  • enter image description here

    然后等待intellij完成索引,然后它将工作。


    对于Intellij IDEA用户,在导入项目之前使用此命令可能会有所帮助:

    建造/建造/Grand Lew理念


    有时,当您创建诸如com.mydomain.something之类的包时,目录结构不会被创建,只剩下一个名为"com.mydomain.something"在这种情况下,您应该创建目录结构,例如

    1
    2
    3
    com
    |_mydomain
      |_something

    建议的解决方案不起作用。我必须通过右键单击pom=>maven=>unignore项目来统一几个项目。

    然后之后

    1
    mvn clean install -T 6 -DskipTests

    在控制台里,Intellij又高兴了。不知道这些项目是如何被忽略的…


    对于Gradle项目:

  • 退出Intellij思想
  • 删除EDCOX1×2目录
  • 删除EDCOX1×3目录
  • 删除中的所有.iml文件
    • windows命令提示:DEL /S /Q *.iml
    • Linux:find . | grep -e .iml$ | xargs rm
  • 使用Gradle将项目重新导入Intellij IDEA

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


    以上的解决方案都没有为我解决。我也有同样的问题,代码编译得很好,但intellij显示它找不到导入。尽管intellij首先建议从代码完成时导入。

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


    在我的例子中,只删除builddir。在这种情况下,File | Invalidate Caches不起作用。

    当我在File | Invalidate Caches之前做Build | Make Project时,一切都很好。


  • 打开"设置"
  • 搜索"maven"
  • 单击"maven"下的"忽略的文件"
  • 取消选中pom.xml文件包含缺少的依赖项
  • 点击"确定"
  • 单击文件->使缓存无效/重新启动…
  • 单击"失效并重新启动"

  • 删除Java中的IML文件和项目中的测试文件夹失效并重新启动。

    它将询问我是否可以删除这些项目。放好。错误将消失。


    "文件->无效缓存和重新启动"将解析所有依赖项。


    check  import Maven projects automatically, fixed my issue

    自动检查导入Maven项目,修复我的问题。我花了两个小时找出我做错了什么。终于修好了。


    对于Maven,

    我尝试了以上所有方法,但找不到解决方案,

    下面是我尝试的步骤(一些解决方案的组合)。

  • 清理

  • MVN理念:清洁

  • 使缓存失效并重新启动
  • 删除在项目结构中看到的所有额外的.iml文件。
  • 在项目的根目录下,运行mvn-idea:idea和mvn-clean-install,重新导入maven项目的所有依赖项。
  • (确保除了项目/子项目.iml文件之外没有其他.iml文件)


    如果我的pom.xml文件配置正确,并且我在intellij中仍然存在maven问题,那么我将执行以下步骤

  • 阅读"最近如何在intellij中使用maven"
  • 确保Intellij配置为使用捆绑的Maven 3
  • 查找并终止正在执行的MeVen 3 RePOS索引的实际Java进程(在ITELLIJ运行时可以终止)。如果索引或依赖项有任何问题不可用(思想库是在pom.xml中配置的)。
  • "intellij/settings/build tools/maven/repositories/"中所有存储库的强制更新。占用大部分时间、磁盘空间和带宽!我花了20多分钟更新了Maven Central Repo的索引。
  • 再次点击从Intellij重新导入所有Maven项目
  • 如果你有多个存储库和一个复杂的项目,那么做一个步骤1-4来离开ITELLIJ和它的恶魔Java进程,如果你有多个存储库和一个复杂的项目,那么你在第二天就同步了。理论上,您可以使用所有流行的索引repo,并同时为所有repo启动索引更新(我假设intellij创建一个队列并逐个运行更新),然后可能需要数小时才能完成(您还需要增加堆空间)。
  • 附笔。我花了好几个小时才理解(步骤3),处理Maven索引更新的IntInLi的Java恶魔进程出错了,我只需要让Inteliji从头开始。问题解决了,甚至没有重新启动Intellij本身。


    导入标准Java库(如Java.BeaS)时遇到困难。

    通过将它指向正确的JRE路径,在我的Redhat7系统上修复了它。

    文件->项目结构->SDK->1.8将"jdk home path:"更改为/usr/lib/jvm/java-1.8.0-openjdk-1.8.0161-2.b14.el7.x86_64,而不是/usr/lib/jvm/java-1.8.0-openjdk-1.8.0161-2.b14.el7_4.x86_64

    前一条到JDK的路径(路径上有个差异)中几乎没有任何内容。它缺少了许多Java库。


    转到文件->项目结构->SDK,检查您的SDK文件路径是否正确。


    或者您导入的文件太大。我的情况是,当我将intellij属性:iead.max.intellisen.filesize(路径为$ide a dir/bin/idea.properties)更改为更大的值(如25000)并重新启动IDE时,问题就消失了。希望这有帮助。


    是什么帮助我解决这个问题:

    我已经有了另一个分支,已经切换到该分支,并用MVN Curror安装构建了项目。一切都好了,然后又转回师父,重新建造这个项目,错误消失了。无效的缓存和重新启动对我没有帮助。


    如果是Maven项目,那么只需转到设置->构建工具->Maven->导入。选中"自动导入Maven项目"复选框。会解决问题的。


    如果没有任何结果,右键单击源目录,将目录标记为"源目录",然后右键单击项目目录和maven->re-import。

    这解决了我的问题。


    埃多克斯为我工作。在这里找到的。花了一个多小时,希望能帮助别人


    对于IDEA 2017.1+Gradle,插件不知何故有缺陷。已尝试所有同步、失效+重新启动,但没有任何效果。根据https://github.com/gradle/gradle/issues/2315,这对我很有用:1。密切的想法2。在命令行中键入Gradle IDEA(应生成3个文件:.iml,.ipr,.iws)三。运行IDEA并打开创建的文件.ipr,这应该从零开始导入您的项目,在这3个文件中有硬连线依赖项


    我换台新电脑时也遇到了类似的问题。

    我复制了所有的IDEA文件(甚至相关的%appdata%—文件夹),但是Maven构建成功,但是IDEA在构建它时没有从依赖项中找到任何类。

    解决方案:我从一个新的干净的想法配置文件开始,从%appdata%-文件夹中删除文件夹。


    在我的例子中,这个问题是在我检查了Maven项目中文件的一个大的重组之后出现的。签出时,我自己的一些未经检查的更改仍处于活动状态。据我所知,这些更改并没有涉及到任何正在重组的文件。

    无效缓存和重新启动对我来说不起作用。工作内容是:

    • 恢复我在大重组结账前所做的更改
    • 重新导入所有maven模块

    使缓存无效对我有效,但在运行应用程序之后出现了相同的错误。

    所以我尝试了(intellij):

    1-菜单栏-重构构建运行工具-单击"生成",然后单击"重建项目"

    2 - MVN清洁

    3-右键单击项目>Maven>生成源和更新文件夹

    希望这对你有用。

    谢谢


    对我起作用的是"马克作为目录源根",在红色标记消失后,红色标记类的目录。似乎因为某种原因,它是没有标记的。