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


568

平台: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的Settings => Maven => Repository Services,并更新了我的本地存储库(以便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'”, Build => Compile'StackOverflowQuestion.java'可以正确编译所有内容,并且我为此类创建的单元测试可以正常运行(尽管这些意图也将对create()的调用标记为问题区域)。

因此,在某个地方,IntelliJ以某种方式忽略了意图子系统的jmime.jar文件。我很困惑,因为log4j依赖项可以正常工作,并且一切都可以编译和运行。F12(“转到声明”)对Logger导入有效,但对所有jmime导入均无效。

哦,另一件事,如果我进入“项目”窗口中的“包”视图,则会出现“ com.hunnysoft.jmime”包,并且可以在上面的“代码库”下的代码段中看到导入的所有类。 。从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没有提供任何东西,但是我不确定如果缺少依赖罐,它将不会)。

那么,有人有想法吗?


另请参见stackoverflow.com/questions/15046764/…如果它无法解析属于maven依赖项的符号[对我来说,它是缺少的M2_HOME]
rogerdpack

1
2018.3.3。仍然是同样的错误……
节食者

Answers:


998

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

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


1
我删除了项目文件dirs,但是直到使缓存失效并重新启动它才被删除。谢谢你的提示!我想知道是否没有某种方法可以自动完成此操作。您会这​​样认为。我的意思是,我什至从pom.xml中完全重新导入了该项目,但它仍然没有“无效”它的缓存。
安东尼·斯塔布斯2013年

9
FWIW,这些修复不适用于我。我有一个Maven项目,它依赖于另一个项目。构建工作在IDEA 10.5的内部和外部进行,但是其他项目中的某些符号在从属项目中标记为红色。无效的缓存并重新启动。没运气。还删除了IDEA文件,并重新导入了相关项目。没运气。
pastafarian 2013年

10
感谢您的回复。最终,结果是我不得不告诉IDEA“使用Maven 3导入我的Maven项目”。在“设置”->“ Maven”->“导入”下。经过与support@jetbrains.com的长期电子邮件交换后发现。
pastafarian 2013年

1
菜单选项现在为“文件|无效的缓存/重新启动”(Android Studio 0.8.2,Linux)。
CoatedMoose 2014年

19
无论我尝试多少次,invalidate都不起作用。我删除了.idea文件夹,然后使用build.gradle重新导入了项目。现在可以使用了。
HelpMatters 16/02/11

108

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

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

我的想法版本是12.0.4


如何在IntelliJ for Mac OS中执行此操作?
Ankit Rustagi

对于Mac OS,@ AnkitRustagi右键单击项目面板下的项目目录。Maven->重新导入。您还可以使用热键,双击移位或Shift + Command + A并搜索“重新导入所有Maven项目”
Lakota Lefler,2016年

5
右键单击对我来说是个提示。显然我的pom.xml没有标记为Maven文件,因此我需要右键单击并标记为Maven。我启用了“自动导入Maven项目”,并在此之后导入了所有软件包。
rasyadi

4
对于2017.1.x,正在重新导入Maven项目:View -> Tool Windows -> Maven Projects,然后单击循环箭头图标。
Vielinko

重新导入Maven的模块帮我过,我很惊讶它不重新导入作为依赖无论如何改变...

37

上面的解决方案都不适合我。这样做是手动删除main.iml文件,然后突然起作用。


4
非常感谢!这也是解决我遇到的问题的唯一解决方案。发生的事情是我的项目被重命名,而IntelliJ却以某种方式没有清除.idea / modules下的旧.iml文件。删除那些多余的.iml文件,然后重新构建项目即可解决此问题。

工作了!大!但是,如果有人可以解释它为什么有效,那将是很好的。
Hamza Belmellouki

1
那文件在哪里?我删除了<projectname> .idl,现在项目结构消失了!!此外,由于iml文件不存在,因此无法加载设置
-KansaiRobot

完美的作品。我尝试更改JDK,使缓存无效,重新导入项目,但没有任何效果。删除main.iml作品。
rs_

31

对于Gradle用户:

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

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

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


我只是想说一点,在稍微重构构建系统后,我需要再次执行此操作。不知何故,IntelliJ发现了我的build.gradle文件中的一些以前没有弹出的问题。最终,它能够相当快地完成所有工作。
bbarker

7
Gradle Tool窗格位于: View > Tool Windows > Gradle
UTF_or_Death '16

@bbarker-我刚刚将IntelliJ更新为2017年8月6日(星期日)的最新版本。您提到的问题是,在“项目文件”窗格中右键单击build.gradle文件,仍然没有任何反应。幸运的是,您在Gradle Tool窗口(视图->工具窗口-> Gradle)中使用“刷新”按钮的技巧非常有用。
罗伯特·奥施勒

关于build.gradle问题,请注意:如果您没有运行配置,则IntelliJ有时会发现不存在的问题。在mavenCentral() could not be resolved添加回jUnit配置之前,我曾经有些怪异(我通过制作一个新的Gradle项目将整个项目移植到Gradle,然后将所有源文件复制过来)。
Egor Hans

28

这是在另一个回答同样的问题提到这里,但仅此修复这对我来说。我在IntelliJ之外的单独终端中进行所有构建。因此,缓存需要为IntelliJ应用设置适当的权限才能读取它们。

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

$ mvn -U idea:idea

我认为这可能会有所帮助...但是不幸的是,运行它会使连接超时。无法连接到
仓库

您保存了我(下半天)的一天!
Gavriel

19

另外一个步骤是,当我执行File-> Invalidate Caches并重新启动IDE时,打开一个项目。它在右上角弹出一个烤面包机,问我是否启用自动导入,从而解决了该问题。


14

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


11

项目结构中模块名称不一致/重复对我造成了此问题。

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

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


1
最后。由于某种原因,我列出了两个模块:“ main”和我的项目名称。删除了main,错误消失了。
鲍比(Bobby)

9

是否已发布固定内容?由于早在2013年就进行了“编译器大修”,因此出现了最初影响v11 / 12的问题。到2014年年底为止,有关Jira中的相关问题的讨论。http: //youtrack.jetbrains.com/issue/IDEA-98425

同样在Jira上,IDEA-98425被标记为固定未经验证(在v12.0.3上)。以下变通办法都不能帮助解决Windows 上版本13.1.1的“无法解析符号”问题

一个。删除.IdealIC13文件夹(然后,文件\使缓存无效/重新启动)

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。设置\ Maven \多项目构建失败策略=最终失败(而不是默认值)

没用。Maven上的IntelliJ支持发生了什么。

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

从JetBeans发布历史记录中,https: //www.jetbrains.com/company/history.jsp

IntelliJ v14 2014年11月

IntelliJ v13十二月2013

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


问题消失了……在我“打开”项目而不是“导入”项目之后……该死的奇怪。

这对我有用!:)失去了一天的工作,但它成功了。我想知道开放和导入之间有什么区别
Arran

5

我的项目结构:

src -> main -> scala -> mypackages

什么有效:

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


4

没有其他答案对我有用。我的导入未解决,因为IntelliJ指向错误的.m2文件。

IntelliJ版本:IntelliJ Idea 2018.1.5

我的.m2目录位置指向错误的路径。我要做的所有修复工作都是将IntelliJ重新指向正确的.m2目录并进行更新。

首先,转到:文件->设置->构建,执行,部署->构建工具-> Maven

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

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

然后单击更新按钮。


3

对于另一种选择。

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

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


曾与IntelliJ IDEA的2019.3和捆绑的JDK 11.0.3的问题,并通过手动安装JDK 11.0.4解决了这个问题,在这里看到: stackoverflow.com/questions/61338200/...
本杰明·扎克-

3

我只是遇到了这个问题,它不会消失。我最终抹去了IntelliJ config目录,~并从头开始重建了IntelliJ项目。(最后只花了15分钟,而花了一个小时试图解决缓存文件等问题)

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


3

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

  1. 单击查看->工具窗口-> Maven项目,然后检查是否忽略了某些模块(被忽略的模块为灰色,例如gs-multi-module下图)。

在此处输入图片说明

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

在此处输入图片说明

然后等待intellij完成索引编制,此后它将起作用。


2

使缓存无效并重新启动后;并确认我的Maven设置是可以的,但我仍然看到肯定已设置为依赖项的模块的“无法解析符号”。原来我将其设置为错误的范围。

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


2

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

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



2

就我而言,我试图从IntellijIdea打开一个spring boot项目,遇到了无法导入所有与spring相关的文件之类的问题。

然后我做了:

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

现在一切正常。

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


1

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


1

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

当我Build | Make Project以前做的时候File | Invalidate Caches,一切正常。


它引发了一个错误:不支持Java错误发布版本5
KansaiRobot

@KansaiRobot听起来好像您已将项目配置为使用Java5。如今,大多数库至少都需要Java 8,并且没有太多理由使用较低版本的东西(在JDK中发生了很多事情,包括新功能和性能)。 ,因此请尝试使用Java 8或更高版本。
Egor Hans

1
  1. 打开设置”
  2. 搜索“ Maven”
  3. 单击“ Maven”下的“被忽略的文件”
  4. 取消选中pom.xml文件包含缺少的依赖项
  5. 点击“确定”
  6. 单击文件->使高速缓存无效/重新启动...
  7. 点击“无效并重新启动”

4中的屏幕上没有pom.xml
KansaiRobot

1

以上解决方案都没有为我解决。在代码可以正常编译的情况下,我遇到了同样的问题,但是IntelliJ显示无法找到导入。即使IntelliJ建议从代码完成开始就进行导入。

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


1

建议的解决方案不起作用。我必须忽略几个项目,方法是右键单击pom => maven =>忽略项目。

然后一个

mvn clean install -T 6 -DskipTests

在控制台中,IntelliJ再次感到高兴。不知道项目是如何被忽略的...



1

删除项目内java和test文件夹中的:iml文件,并使其无效并重新启动。

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


1

对我有用的是将标记为红色的类所在的目录“标记为目录源根目录”,然后消失。似乎由于某种原因它未被标记。


1

对于Gradle项目:

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

0

如果是maven项目,则只需转到设置->生成工具-> maven->导入。选中“自动导入Maven项目”复选框。将解决问题。


0

Invalidate Caches对我有用,但是在运行应用程序后出现了相同的错误。

所以我尝试了(Intellij):

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

2-MVN清洁

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

希望这对您有用。

谢谢


0

或您导入的文件太大。当我将Intellij属性更改为iead.max.intellisen.filesize(路径为$ {idea dir} /bin/idea.properties)时,这是我的情况,例如25000,然后重新启动IDE,问题消失了。希望这可以帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.