1. ホーム
  2. java

[解決済み] IntelliJのインスペクションで「シンボルを解決できない」と表示されたが、コードはコンパイルされる

2022-03-14 07:13:40

質問

プラットフォーム IntelliJ Community Edition 10.0.3
SDK: jdk1.6.0_21
OS:Windows 7

そこで、IntelliJで奇妙な状況が発生し、完全に行き詰っています。 私はMavenプロジェクトをセットアップし、pom.xmlファイルに依存関係としてlog4jを追加します。 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 => 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のインポートはすべて、次のように報告されます:"Cannot resolve symbol 'ByteString/Field/FieldBody'", しかし Build => Compile 'StackOverflowQuestion.java' はすべてを正しくコンパイルし、このクラス用に作成したユニットテストも問題なく実行できます(ただし、create()への呼び出しも問題領域として意図的にマークされています)。

つまり、どこかで、どういうわけか、IntelliJ は intention サブシステムの jmime.jar ファイルを無視しているのです。 log4j依存は問題なく動作し、すべてがうまくコンパイルされ実行されるので、私は混乱しています。 F12 ("Go To Declaration") は Logger インポートでは機能しますが、すべての jmime インポートでは壊れます。

ああ、もうひとつ、"Projects" ウィンドウの 'Packages' ビューに行くと、"com.hunnysoft.jmime" パッケージが現れ、上記のコードスニペットでインポートしたすべてのクラスが "Libraries" に見えているのですが、これは何ですか? pom.xml ファイルから上記の依存関係を削除すると、このパッケージがなくなり、コンパイルが中断されます。

検査のクラスパスが壊れているようですが、設定 => Intentions | Compiler のエリアのどこにもこのための設定はないようです(そのような設定を期待していたわけではなく、IDEAはすでにpomファイルとJDKに基づいて正しいクラスパスを知っているはずだと思います)。

最後の実験として、(mavenを使わずに)全く新しい標準的なJ2SEアプリケーション・プロジェクトを作成し、jmime.jarファイルをライブラリの1つとしてプロジェクトに直接追加してみました。 この新しいプロジェクトでも、上記とまったく同じ問題が発生しました。

以下は、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が見つからない場合は表示されないと思います)。

そこで、どなたかIDEAをお持ちの方はいらっしゃいませんか?

解決方法は?

まず最初に File | Invalidate Caches を削除し、それでもだめな場合は IDEAシステムディレクトリ . その後、Mavenプロジェクトを再インポートして、それがうまくいくかどうかを確認します。

奇妙なケースでは、コンパイルされたクラスが間違った情報を報告し、IDEAを混乱させることがあります。このjarのクラスが正しい名前を報告しているか、以下の方法で確認してください。 ジャバップ .