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

问题描述 投票:476回答:43

平台:IntelliJ Community Edition 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文件中删除上述依赖项会导致此包消失并且编译中断。

似乎检查的类路径被破坏了,但在Settings => Intentions |中,似乎没有任何设置。编译器区域(不是我预期的任何这样的设置,我相信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)。

那么,任何人都有任何IDAs?

java maven intellij-idea intellij-inspections
43个回答
857
投票

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

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


4
投票

我的项目结构:

https://www.jetbrains.com/company/history.jsp

什么有效:

右键单击src -> main -> scala -> mypackages 文件夹,然后单击“将目录标记为源根”。


4
投票

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

IntelliJ版本:IntelliJ Idea 2018.1.5

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

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

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

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

然后单击“更新”按钮。


3
投票

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

请注意,我的猜测是,最初的问题是由~引起的(注意:截至2018年,该链接已死,但当这个答案第一次写入时,archive.org有来自周围的javathings.blogspot.com/2009/11/too-many-open-files-in-intellij-idea.html。)或磁盘空间/内存问题导致Java崩溃。 IntelliJ似乎只是被破坏了。


2
投票

另一种选择。

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

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


2
投票

使我的缓存无效并重新启动后;并确认我的maven设置没问题,我仍然看到“无法解析符号”的模块,我肯定已将其设置为依赖项。结果我把它设置到了错误的范围。

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


2
投票

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

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


2
投票

有时,我只是打开项目结构,然后点击项目,然后a copy of the page


2
投票

在我的情况下,我试图从IntellijIdea打开一个弹簧启动项目得到相同的问题,如无法导入所有弹簧相关的文件。

然后我做了:

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

现在一切都按预期工作正常。

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


2
投票

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

  1. 单击视图 - >工具窗口 - > Maven项目,并检查是否忽略某些模块(忽略的模块为灰色,例如下图中的choose a SDK version)。

gs-multi-module

  1. 右键单击忽略的模块,然后选择enter image description here

Unignore Projects

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


1
投票

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


97
投票

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

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

我的想法版本是12.0.4


1
投票

对于Intellij Idea用户,甚至在导入项目之前,此命令可能有所帮助:

./gradlew build ./gradlew idea


1
投票

就我而言,只删除了buildDir。在这种情况下,enter image description here不起作用。

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


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

1
投票

上述解决方案都没有为我解决。我有同样的问题,代码编译良好,但IntelliJ显示它无法找到导入。即使IntelliJ建议从代码完成开始导入。

我的解决方案是将所有内容移动到默认包中,删除File | Invalidate Caches包,然后再次创建它并将所有内容移回。


1
投票

建议的解决方案不起作用。通过右键单击pom => maven => unignore项目,我不得不忽略几个项目。

之后一个

com.foo.bar

在控制台中,IntelliJ再次开心。不知道项目如何被忽视......


1
投票

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

它会问我可以删除项目。放是的。错误将消失。


1
投票

有时候,当你创建像com.mydomain.something这样的包时,目录结构不会被创建,你留下一个名为“com.mydomain.something”的文件夹,在这种情况下你应该创建目录结构,比如

mvn clean install -T 6 -DskipTests

1
投票

对于Gradle项目:

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

0
投票

如果maven项目然后只是去设置 - >构建工具 - > maven - >导入。选中“自动导入maven项目”复选框。将解决问题。


0
投票

Invalidate Caches为我工作,但在运行应用程序后有同样的错误。

所以我试过(Intellij):

1 - 菜单栏 - 重构|建立|运行|工具 - 单击“构建”然后“重建项目”

2 - MVN清洁

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

希望这对你有用。

谢谢


26
投票

以上解决方案都不适合我。什么做了手动删除main.iml文件,它突然工作。


0
投票

或者你导入的文件太大了。这是我的情况,当我将Intellij属性更改为:iead.max.intellisen.filesize(path is $ {idea dir} /bin/idea.properties)为更大的值,如25000,并重启IDE,问题消失了。希望这可以帮助。


25
投票

对于Gradle用户:

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

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

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


19
投票

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


18
投票

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

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

$ mvn -U idea:idea

13
投票

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


9
投票

项目结构中不一致/重复的模块名称对我来说是个问题。

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

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


8
投票

有固定的发表?由于2013年的“编译器大修”而出现了最初影响v11 / 12的问题。随着Jira相关问题的讨论到2014年底.http://youtrack.jetbrains.com/issue/IDEA-98425

同样在Jira IDEA-98425上标记为固定但未经验证(在v12.0.3上)。下面的解决方法都没有帮助解决Windows上版本13.1.1的“无法解决符号”问题

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

湾从Maven Projects窗口,

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

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

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

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

d。设置\ Maven \ Multiproject构建失败策略=结束时失败(而不是默认)

什么都行不通。在Maven上IntelliJ支持发生了什么。

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

从JetBrains发布历史,qazxsw poi

IntelliJ v14 NOV 2014

IntelliJ v13 DEC 2013

我假设v12固定(虽然未经验证)将被合并到后续版本中。任何一个与IntelliJ版本有类似问题的人?请分享您的经验。 IntelliJ maven支持似乎被打破了。

© www.soinside.com 2019 - 2024. All rights reserved.