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

Kev*_*tze 521 java intellij-idea maven intellij-inspections

平台: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
Run Code Online (Sandbox Code Playgroud)

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

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

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

<dependency>
    <groupId>jmime</groupId>
    <artifactId>jmime</artifactId>
    <version>3.1.1e</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在为了古怪.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.
Run Code Online (Sandbox Code Playgroud)

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

我最好的猜测是,问题可能是缺少依赖性问题.但AFAIK jmime应该是自包含的(JarAnalyzer没有提出任何东西,但我不确定如果缺少依赖jar).

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

Cra*_*der 926

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

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

  • @pastafarian,support@jetbrains.com是我=) (98认同)
  • 无论多少次尝试,无效都无效.我删除了.idea文件夹,然后使用build.gradle重新导入项目.它现在有效. (14认同)
  • 谢谢你的回复.事实证明,最后,我必须告诉IDEA"使用Maven 3导入我的Maven项目".在Settings-> Maven-> Importing下.与support@jetbrains.com进行长时间的电子邮件交流后发现. (9认同)
  • FWIW,这些修复程序对我不起作用.我有一个maven项目,它依赖于另一个项目.在IDEA 10.5内部和外部构建工作,但是其他项目中的一些符号在依赖项目中标记为红色.缓存无效并重新启动.没运气.还删除了IDEA文件并重新导入了依赖项目.没运气. (8认同)
  • 我删除了项目文件和目录,但直到无效缓存并重新启动才修复它。谢谢你的提示!我想知道是否有某种方法应该自动完成。你会这么认为。我的意思是,我什至完全从 pom.xml 重新导入了该项目,但它仍然没有“使”它的缓存“无效”。 (2认同)
  • IntelliJ 应该为你做这种事情。糟糕的 IDE,VS Code 没有优点。 (2认同)

小智 102

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

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

我的想法版本是12.0.4

  • 右键单击是我的提示.显然我的pom.xml没有标记为maven文件,因此我需要右键单击并标记为Maven.我启用了"自动导入Maven项目"以及之后导入的所有包. (4认同)
  • 对于2017.1.x正在进行重新进口的maven项目:``View - > Tool Windows - > Maven Projects``,然后点击循环箭头图标. (3认同)

cer*_*ier 33

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

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

bba*_*ker 29

对于Gradle用户:

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

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

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

  • Gradle Tool窗格位于:`View> Tool Windows> Gradle` (7认同)

Tom*_*Tom 21

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

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

$ mvn -U idea:idea
Run Code Online (Sandbox Code Playgroud)

  • 你拯救了我(后半天)的一天! (3认同)

Mat*_*hen 19

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


Lan*_*uhn 13

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


Bab*_*yan 11

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

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

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


cb4*_*cb4 9

2022 年更新

IntelliJ 2022.1 有一个交互式的分步过程File -> Repair IDE。它会引导您依次完成 5 个步骤,在使所有项目的缓存失效之前尝试解决当前项目的此问题。来自 IDEA 文档

  1. 刷新项目索引
  2. 重新扫描项目索引
  3. 重新开放项目
  4. 删除共享索引
  5. 重建索引项目
  6. 使缓存无效并重新启动

步骤 1-3 为我的项目修复了该问题。

在 v2022.3 和新 UI 中,此设置现在位于File -> Cache Recovery -> Repair IDE. 您还可以从那里选择单个步骤。


小智 8

有固定的发表?由于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)

湾 从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

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

IntelliJ v14 NOV 2014

IntelliJ v13 DEC 2013

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


Tim*_*Tim 8

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

IntelliJ 版本:IntelliJ Idea 2018.1.5

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

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

我必须将User settings file:Local repository:更改为我的 .m2 目录的正确位置。

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

并单击更新按钮。


Chi*_*iya 7

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

在此处输入图片说明

  • 现在它被称为“重新加载所有 Maven 项目”。 (4认同)

axi*_*iom 6

我的项目结构:

src -> main -> scala -> mypackages
Run Code Online (Sandbox Code Playgroud)

什么工作:

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


Hou*_*ser 6

我在使用 Maven Importer JDK 时遇到了问题 - 不知何故它自动切换到 JDK 11,但 Maven 项目重新加载仅适用于 JDK 8。

在此输入图像描述


Sea*_*ene 5

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

  1. 单击 View -> Tool Windows -> Maven Projects,然后检查是否忽略了某些模块(忽略的模块为灰色,例如gs-multi-module在下图中)。

在此处输入图片说明

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

在此处输入图片说明

然后等待intellij完成索引,之后它就会工作。


Eri*_*ric 5

对于 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


Jos*_*osh 5

我嫉妒所有通过 File / Invalidate 缓存解决问题的人。我只是花了几个小时尝试关于这个问题的所有内容,以及来自网络的其他一些问题。

魔法菜单项对我不起作用,所以我自己通过核弹使缓存无效 %USERPROFILE%\AppData\Local\JetBrains\IntelliJIdea2020.3\caches

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