2009-11-19 5 views
11

Ich möchte eine Quelldatei haben, die mit javac/ecj auf Java 5, aber nicht auf Java 6 kompiliert werden kann (auch wenn die zugrunde liegende Java-Laufzeit Java 6 ist).Gibt es ein Java-Programm-Snippet, das mit einem Java 5-Compiler auf JRE 6 kompilieren kann, aber nicht mit einem Java 6-Compiler?

Dies ist sicher, dass die Compiler-Ebene in Eclipse 3.5 mit installiertem Java 6 korrekt eingestellt ist, aber das Ergebnis auf einer Java 5-Installation ausgeführt werden muss.

Für Java 1.4 könnte ich "enum" als Variablennamen verwenden (was unter Java 5 und höher fehlschlägt), aber ich kann keinen ähnlichen Ansatz für Java 5 versus 6 (und höher) finden.

Vorschläge?

+0

Warum ändern Sie nicht einfach die Compiler-Ebene auf Eclipse ?? –

+0

@Diago, aus der Frage "Dies ist sicher, dass der Compiler-Level korrekt eingestellt ist". –

+0

Es gibt nichts in der Sprache, das zwischen JDK5 und 6 entfernt wurde. Das einzige, was hinzugefügt wurde, war, wie bereits gesagt wurde, die Override-Annotation in den Interface-Methoden - daher kein Schlüsselwort.Daher sind Sie mit Bibliothek Unterschiede fest, ich fürchte –

Antwort

14

Es gibt nichts in die Java-Sprache die zwischen JDK5 und 6. Das einzige, was hinzugefügt wurde entfernt war, wie gesagt wurde, war die @Override Annotation zulässige auf Interface-Methoden sind - keine Schlüsselwörter. Daher haben Sie, glaube ich, nur noch Bibliotheksunterschiede als einzige Ursache für das Brechen von Änderungen.

Diese existieren sogar in der Kern-API; In einer ungewöhnlichen Form von rückwärtskompatibilitätsbrechendem Vergnügen änderten sie die Signatur einiger Methoden auf der ExecutorService Schnittstelle. Dies lag daran, dass die generischen Signaturen der Methoden zu restriktiv waren. Dies war ein reiner Bibliothekswechsel (obwohl ein Teil von java.util, eine hübsche Kernbibliothek); nichts mit Modifikationen auf Sprachniveau zu tun haben.

Zum Beispiel from JDK5:

<T> T invokeAny(Collection<Callable<T>> tasks) 

to JDK6:

<T> T invokeAny(Collection<? extends Callable<T>> tasks) 

Das bedeutet, dass jedes Programm, das Code enthalten diese Schnittstelle in JDK5 Umsetzung würde nicht gegen JDK6 zusammengestellt. Ein Snippet ist einfach zu erstellen. Lass deine IDE einfach eine leere Implementierung der JDK5-Schnittstelle erstellen und baue dann gegen JDK6.

Hinweis:, dass der Platzhalter hinzugefügt wurde, weil die vorherige Version nicht einen Parameter wie List<MyCallable<String>> angenommen haben (das heißt die Sammlung von einigen Unterklasse von abrufbaren getippt), während die neuere Version der Fall ist.

+0

+1 nettes Denken – skaffman

+1

Guter Fang. +1 (hier illustriert http://old.nabble.com/Incompatible-API-change-between-Java-5-and-Java-6--td22983799.html) – VonC

+0

Ich kann bestätigen, von diesem gebissen worden zu sein - jetzt wir müssen zwei Versionen von einigen unserer Code nur aufgrund dieser Änderung der Bibliothek unterstützen –

2

Da JVMDI entfernt und JVMPI in Java SE 6 deaktiviert wurde (nach J2SE 6.0 release note), könnten Sie einen Code mit dieser API hinzufügen: Es wird nicht mit J2SE 6.0, nur 5.0 kompiliert. (wie dargestellt durch this thread)

+0

Wenn ich Sie richtig verstehe, ist dies eine JRE-Unterschied, keine Sprachveränderung? Also hängt es von der verwendeten JRE ab, nicht von der Compiler-Ebene? Ich möchte Java 5 nicht während der Entwicklung verwenden, sondern nur feststellen, dass der Compilerlevel nicht korrekt ist. –

+0

@ Thorbjørn: Ja, ich kann keinen tatsächlichen Code finden, der kompiliert werden könnte, nur dynamische Bibliothek zur Laufzeit geladen. Also, für jetzt ist es keine geeignete Lösung (ich halte es im CW-Modus für das Archiv) – VonC

0

Keine Antwort auf Ihre Frage, sondern eine Alternative zu Ihrem Ansatz: Wäre es nicht möglich, einen zweiten Builder auf der Basis von ant oder maven zu verwenden, den Sie bei Bedarf zum Erstellen des Finales verwenden Anwendung oder Bibliothek? Dieser Build verwendet ein echtes externes Java 5-SDK und garantiert somit, dass die Anwendung/Bibliothek in einer Java5-Umgebung ausgeführt wird.

+0

Ja. Wir haben ein Build-System, das Artefakte auf der richtigen Ebene usw. erstellt. Es braucht jedoch Zeit, und während der Entwicklung muss ich oft mit Eclipse auf meinem PC bauen und auf dem Entwicklungscomputer laufen (der nur Java 5 und keinen PC hat)). Daher müssen Sie sicher sein, Java 5 zu verwenden. Wir erstellen sehr häufig neue Arbeitsbereiche, da die Funktion "Arbeitsgruppe" in Eclipse ein Witz ist. –

+1

Stimmen Sie der Funktion "Working Set" vollständig zu. Ein Arbeitsplatz/Projekt ist, was ich auch tue;) –

Verwandte Themen