785 Stimmen

IntelliJ-Inspektion meldet "Symbol kann nicht aufgelöst werden", kompiliert aber trotzdem Code

Plattform: IntelliJ Community Edition 10.0.3
SDK: jdk1.6.0_21
Betriebssystem: Windows 7

Ich habe also eine seltsame Situation mit IntelliJ, die mich völlig ratlos macht. Ich richte ein Maven-Projekt ein und füge log4j als eine Abhängigkeit in der pom.xml-Datei hinzu. Die IDEA-Inspektionen laufen gut und meine Unit-Tests werden alle kompiliert und ausgeführt.

Ich habe dann die jmime-Bibliothek von hunnysoft zu meinem lokalen Maven-Repository hinzugefügt, indem ich die mvn install:install-Datei wie folgt verwendet habe.

mvn install:install-file -Dfile=jmime.jar -DgroupId=jmime \
-DartifactId=jmime -Dversion=3.1.1e -Dpackaging=jar

Maven hat die jar-Datei problemlos in mein lokales Repository installiert.

Dann ging ich in IntelliJs Einstellungen => Maven => Repository Services und aktualisierte mein lokales Repository (so dass IntelliJ den Inhalt des Repositorys neu indizieren würde).

Schließlich habe ich die folgende Abhängigkeit zu meiner pom.xml-Datei hinzugefügt (direkt über der log4j-Abhängigkeit).

<dependency>
    <groupId>jmime</groupId>
    <artifactId>jmime</artifactId>
    <version>3.1.1e</version>
</dependency>

Ich erstelle nun eine neue Klasse wie folgt:

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;
    }
}

Und jetzt das Seltsame. IntelliJ's Intent-Mechanismus erkennt den Logger-Import in der Maven Pom-Datei einwandfrei. Jedoch für alle hunnysoft Importe meldet es: "Das Symbol 'ByteString/Field/FieldBody' kann nicht aufgelöst werden", BUT Build => Compile 'StackOverflowQuestion.java' kompiliert alles korrekt und der Unit-Test, den ich für diese Klasse erstellt habe, läuft einwandfrei (obwohl die Absichten den Aufruf von create() ebenfalls als Problembereich markieren).

Irgendwo, irgendwie ignoriert IntelliJ also die Datei jmime.jar für das Intention-Subsystem. Ich bin verwirrt, weil die log4j-Abhängigkeit funktioniert gut und alles kompiliert und läuft gut. F12 ("Go To Declaration") funktioniert beim Logger-Import, bricht aber bei allen jmime-Importen ab.

Ach ja, noch etwas: Wenn ich im Fenster "Projekte" die Ansicht "Pakete" aufrufe, erscheint das Paket "com.hunnysoft.jmime" und ich kann ALLE Klassen sehen, die ich im obigen Codeschnipsel unter "Bibliotheken" importiert habe. Wenn ich die oben genannte Abhängigkeit aus der pom.xml-Datei entferne, verschwindet dieses Paket und die Kompilierung wird abgebrochen.

Es scheint, dass der Klassenpfad der Inspektion kaputt ist, aber es scheint nirgendwo in den Bereichen Einstellungen => Intentions | Compiler eine Einstellung dafür zu geben (nicht, dass ich solche Einstellungen erwartet hätte, ich glaube, IDEA sollte den korrekten Klassenpfad auf der Grundlage der pom-Datei und des JDK bereits kennen).

Als letztes Experiment habe ich ein brandneues Standard-J2SE-Anwendungsprojekt erstellt (ohne Maven zu verwenden) und die Datei jmime.jar direkt als eine der Bibliotheken in das Projekt eingefügt. In diesem neuen Projekt stieß ich auf genau die gleichen Probleme wie oben beschrieben.

Hier ist die MANIFEST.MF aus der jmime jar-Datei.

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.

Ich sehe nichts Ungewöhnliches in dieser jar-Datei.

Meine beste Vermutung ist, dass das Problem vielleicht ein Problem mit fehlenden Abhängigkeiten ist. Aber AFAIK jmime soll selbst enthalten sein (JarAnalyzer kommt nicht mit etwas, aber ich bin nicht sicher, es würde, wenn eine Abhängigkeit jar fehlt).

Hat jemand eine IDEE?

1 Stimmen

Siehe auch stackoverflow.com/questions/15046764/ wenn es Symbole nicht auflösen kann, die Teil der Maven-Abhängigkeiten sind [bei mir war es ein fehlendes M2_HOME]

1 Stimmen

2018.3.3. Immer noch der gleiche Fehler...

2 Stimmen

File>Invalidate Caches/Restart hat bei mir in Version 2020.03 funktioniert.

6voto

axiom Punkte 8359

Meine Projektstruktur:

src -> main -> scala -> mypackages

Was funktioniert hat:

Klicken Sie mit der rechten Maustaste auf das scala und klicken Sie auf "Mark Directory as Sources Root".

5voto

Eric Punkte 14911

Für Gradle-Projekte:

  1. Ausfahrt IntelliJ IDEA
  2. Löschen Sie die <problematic-project-root>/.idea Verzeichnis
  3. Löschen Sie die <problematic-project-root>/.gradle Verzeichnis
  4. Alle löschen .iml Dateien in <problematic-project-root>
    • Windows Eingabeaufforderung : DEL /S /Q *.iml
    • linux: find . | grep -e .iml$ | xargs rm
  5. Importieren Sie das Projekt erneut in IntelliJ IDEA con Gradle

4voto

Marco Lackovic Punkte 5260

In IntelliJ IDEA 2020.3 wählen:

  1. Datei > Caches ungültig machen / Neustart... > Ungültig machen und neu starten

  2. Bei Aufforderung mit Vorgefertigte gemeinsame Indizes herunterladen :

    enter image description here

    importieren Sie die gemeinsamen Indizes nicht: Schließen Sie den Dialog oder wählen Sie Weitere Aktionen > Nicht mehr anzeigen

3voto

Shailendra Madda Punkte 19055

In meinem Fall versuche ich, ein Spring-Boot-Projekt von IntellijIdea zu öffnen, und habe das gleiche Problem wie nicht in der Lage, alle springbezogenen Dateien zu importieren.

Dann habe ich es getan:

Datei -> Projekt schließen -> Projekt importieren -> Import aus externem Modell -> Gradle auswählen -> Weiter -> Projekt aus Dateispeicherort auswählen -> Fertigstellen

Jetzt funktioniert alles wie erwartet.

Ich habe hier viele Antworten gesehen, aber ich habe schließlich diese Lösung gefunden. Es kann für jemanden wie mich verwenden.

3voto

Arthur Wu Punkte 141

Manchmal öffne ich einfach die Projektstruktur und klicke auf Projekt, dann eine SDK-Version auswählen .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X