Backport Java 5/6 Funktionen auf Java 1.4?

8

Wir sind bis Ende 2010 mit Java2SE v1.4 beschäftigt. Das ist wirklich eklig, aber wir können nicht anders. Welche Möglichkeiten haben wir, einige der neuen Funktionen bereits jetzt zu nutzen? Ich kann mir verschiedene Möglichkeiten vorstellen, wie

  • Ändern des Bytecodes, z.B. mit Retrotranslator oder Retroweaver .

    >
  • Rückport von Bibliotheken, z.B. Concurrent Backport , aber das hilft nicht für Generika.

  • Emulation von Java 5 Merkmalen, z.B. überprüfte Sammlungen, Varargs mit Hilfsmethoden usw.

  • Ändern des Quellcodes durch Vorkompilierung, Entfernen aller 1,5 Sachen vor der endgültigen Kompilierung, z. Mit Declawer können Sie das tun.

Ich bin sehr interessiert an sehr positiven Erfahrungen damit in Produktionsumgebungen mit Weblogic und "echten" Sachen.

    
Peter Kofler 18.06.2009, 09:24
quelle

5 Antworten

11

Danke für deine Antworten. Hier ist die Zusammenfassung aller relevanten Antworten und meiner eigenen Forschung.

Ändern des Bytecodes: Die Retros
Dies geschieht durch die "Retro" -Tools : Retro-Übersetzer , Retroweaver und JBossRetro . Retrotranslator scheint am ausgereiftesten zu sein und aktiv von ihnen Werkzeug. Diese Tools durchsuchen alle Klassen und ändern den Bytecode, um Java 5 und 6 Features zu entfernen. Viele Java5-Funktionen werden unterstützt durch Verwendung von Backport-Bibliotheken von Drittanbietern. Diese Option ist am beliebtesten und es gibt einige positive Rückmeldungen von Benutzern. Experimente haben gezeigt, dass es funktioniert erwartet. Sehen Sie sich einen kurzen Überblick über Entwickler-Websites an.

Pro: Sie können vollständig in Java 5 entwickeln, Module und alle Arten von JARs erstellen. Am Ende transformieren Sie einfach alle Klassen in Java 1.4 und packen Ihre EAR. Dies ist leicht mit der Maven-Integration von Retrotranslator ( org.codehaus.mojo:retrotranslator-maven-plugin ) möglich.

Con: Konservative Umgebungen erlauben nicht, dass geänderter Bytecode bereitgestellt wird. Das Ergebnis des Retro-Schritts ist für keinen Coder sichtbar und kann nicht genehmigt werden. Das zweite Problem ist die Angst: Es könnte ein kryptisches Produktionsproblem geben, und der Retro-Code ist ein weiterer Schritt, der dafür verantwortlich gemacht werden könnte. App-Server-Anbieter könnte die Hilfe aufgrund eines geänderten Bytecodes ablehnen. Also niemand will Verantwortung übernehmen, um es in der Produktion zu verwenden. Das ist eher ein politisches als ein technisches Problem, so sehe ich keine Lösung. Es ist uns passiert, also suchte ich nach weiteren Möglichkeiten: - (

Kompilieren von Java5 zu Java 1.4: jsr14
Es gibt eine nicht unterstützte Option, javac -source 1.5 and -target jsr14 , die die Java5-Quelle zu einem gültigen Java 1.4-Bytecode kompiliert. Die meisten Funktionen mögen varargs oder extended for loop werden ohnehin vom Compiler übersetzt. Generika und Annotationen werden entfernt. Enums werden nicht unterstützt und ich weiß es nicht über Autoboxing, da die Methoden valueOf meist in Java5 eingeführt wurden.

Con: Nur Bytecode wird übersetzt, Bibliotheksverwendung wird nicht geändert. Sie müssen also darauf achten, keine Java5-spezifischen APIs zu verwenden (aber Backports). Außerdem müssen Sie alle Module gleichzeitig erstellen, da Sie für die Entwicklungszeit Java5-Code mit generischen Informationen und Annotationsinformationen benötigen. Sie müssen also das gesamte Projekt für Java 1.4 neu erstellen.

Quelltext zurück in Java 1.4 ändern: Deklarieren
Wie in einer verwandten Frage beantwortet ist Declawer , eine Compiler-Erweiterung, die für Generika und varargs, aber nicht für verbesserte for-Schleife oder Autoboxieren. Die generierte Quelle "ist ein wenig irre, aber nicht so schlecht".

Pro: Die generierte Quelle ist verfügbar und kann überprüft werden. Im schlimmsten Fall können in dieser Quelle Korrekturen vorgenommen werden. Es gibt keine "Magie", weil die Quelle ist gültiges Java. Einige Leute verwenden sogar JAD (Java Decompiler), um die Java 1.4-Quelle erneut zu bekommen. Die Ausgabe von Jad lesbar ist lesbar, wenn Sie mit Debug kompilieren Informationen und keine inneren Klassen verwenden.

Con: Ähnlich wie -target jsr14 benötigen Sie einen zusätzlichen Schritt in der Bereitstellung. Gleiche Probleme mit Bibliotheken.

Ändern der Quelle zurück zu Java 1.4: von Hand
Mehrere Antworten schlugen vor, es von Hand zu machen. Für einen automatischen, sich wiederholenden Build-Prozess ist dies natürlich nicht sinnvoll, aber für einmalige Änderungen ist es das angemessen. Automatisieren Sie einfach, was möglich ist. Vielleicht sehen Sie sich Antlr an, um ein selbst entwickeltes Konvertierungstool zu erstellen.

Backported Libraries:
Das Problem ist, dass Java5 auch neue Bibliotheken liefert, die in älteren JREs nicht verfügbar sind, siehe verwandte Frage . Zum Glück gibt es mehrere rückportierte Bibliotheken, die Ihnen einige Funktionen von Java5 zur Verfügung stellen, aber keine Sprachfunktionen wie Generika simulieren können.

Java5-Funktionen in Java 1.4-Code emulieren:
Ich habe über einige Dinge nachgedacht, die Sie tun könnten, um Ihr Leben einfacher zu machen und trotzdem mit Java 1.4 zu bleiben. Die wichtigsten Merkmale sind typsichere Kollektionen, Hier sind einige Ideen:

  • Anstatt Generics zu verwenden, können Sie Ihre eigenen typsicheren Container mit einer Vorlage erstellen.
  • Fügen Sie einen typsicheren Iterator hinzu (der kein Iterator mehr ist).
  • Fügen Sie asList -Methoden hinzu, die 1,2,...,n Argumente und ein Array von ihnen erlauben (um Varargs zu simulieren).
  • Methoden für varargs (die 1,...,n Argumente in Arrays konvertieren) und valueOf können in eine Hilfsklasse eingefügt werden.
Peter Kofler 08.07.2009, 15:44
quelle
2
  

Quellcode-Vorkompilierung, Abisolieren   alle 1.5 Sachen vor der finalen Kompilation   und Bereitstellung. Gibt es irgendwelche Werkzeuge?   was kann das tun?

Ja. Sie heißen Retrotranslator oder Retroweaver. Abgesehen von Generics (die ohnehin nur für den Compiler existieren), kann man nicht einfach "1.5 Sachen" strippen. Enums (und vielleicht auch einige andere Features) müssen durch funktional äquivalenten Code ersetzt werden. Was genau machen diese Werkzeuge?

    
Michael Borgwardt 18.06.2009 09:28
quelle
2

Sie können mit JDK 1.5-Features codieren und JDK 1.4 zur Kompilierungszeit anvisieren. Siehe verfügbare Javac-Optionen. Die meisten Bibliotheken verwenden jedoch jetzt JDK 1.5-Code, so dass Sie mit alten Bibliotheken festhalten müssen.

    
John Doe 18.06.2009 14:05
quelle
0

Bemerkenswert ist, dass Java 1.4 seit einiger Zeit EOL ist. Java 5.0 wird EOL 8. Oktober 2009. Wenn jemand Ihnen Java 5.0 bis 2010 verspricht, würde ich fragen warum?!

    
Peter Lawrey 18.06.2009 18:44
quelle
0

Um Anmerkungen in Java 1.4 zu simulieren, können Sie Ссылка

verwenden     
Mercer Traieste 08.07.2009 15:41
quelle

Tags und Links