java - IntelliJ 检查给出 "Cannot resolve symbol"但仍然编译代码

标签 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’”,但是 Build => Compile 'StackOverflowQuestion.java' 正确编译所有内容,我创建的单元测试因为这个类运行良好(尽管意图将对 create() 的调用也标记为问题区域)。

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

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

检查的类路径似乎已损坏,但在设置 => 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 是否会提供)。

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

最佳答案

首先你应该尝试File |使缓存无效,如果没有帮助,请删除 IDEA system directory .然后重新导入 Maven 项目,看看是否有帮助。

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

关于java - IntelliJ 检查给出 "Cannot resolve symbol"但仍然编译代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43552982/

相关文章:

java - Spring Batch 测试用例忽略 Spring 配置文件

java - 停止maven安装

android-studio - 为什么 Android Studio (3.4) 创建的 .gitignore 不排除所有 `/.idea` ?

java - Intellij 空检查 : unreachable statements

java - mks-integrity xmlapi 的不同输出

java - 在 Java 中读取文本文件并将其添加到对象的 ArrayList 中

java - 使用 GridBagLayout 使组件跨多行

java - 将 log4j 1.x 和 log4j 2 与依赖于 log4j 1.x 的第三方库混合

scala - 使用两个 scala 库运行 scalatest 和 Maven - 一个用于 Maven,另一个用于 Scala Eclipse 插件

java - IntelliJ IDEA - Artifact (JAR)中的 mysql 丢失