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

时间:2011-05-06 01:24:09

标签: java maven intellij-idea 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

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 =&gt;编译'StackOverflowQuestion.java'正确编译所有内容,我为这个类创建的单元测试运行正常(虽然意图标记调用create()作为问题区域)。

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

哦,另外一件事,如果我转到“Projects”窗口的“Packages”视图中,会出现“com.hunnysoft.jmime”包,我可以看到我在上面的代码片段中导入的所有类“库”。从pom.xml文件中删除上述依赖项会导致此包消失并且编译中断。

检查的类路径似乎已损坏,但在Settings =&gt;中似乎没有任何设置。意图|编译器区域(不是我预期的任何这样的设置,我相信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吗?

56 个答案:

答案 0 :(得分:843)

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

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

答案 1 :(得分:95)

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

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

我的想法版本是12.0.4

答案 2 :(得分:25)

对于Gradle用户:

您可能需要将项目与<script> var canvas = document.getElementById('myCanvasCircle'), ctx = canvas.getContext('2d'), circle = {}, drag = false, circleMade = false, mouseMoved = false; function draw() { ctx.beginPath(); ctx.arc(circle.X, circle.Y, circle.radius, 0, 2.0 * Math.PI); ctx.stroke(); } function mouseDown(e) { ctx.restore(); circle.startX = e.pageX - this.offsetLeft; circle.startY = e.pageY - this.offsetTop; circle.X = circle.startX; circle.Y = circle.startY; if (!circleMade) { circle.radius = 0; } drag = true; } function mouseUp() { drag = false; circleMade = true; if (!mouseMoved) { circle = {}; circleMade = false; ctx.clearRect(0, 0, canvas.width, canvas.height); } mouseMoved = false; ctx.save(); } function mouseMove(e) { if (drag) { mouseMoved = true; circle.X = e.pageX - this.offsetLeft; circle.Y = e.pageY - this.offsetTop; if (!circleMade) { circle.radius = Math.sqrt(Math.pow((circle.X - circle.startX), 2) + Math.pow((circle.Y - circle.startY), 2)); } ctx.clearRect(0, 0, canvas.width, canvas.height); draw(); } } function init() { canvas.addEventListener('mousedown', mouseDown, false); canvas.addEventListener('mouseup', mouseUp, false); canvas.addEventListener('mousemove', mouseMove, false); } init(); </script> 文件同步。

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

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

答案 3 :(得分:22)

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

答案 4 :(得分:19)

当我执行文件时,还有一个额外的步骤 - &gt;使高速缓存无效并重新启动IDE,打开一个项目。它在右上方弹出一个toastbox,询问我是否启用自动导入,这解决了问题。

答案 5 :(得分:17)

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

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

$ mvn -U idea:idea

答案 6 :(得分:12)

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

答案 7 :(得分:9)

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

  1. 转到File -> Project Strucutre -> Modules
  2. 单击带有红色下划线的模块
  3. 获得“依赖关系”标签
  4. 确保依赖项列表中实际存在红色的依赖项。如果没有,请重命名它们以匹配现有的依赖项名称
  5. 当IntelliJ未正确关闭,因此无法正确保存重命名的模块名称时,可能会发生这种情况。

答案 8 :(得分:4)

我嫉妒你们所有通过文件/无效缓存解决问题的人。我只是花了几个小时在这个问题上尝试了所有的方法,还有一些来自网络的其他问题。

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

自己使缓存无效

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

答案 9 :(得分:4)

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

IntelliJ版本: IntelliJ Idea 2018.1.5

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

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

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

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

,然后单击“更新”按钮。

答案 10 :(得分:4)

我的项目结构:

src -> main -> scala -> mypackages

什么有效:

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

答案 11 :(得分:3)

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

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

答案 12 :(得分:3)

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

enter image description here

答案 13 :(得分:2)

重新导入项目对我有用。 右键单击项目 - &gt; Maven - &gt; Reimport

当我做文件时 - &gt;使高速缓存无效并重新启动IDE,打开一个项目。它显示了右上角“检测到Maven更改”的对话框,并提供了导入和启用自动导入的选项。即使在这里导入项目后,我也遇到了同样的问题。上面的步骤解决了这个问题。

答案 14 :(得分:2)

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

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

答案 15 :(得分:2)

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

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

enter image description here

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

enter image description here

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

答案 16 :(得分:2)

我在使用 Maven Importer JDK 时遇到问题 - 它以某种方式将自身切换到 JDK 11,但 Maven 项目重新加载仅适用于 JDK 8。

enter image description here

答案 17 :(得分:2)

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

然后我做了:

  

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

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

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

答案 18 :(得分:2)

另一种选择。

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

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

答案 19 :(得分:2)

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

答案 20 :(得分: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
  6. 将项目重新导入到 IntelliJ IDEA

答案 21 :(得分:1)

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

./ gradlew build / gradlew idea

答案 22 :(得分:1)

有时候,当你创建像com.mydomain.something这样的包时,目录结构不会被创建而你只剩下一个文件夹 &#34; com.mydomain.something&#34;在这种情况下,您应该创建目录结构,如

com
|_mydomain
  |_something 

答案 23 :(得分:1)

我尝试使缓存无效,这对我没有用。

但是,我尝试从Platform Settings(平台设置)中删除jdk,然后将其重新添加即可。

这是操作方法。

Project Settings -> SDKs -> Select the SDK -> Remove (-) -> Add it back again (+)

答案 24 :(得分:1)

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

答案 25 :(得分:1)

建议的解决方案不起作用。我不得不 unignore 几个项目,右键点击pom =&gt; maven =&gt; unignore项目。

之后

mvn clean install -T 6 -DskipTests
在控制台中,IntelliJ再次感到高兴。不知道这些项目是如何被忽视的......

答案 26 :(得分:1)

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

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

答案 27 :(得分:1)

  1. 打开&#34;设置&#34;
  2. 搜索&#34; Maven&#34;
  3. 点击&#34;忽略的文件&#34;在&#34; Maven&#34;
  4. 取消选中包含缺少的依赖项的pom.xml文件
  5. 点击&#34;确定&#34;
  6. 点击文件 - &gt;无效缓存/重新启动...
  7. 点击&#34;无效并重新启动&#34;

答案 28 :(得分:1)

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

答案 29 :(得分:1)

在我的情况下,只删除了buildDir。 在这种情况下,File | Invalidate Caches不起作用。

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

答案 30 :(得分:0)

就我而言,一位同事向项目添加了Lombok ,我不得不安装Idea Lombok插件。就您而言,可能是其他需要插件的东西。

答案 31 :(得分:0)

在IntelliJ IDEA 2020.3中,选择:

  1. 文件> 使缓存无效/重新启动... > 无效并重新启动

  2. 在出现下载预建共享索引提示时:

    enter image description here

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

答案 32 :(得分:0)

以前的答案对我不起作用。从版本2020.1切换到2018.2,一切似乎都很好。

答案 33 :(得分:0)

对于 Ivy 用户和 IntelliJIdea2020.xx

如果对已经回答的问题没有任何帮助,
关闭 IntelliJ 并完全删除文件夹:
C:\Users\{用户名}\AppData\本地\JetBrains\IntelliJIdea2020.xx
重新启动 IntelliJ 项目,它应该可以解决之前未正确加载的依赖项。

答案 34 :(得分:0)

我测试了上述所有解决方案,最后决定手动清空Maven存储库(实际上,我删除了Linux上的.m2文件夹)。它成功了。

答案 35 :(得分:0)

就我而言,我必须执行以下操作:

  • 关闭项目
  • 关闭想法
  • 删除 .idea 项目目录
  • 删除(idea.system.path)目录(非常重要)
  • 开始构思

您可以在此处找到您的 idea.system.path:https://intellij-support.jetbrains.com/hc/en-us/articles/206544519-Directories-used-by-the-IDE-to-store-settings-caches-plugins-and-logs

答案 36 :(得分:0)

1,在您的pom文件中找到找不到的包。 2,然后从本地存储库中删除它们。

我的项目遇到了这个问题,因为pom中的一个jar无法正确加载。

答案 37 :(得分:0)

验证成功。我的想法版本是2019.2

快速修复: 1.使用maven安装您依赖的模块,然后重新导入所有模块 2.编译当前模块,如果仍然找不到,请关闭所有提示窗口,重新启动提示。

答案 38 :(得分:0)

当依赖项jar也是Fat Jar时,这似乎发生在我身上。幸运的是,在将其制成非胖子罐之后,我就控制了胖子罐的建造,然后一切正常。此处对任何答案或评论的其他修复均无济于事。也可能值得注意的是,我的代码在Kotlin中,并且Fat Jar也捆绑了一些Kotlin依赖项。

答案 39 :(得分:0)

无效缓存/重新启动的第一条建议对我不起作用,其他解决方案也没有。最终导致我的Maven仓库被错误地设置,我通过手动覆盖settings.xml和存储库目录来解决此问题:

文件-> 设置 ...-> 构建,执行,部署-> 构建工具- > Maven

然后针对用户设置文件本地存储库,检查覆盖,并将其指向正确的settings.xml和存储库目录。

答案 40 :(得分:0)

check  import Maven projects automatically, fixed my issue

自动检查导入Maven项目,解决了我的问题。我花了两个小时才弄清楚我做错了什么。终于能够修复它。

答案 41 :(得分:0)

对于MAVEN,

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

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

  1. mvn clean

  2. MVN idea:clean

  3. 使缓存无效并重新启动
  4. 删除在项目结构中看到的所有其他.iml文件。
  5. 在项目的根目录下,运行mvn idea:idea和mvn clean install,以重新导入maven项目的所有依赖项。

(确保除了项目/子项目的.iml文件之外,没有其他.iml文件)

答案 42 :(得分:0)

如果我所有的pom.xml文件都配置正确,但是在IntelliJ中我仍然遇到Maven问题,请执行以下步骤

  1. Read how to use maven in IntelliJ lately
  2. 确保将IntelliJ配置为使用捆绑的Maven 3
  3. 查找并 TERMINATE 的实际Java进程正在执行IntelliJ的Maven 3回购索引(可在IntelliJ运行时完成终端操作)。如果索引或依赖项没有任何问题(在pom.xml中配置了思想库)。
  4. 强制更新“ IntelliJ /设置/构建工具/ Maven /存储库/”中的所有存储库。 占用大部分时间,磁盘空间和带宽!花了20多分钟来更新Maven中央存储库的索引。
  5. 命中再次从IntelliJ导入所有Maven项目
  6. 如果您有多个存储库和一个复杂的项目,那么执行1-4的步骤以使IntelliJ及其恶魔Java进程整夜运行是一个好习惯,因此,第二天所有内容都将保持同步。理论上,您可以使用all popular indexed repos out there并同时为所有存储库启动索引更新(我想IntelliJ创建了一个队列并一个接一个地运行更新),这可能需要几个小时才能完成(您将需要增加堆空间为此)。

P.S。 我花了几个小时来了解(第3步),IntelliJ的用于处理maven索引更新的java恶魔进程做错了什么,我只需要使IntelliJ从头开始即可。 问题已经解决,甚至没有重新启动IntelliJ本身。

答案 43 :(得分:0)

导入标准java库(例如java.beans。*

)时遇到问题

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

文件&GT; ProjectStructure-&GT; SDKs-&GT; 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的前路径(路径中的_4差异)几乎没有任何内容。它缺少许多java库。

答案 44 :(得分:0)

转到文件 - &gt;项目结构 - &gt; SDK并检查您的SDK文件路径是否正确。

答案 45 :(得分:0)

对我有用的是&#34; Mark作为目录源root&#34;红色标记类所在的目录,红色标记消失后。似乎由于某种原因它没有标记。

答案 46 :(得分:0)

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

我有另一个分支,已切换到该分支并使用mvn clean install构建项目。一切都很好,然后切换回主人并再次构建项目,错误消失了。无效的缓存和重启对我没有帮助。

答案 47 :(得分:0)

"File -> Invalidate Cache and Restart" will resolve all dependencies.

答案 48 :(得分:0)

如果没有问题,请右键单击您的源目录,将目录标记为&#34;源目录&#34;然后右键单击项目目录和maven - &gt;重新导入。

这解决了我的问题。

答案 49 :(得分:0)

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

答案 50 :(得分:0)

对于Idea 2017.1 + Gradle,该插件有点儿错误。尝试所有同步,无效+重启,没有任何工作。根据{{​​3}},这对我有用: 1.关闭理念 2.在命令行中键入gradle idea(应生成3个文件:.iml,.ipr,.iws) 3.运行想法并打开创建的文件.ipr,这应该从头开始导入您的项目,在这3个文件中使用硬连线依赖

答案 51 :(得分:0)

当我切换到新电脑时,我遇到了类似的问题。

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

解决方案:通过从%APPDATA%文件夹中删除文件夹,我开始使用新的干净IDEA配置文件

答案 52 :(得分:0)

在我的情况下,在我检查了maven项目中文件的大量重组后,出现了这个问题。在退房时,我还有一些未经检查的更改仍处于活动状态。据我所知,这些更改不是针对任何正在重组的文件。

使缓存无效并重新启动对我不起作用。 工作是什么:

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

答案 53 :(得分:0)

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

答案 54 :(得分:0)

无效的缓存为我工作但在运行应用程序后出现了同样的错误。

所以我尝试了( Intellij ):

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

2 - MVN clean

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

希望这适合你。

由于

答案 55 :(得分:0)

如果maven项目然后只是去设置 - &gt;构建工具 - &gt; maven - &gt;导入。 选中复选框&#34;自动导入maven项目&#34;。 将解决问题。