2014-09-29 7 views
11

Ich habe gerade einen seltsamen Fehler festgestellt, als ich die JDK-Version eines neuen Projekts von 7u45 auf 8u20 umgestellt habe. Eine harmlose LogManager Erklärung zu Beginn meiner Klasse wird mit dem folgenden Fehler verweigert:Fehler bei der Verwendung von LogManager (l4j2) mit Java 8 (java.lang.reflect.AnnotatedElement kann nicht aufgelöst werden)

The type java.lang.reflect.AnnotatedElement cannot be resolved. It is indirectly referenced from required .class files 

Dies ist der Code:

public class Class1 { 
    private static Logger log = LogManager.getLogger(Class1.class); 
    ... 

Eklipse schlägt mich den Build-Pfad zu konfigurieren, aber ich habe keine Idee was zu konfigurieren ist, weil ich das zugrunde liegende Problem dieses Fehlers nicht kenne.

Mit dem JDK mit Version 7 funktioniert alles einwandfrei.

Antwort

23

Wenn Sie JDK 8 und eine IDE (oder ein anderes Code Processing Tool/Framework) mit einem eigenen Compiler wie Eclipse verwenden, müssen Sie das Tool auf eine Version mit Java 8 - Unterstützung aktualisieren, auch wenn Sie das nicht verwenden neuere Java 8-Funktionen.

Der Grund ist, dass der Compiler in der Lage sein muss, die neueren Klassendateien der JRE zu laden, um Ihre Software zu kompilieren, die auf diese Klassen verweist.

Manchmal können Sie mit einem älteren Compiler davonkommen, wenn er die neuere Versionsnummer der Klassendateien ignoriert. Einige Typen verwechseln jedoch Dateiparser älterer Klassen, da sie neue Funktionen verwenden, insbesondere AnnotatedElement, die jetzt default-Methoden und Map.Entry, eine interface, die jetzt static Methoden hat.

Es scheint, dass Eclipse keinen Unterschied zwischen Referenzen macht, für die keine Klassendatei gefunden wurde, und Klassendateien, die nicht gelesen werden konnten, wenn "" Klassenname » nicht aufgelöst werden konnte".

Dasselbe gilt für alle Tools und Frameworks, die ECJ als eingebetteten Compiler verwenden.

+0

Okay, scheint Logik. Danke! :) – Corsair

+3

Nur der Vollständigkeit halber gilt das Gleiche, wenn die im Compiler-Fehler genannte Klasse [Map.Entry'] ist (http://docs.oracle.com/javase/8/docs/api/java/util/Map) .Entry.html) (wie in vielen Fragen), da diese 'Schnittstelle' jetzt' statische' Methoden hat ... – Holger

+1

Sie müssen Ihre IDE nicht aktualisieren. Sie können auch ein älteres JDK/JRE installieren und angeben, dass Eclipse die ältere Version verwendet (Fenster> Voreinstellungen> Installierte JREs). Z.B. Ich habe C: \ Programme \ Java \ jdk1.7.0_67 \ jre dort angegeben und der Fehler ist verschwunden. – Jim

1

Wenn Ihnen dies passiert in Tomcat aus Eclipse läuft (question wurde als Duplikat geschlossen und mehrdeutig), gehen Sie zu Einstellungen → Server → Runtime Environments → Tomcat Version → Bearbeiten ... und stellen Sie sicher, dass das ausgewählte JRE entspricht der Tomcat-Version. (Vielleicht müssen Sie einen installieren.)

+0

Gut gemacht, um praktische Ratschläge zu geben, wie man das Problem tatsächlich beheben kann! – Geeb

0

Ich von JRE 8 zu JRE 7 wechseln und Eclipse neu starten dann funktioniert es gut.

0

Ich benutzte Eclipse Helios mit JRE 8 und die Aktualisierung der Software löste das Problem.

Jetzt bin ich mit Eclipse-Mars und funktioniert gut ->https://eclipse.org/downloads/

0

Lösung 1:

Versuchen Sie, die Quellebene zu ändern.

  1. Gehen Sie zu Projekt> Voreinstellungen> Java Compiler.
  2. Projektspezifische Einstellungen aktivieren
  3. Compiler-Compliance-Level auf 1,4 oder darunter einstellen.
  4. Restart

Lösung 2:

  1. einen neuen Arbeitsbereich erstellen.
  2. Kopieren Sie Projektdateien in den neuen Arbeitsbereich.
  3. Projekt in Eclipse importieren und neu erstellen.