2017-07-19 1 views
0

Der folgende Code mit Eclipse kompiliert:Verwendung von Annotations (org.eclipse.jdt.annotation.Nullable) kompiliert mit Eclipse, nicht mit javac

@Retention(RetentionPolicy.CLASS) 
@Target({ TYPE_USE }) 
public @interface Nullable { 
    // This is org.eclipse.jdt.annotation.Nullable 
} 

class SomeClass { 

    private final [email protected] Inner b; 

} 

aber es funktioniert nicht mit Oracle javac (Version 1.8. 0_141), das ergibt die folgende Fehlermeldung:

SomeClass.java: error: annotation type not applicable to this kind of declaration 

ich wette, dass javac und Eclipse-Compiler für den Umgang mit TYPE_USE unterscheiden, aber ich konnte keine Abhilfe finden, um die Anmerkung in meinem Code zu halten (das sollte kompilieren in Eclipse und mit Java). Irgendwelche Hinweise auf diese Angelegenheit?

+0

Wäre '@Nullable SomeOtherClass.Inner b' nicht gleich und compilable? Das ist ein seltsames Konstrukt, das ich noch nie gesehen habe. – Seelenvirtuose

+0

'@Nullable SomeOtherClass.Inner b' kompiliert nicht (unter Verwendung von Eclipse Luna), mit dem folgenden Fehler:' Type-Anmerkungen sind nicht zulässig für Typnamen, die für den Zugriff auf statische Member verwendet werden. Wenn ich mich recht erinnere, kompilierte es irgendwann in der Vergangenheit, und wir mussten beim Aktualisieren von Eclipse auf die seltsame Syntax umschalten (wir entwickeln Eclipse-Plugins). –

+0

Ihr Code wird nicht kompiliert, weil er Importanweisungen, eine Deklaration von 'SomeOtherClass' usw. nicht enthält. Bitte stellen Sie eine MWE bereit, vorzugsweise ohne Abhängigkeit von Eclipse-Bibliotheken. Als ich Ihren Code erweitert habe, um die fehlenden Teile hinzuzufügen, kompilierte er für mich mit 'javac 1.8.0_131', aber vielleicht gibt es einen Unterschied in Ihrem Code oder Ihrer Umgebung. – mernst

Antwort

0

Dank Stephan Herrmann habe ich das Problem gefunden. Der Build von javac verwendete die in unserer META-INF/MANIFEST.MF-Datei deklarierte Version von org.eclipse.jdt.annotation: 1.1.0. Diese Version ist jedoch fehlerhaft und wird bei Verwendung des Eclipse-Compilers nicht abgefangen, da der Code mit der Version 2.0.0 kompiliert wird (im Lieferumfang von jdt in Eclipse Luna enthalten). Durch die Angabe der Version 2.0.0 für den Java-Build wurde das Problem behoben.

Verwandte Themen