2014-09-29 9 views
11

Po prostu napotkałem dziwny błąd podczas zmiany wersji JDK nowego projektu z 7u45 na 8u20. Nieszkodliwe deklaracja LogManager na początku mojej klasie jest odmówił z powodu następującego błędu:Błąd podczas używania LogManager (l4j2) z Java 8 (java.lang.reflect.AnnotatedElement nie można rozwiązać)

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

Jest to kod:

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

Eclipse proponuje mi skonfigurować ścieżkę kompilacji, ale nie mają Pomysł co skonfigurować, ponieważ nie znam podstawowego problemu tego błędu.

Korzystanie z JDK w wersji 7, wszystko działa dobrze.

Odpowiedz

23

Korzystając z JDK 8 i IDE (lub dowolnego innego narzędzia/ramy do przetwarzania kodu) z własnym kompilatorem, takim jak Eclipse, należy zaktualizować narzędzie do wersji z obsługą Java 8, nawet jeśli nie korzystasz z nowsze funkcje Java 8.

Powodem jest to, że kompilator musi mieć możliwość załadowania nowszych plików klas środowiska JRE w celu skompilowania oprogramowania, które odwołuje się do tych klas.

Czasami można uciec ze starszym kompilatorem, gdy ignoruje on nowszą wersję pliku klasy. Jednak niektóre typy będą mylić starsze analizatory plików klas, ponieważ używają nowych funkcji, w szczególności AnnotatedElement, które teraz mają metody default i Map.Entry, interface, które obecnie mają metody static.

Wygląda na to, że Eclipse nie robi różnicy między referencjami, dla których nie można znaleźć pliku klasy, a plikami klas, których odczytanie nie powiodło się, gdy "" nazwa klasy " nie może zostać rozwiązany".

To samo dotyczy wszystkich narzędzi i struktur używających ECJ jako wbudowanego kompilatora.

+0

OK, wydaje się logiczne. Dzięki! :) – Corsair

+3

Tylko dla kompletności, to samo dotyczy, jeśli klasa wymieniona w błędzie kompilatora jest ['Map.Entry'] (http://docs.oracle.com/javase/8/docs/api/java/util/Map .Entry.html) (jak w wielu pytaniach), ponieważ 'interfejs' ma teraz' statyczne' metody ... – Holger

+1

Nie musisz aktualizować swojego IDE. Możesz także zainstalować starszy JDK/JRE i określić, że Eclipse używa starszej wersji (Okno> Preferencje> Zainstalowane JRE). Na przykład. Podałem C: \ Program Files \ Java \ jdk1.7.0_67 \ jre tam i błąd zniknął. – Jim

1

Jeśli to się zdarzy w Tomcat działa od wewnątrz Eclipse (question został zamknięty jako duplikat i przekierowuje tutaj), przejdź do Ustawienia → Server → Runtime środowisk → Tomcat wersji → Edytuj ... i upewnij się, że wybrany JRE dopasowuje Wersja Tomcat. (Może musisz zainstalować jeden.)

+0

Dobra robota za udzielenie praktycznej porady, jak właściwie rozwiązać problem! – Geeb

0

Zmieniam z JRE 8 na JRE 7 i zrestartuję Eclipse, wtedy działa dobrze.

0

Rozwiązanie 1:

Spróbuj zmienić poziom źródłowy.

  1. Przejdź do Project> Preferences> Java Compiler.
  2. Włącz Ustawienia specyficzne dla projektu
  3. Ustaw poziom zgodności kompilatora na 1.4 lub mniejszy.
  4. Restart

Rozwiązanie 2:

  1. Utwórz nowy obszar roboczy.
  2. Skopiuj pliki projektu do nowego obszaru roboczego.
  3. Importuj projekt do zaćmienia i odbuduj.
Powiązane problemy