Die Meldung "Symbol kann nicht gefunden werden" ist nicht hilfreich

82

Dies ist eine wirklich einfache Frage, und es ist wahrscheinlich eine Einstellung, von der ich nichts weiß, aber Google ist für diese Frage besonders wenig hilfreich. Sie liefert Ergebnisse zu Kompilierungsfehlern und nicht zum Ändern von Kompilierungsfehlermeldungen.

Wenn ich mein Projekt mit maven erstelle, werden Fehlermeldungen angezeigt, die ungefähr wie folgt formatiert sind:

[ERROR] /path/to/source/Main.java:[13,8] Fehler: Symbol kann nicht gefunden werden

Wenn ich mit Ant oder Javac baue, wird mir tatsächlich das Symbol angezeigt, das in der Fehlermeldung nicht gefunden werden kann. Maven gibt mir eine Zeilennummer und eine Zeichenposition, aber die Anzeige des tatsächlichen Symbols wäre hilfreicher. Die obige Zeile ist die einzige Zeile, die für jeden Fehler "Symbol kann nicht gefunden werden" angegeben wird. Es gibt keine Linie darüber oder darunter, die das Symbol angibt. Ich stelle mir vor, es muss eine Möglichkeit geben, Maven dazu zu bringen, mir diese Informationen zu sagen, aber ich weiß nicht, was es ist. Ich habe die Option -e ausprobiert, da mvn mir gesagt hat, ich solle es versuchen, aber es gab einen Maven-Traceback für den Fehler, nicht das eigentliche Symbol.

Irgendeine Hilfe?

Hier ist die Ausgabe von mvn --version

Apache Maven 3.0.4 (rNON-CANONICAL_2012-10-24_11-25_mockbuild; 2012-10-24 07:25:04-0400)
Maven home: /usr/share/maven
Java version: 1.7.0_09-icedtea, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.9.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.6.6-1.fc17.x86_64", arch: "amd64", family: "unix"

Und hier ist eine beispielhafte (nicht hilfreiche) Fehlermeldung, genau wie sie von maven ausgegeben wird (nur mit verkürzten Verzeichnissen):

[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] /path/to/source/SoundEngineFilePanel.java:[33,8] error: cannot find symbol
[ERROR]  class SoundEngineFilePanel
/path/to/source/SoundEngineFilePanel.java:[36,8] error: cannot find symbol
[INFO] 2 errors 
[INFO] -------------------------------------------------------------

Die Symbole, die nicht gefunden werden können, sind "fakeThing" und "fakeThing2", nicht SoundEngineFilePanel.

mattg
quelle
Können Sie einige Versionsinformationen (insbesondere Maven) usw. bereitstellen? Das passiert mir nicht.
Dave Newton
Es ist wahr, dass die Meldung "Symbol kann nicht gefunden werden" nicht sehr hilfreich ist. Ich kann Ihnen meinen Fall mitteilen, in dem mein Code lange Zeit eine bestimmte Methode einer Drittanbieter-Bibliothek verwendet hat, die Methode jedoch irgendwie aus der Drittanbieter-Bibliothek entfernt wurde. Als Maven den Code kompilierte, schlug er fehl. Wenn die Nachricht "Methode nicht gefunden" anstelle von "Symbol kann nicht gefunden werden" gewesen wäre, wäre sie sehr effektiv und weniger zeitaufwendig gewesen.
Atul S.
Menschen, die geneigt sind, eine weitere Antwort auf diese Frage hinzuzufügen. Lesen Sie die Frage sorgfältig durch. Es geht NICHT darum, wie Kompilierungsfehler "Symbol kann nicht gefunden werden" (in Maven) behoben werden. Es geht darum, wie Sie Maven dazu bringen , informativere Kompilierungsfehlermeldungen zu geben . dh Nachrichten, die den Quellcode-Kontext enthalten ... mögen javacund Anttun.
Stephen C

Antworten:

41

Dies ist ein Fehler im Maven-Compiler-Plugin, der sich auf JDK7 bezieht, denke ich. Funktioniert gut mit JDK6.

Peter Svensson
quelle
5
Scheint im Maven-Compiler-Plugin 3.1 behoben zu sein. Siehe die Antwort von George-Papatheodorou .
Jared Beck
29
Dies ist keine Lösung. Der Kompilierungsfehler tritt immer noch in Java 8 auf.
Eta
Begonnen, als Windows 10 abstürzte. Könnte das ein Faktor sein?
TheRealChx101
1
An @Eta (und ungefähr 27 andere, die den obigen Kommentar + 1'ed haben) - Ich denke, Sie verpassen den Punkt. Bei dieser Frage geht es um nicht hilfreiche Nachrichten von Maven. In dieser Antwort wird erläutert, wie Sie die Kompilierungsfehlermeldungen hilfreicher gestalten können. Das Problem, das den Kompilierungsfehler verursacht hat, wird dadurch nicht behoben. Dieses Problem liegt (normalerweise) in Ihrem Quellcode! Siehe Was bedeutet ein Fehler "Symbol kann nicht gefunden werden" oder "Symbol kann nicht aufgelöst werden"? .
Stephen C
35

Update auf 3.1:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version>
    <configuration>
        <source>1.7</source>
        <target>1.7</target>
    </configuration>
</plugin>
George Papatheodorou
quelle
Was ist der beste Weg, um die neueste Version dieses Plugins zu ermitteln? Ich konnte nur diese Seite finden: maven.apache.org/plugins/maven-compiler-plugin/… Danke.
Jared Beck
@JaredBeck scheint, dass Sie das hier finden können: mvnrepository.com/artifact/org.apache.maven.plugins/…
DSimon
6

In meinem Fall lag das Problem in einem untergeordneten JAR, das nicht neu erstellt wurde, da ich eine neue Klasse hinzugefügt habe. Pom.xml dieses untergeordneten JARs war nicht mit meiner fehlgeschlagenen pom.xml als Child-to-Parent-Beziehung verbunden (mithilfe von <parent>Tag). Also habe ich das Kinderglas wieder aufgebaut, nach dem der Fehler verschwunden war.

a.parfenov
quelle
Das war auch mein Problem. Zwar gibt es in Maven sicherlich Fehler, aber ich würde erwarten, dass in den meisten Fällen Maven-Fehler oder Build-Probleme durch solche Szenarien erklärt werden.
Michael M
4

Ich hatte das gleiche Problem. Der Grund war, dass zwei JAR-Dateien nicht über die Maven-Abhängigkeit hinzugefügt wurden. Wenn ich sie ausführte mvn compile, zeigte die Konsole den Fehlerfehler an:

Symbol kann nicht gefunden werden, Klasse ... ".

Etwas reparieren:

  1. Entfernen Sie die JAR-Dateien aus dem Erstellungspfad
  2. Hinzufügen, um einen Pfad zu erstellen
  3. Lauf mvn compile
Ajax
quelle
2
Könnten Sie bitte die Schritte auflisten, mit denen Sie die JAR-Dateien aus Ihrem Erstellungspfad entfernt haben? Wie erhalte ich den gleichen Fehler, wenn ich versuche, meinen Zielordner zu löschen und mit maven neu zu kompilieren? Danke
turnip424
3

Dies tritt aufgrund dieses Problems auch auf, dh beim Umpacken, das Sie in der POM-Datei definiert haben.

Entfernen Sie diese aus der POM-Datei unter dem Maven-Plugin. Es wird klappen

<executions>
    <execution>
        <goals>
             <goal>repackage</goal>
        </goals>
    </execution>
</executions>
Anto Livish A.
quelle
3

In meinem Fall habe ich eine Abhängigkeit mit dem Gültigkeitsbereich als verwendet <scope>test</scope>. Dadurch wurde die Klasse zur Entwicklungszeit verfügbar, aber zum Zeitpunkt der Kompilierung erhielt ich diese Nachricht.

Drehen Sie den Klassenbereich, um <scope>provided</scope>das Problem zu lösen.

Joabe Lucena
quelle
2

Selbst wenn ich Java 7, Maven 2.2.1, verwende und den gleichen Fehler erhalte, habe ich ihn <scope>tests</scope>von meinem POM entfernt und verwendet

mvn clean -DskipTests=true install um meine Projekte erfolgreich zu erstellen, ohne meine Maven-Version zu aktualisieren.

AabinGunz
quelle
"mvn clean -DskipTests = true" install ist ein magischer Befehl! Danke fürs Teilen. (Übrigens habe ich meine <scope> Tests </ scope> nicht berührt)
Eta
1

Wenn Sie von einem anderen Projekt im Arbeitsbereich abhängig sind und diese Projekte nicht ordnungsgemäß erstellt werden, kann ein solcher Fehler auftreten. Versuchen Sie zuerst, solche abhängigen Projekte zu erstellen. Dies kann hilfreich sein

Piyush Gharote
quelle
0

Dies ist keine Funktion von Maven; Es ist eine Funktion des Compilers. Schau genau; Die Informationen, nach denen Sie suchen, befinden sich höchstwahrscheinlich in der folgenden Zeile.

Isaac
quelle
Ich habe den gleichen Fehler bekommen. Der nachfolgende Fehler gab den Namen einer Abhängigkeit an, die im Projekt fehlte (in diesem Fall eine Bibliotheksklasse org.apache.poi.xssf).
John
0

LÖSUNG: @Vor dem Erstellen Ihrer Komponente (mit mvn clean install). Erstellen Sie das gesamte Projekt einmal und erstellen Sie Ihre Komponente erneut

WARUM SO:
Ich bekomme diesen Fehler oft. In den meisten Fällen werde ich versuchen, meine Komponente alleine zu erstellen (da ich an anderer Stelle keine Änderungen vorgenommen habe).

Richtig, aber das zusätzliche Glas, das kürzlich heruntergeladen wurde, hat möglicherweise Auswirkungen auf Änderungen, die von Dritten (innerhalb ihrer Komponente) vorgenommen wurden. Durch eine vollständige mvn-Neuinstallation des gesamten Projekts habe ich viele Male gespart

Ganesh Srini
quelle
-1

Ich vermute, der Compiler beschwert sich über eine ungültige Anmerkung. Ich habe festgestellt, dass Eclipse nicht alle Fehler anzeigt, z. B. ein Komma am Ende eines Arrays in einer Anmerkung. Aber der Standard javactut es.

Asgoth
quelle
Die Linie, über die es sich beschwert, ist fakeThing = new JPanel(). Es ist nur ein Standardfehler "Symbol kann nicht gefunden werden", für den javac "fakeThing" anzeigen würde. Maven zeigt es einfach nicht.
Mattg
-1

Beim Versuch, eine Maven-Installation für ein Projekt auszuführen, trat in Eclipse STS ein ähnliches Problem auf. Ich hatte einige Versionen in den Abhängigkeiten meiner Datei pom.xml für dieses Projekt und die Projekte geändert, auf die diese Abhängigkeiten verweisen. Ich habe es gelöst, indem ich eine Maven-Installation für alle Projekte ausgeführt habe, die ich geändert habe, und dann die Installation für das ursprüngliche Projekt erneut ausgeführt habe.

Stoic_Observer
quelle
-1

Ich hatte das gleiche Problem mit Maven. Es kommt vor, dass mein Problem darin bestand, dass maven die Ordner mit unterschiedlichen Fallnamen generierte. Ich hatte eine .service.MyFile erwartet, aber im Zielordner war es Service / MyFile und Java unterscheidet zwischen Groß- und Kleinschreibung. Ich habe ein paar Stunden gebraucht, um das herauszufinden. Ich empfehle Ihnen, es auszuprobieren.

Aléxia Dorneles
quelle
-1

Im Allgemeinen tritt dieser Fehler auf, wenn sich die Version Ihres Kompilierungscodes von der Ihres geschriebenen Codes unterscheidet. Schreiben Sie beispielsweise Code, der auf xxx-1.0.0.jar basiert, dass eine Klasse Methode A hat, die Methode jedoch in xxx-1.1.0.jar in B geändert wurde. Wenn Sie Code mit xxx-1.1.0.jar kompilieren, wird der Fehler angezeigt.

Ulysses
quelle