2009-06-18 7 views
8

Wir sind mit Java2SE v1.4 bis Ende 2010 festgefahren. 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, wieBackport Java 5/6 Funktionen auf Java 1.4?

  • den Bytecode ändern, z. unter Verwendung von Retrotranslator oder Retroweaver.

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

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

  • Quellcode durch Vorkompilierung ändern, alle 1,5 Sachen vor der endgültigen Kompilierung strippen, z. mit Declawer kann dies tun.

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

    +3

    um wirklich wählerisch zu sein ... es gab nie ein Java 4, es war Java 2 Release 1.4. –

    +3

    Ja, weil die Marketingnamen von Sun logisch sind. –

    +0

    Danke für die Bearbeitung der Tags. Ich habe SO durchsucht, aber die zugehörigen Fragen nicht gefunden: - http://StackOverflow.com/questions/603828/java-5-to-java-1-4-source-code-backporting-tool - http: // stackoverflow.com/questions/547872/converting-java-1-5-source-into-1-1-source - http://stackoverflow.com/questions/17993/easy-way-to-backport-java-6 -code-to-java-5 –

    Antwort

    11

    Vielen Dank für Ihre Antworten verwenden können. Hier ist die Zusammenfassung aller relevanten Antworten und meiner eigenen Forschung.

    Ändern der Bytecode: Die Retros
    Dies wird durch die "retro"-tools getan wird: Retrotranslator, Retroweaver und JBossRetro. Retrotranslator scheint das ausgereifteste und aktive von ihnen Werkzeug zu sein. Diese Tools durchsuchen alle Klassen und ändern den Bytecode, um Java 5 und 6 Features zu entfernen. Viele Java5-Funktionen werden unterstützt, einige mithilfe von Backport-Bibliotheken von Drittanbietern. Diese Option ist am beliebtesten und es gibt einige positive Rückmeldungen von Benutzern. Experimente haben gezeigt, dass es als erwartet wird. Siehe einen kurzen Überblick über developerworks.

    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 einfach mit Retrotranslator Maven Integration().

    Con: In konservativen Umgebungen kann kein geänderter Bytecode implementiert werden. 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. Die App-Server-Anbieter könnten die Hilfe aufgrund eines geänderten Bytecodes ablehnen. Also niemand will Verantwortung übernehmen, um es in der Produktion zu verwenden. Da dies eher ein politisches als ein technisches Problem ist, sehe ich keine Lösung. Es hat uns passiert ist, so dass ich war auf der Suche nach weiteren Möglichkeiten :-(

    compilieren Java5 auf Java 1.4. Jsr14
    Es ist eine nicht unterstützte Option, javac -source 1.5 and -target jsr14 die die Java5 Quelle gültige Java 1.4 Bytecode kompiliert meisten Features wie varargs oder Schleife erweitert werden ohnehin vom Compiler übersetzt. Generics und Anmerkungen gestrippt werden. Aufzählungen nicht unterstützt werden und ich weiß nicht, über Autoboxing, da die valueOf Methoden meist in Java5 eingeführt wurden.

    Con : Nur Byte-Code wird übersetzt, Bibliotheksverwendung wird nicht geändert, Sie müssen also vorsichtig sein t, Java5-spezifische 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 von Grund auf für die Java 1.4-Produktion erstellen.

    Ändern Quelle zurück zu Java 1.4: Declawer
    Wie in einem related question beantwortet, gibt es Declawer, eine Compiler-Erweiterung, die für Generika funktioniert und varargs, aber nicht für Autoboxing for-Schleife oder erweitert. Die erzeugte Quelle "ist ein wenig funky, 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 gültiges Java ist. 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 Informationen kompilieren 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 Quelle zurück zu Java 1.4: von Hand
    Mehrere Antworten vorgeschlagen es von Hand zu tun. Für einen automatischen, sich wiederholenden Build-Prozess ist dies natürlich nicht sinnvoll, aber für einmalige Änderungen ist es zumutbar. Automatisieren Sie einfach, was möglich ist. Vielleicht sehen Sie sich Antlr an, um ein selbst entwickeltes Konvertierungstool zu erstellen.

    zurückportiert Bibliotheken:
    Das Problem ist, dass auch Schiffe Java5 neue Bibliotheken, die in älteren JREs nicht verfügbar sind, finden related question. Glücklicherweise gibt es mehrere rückportierte Bibliotheken, die Ihnen einige Funktionen von Java5 zur Verfügung stellen, aber keine Sprachfunktionen wie Generics simulieren können.

    • Annotations, bei TSS diskutiert
    • Concurrent
    • com.sun.net.httpserver (Java 6-5)
    • Gif writing (Java 6-5)
    • Starten Sie Ihr eigenes Projekt Backport ;-)
    • Sie könnte Klassen, die Sie benötigen, aus dem JDK oder anderen Bibliotheken kopieren, aber höchstwahrscheinlich sind sie mit anderen Klassen verwandt.

    Emulating Java5 Funktionen in Java 1.4-Code:
    ich über einige Dinge dachte, Sie tun könnte Ihr Leben einfacher und noch bleiben mit Java 1.4 zu machen. Die wichtigsten Merkmale sind typsicher Sammlungen, hier einige Ideen sind:

    • Statt Generika verwenden Sie können Ihre eigenen Container typsicher mit einigen Vorlage erstellen.
    • Fügen Sie einen typsicheren Iterator hinzu (was kein Iterator mehr ist).
    • Fügen Sie asList Methoden hinzu, die 1,2,...,n Argumente und ein Array von ihnen ermöglicht (Varargs zu simulieren).
    • Methoden für varargs (konvertieren 1,...,n Argumente zu Arrays) und valueOf kann in einige Helfer-Klasse gesetzt werden.
    +0

    Das Kompilieren eines vollständigen Projekts von Grund auf für die Java 1.4-Produktion sollte von Ihrem Build-Server übernommen werden. –

    +0

    Die meisten davon sind jetzt veraltet. Gibt es ein Äquivalent für 6-> 5? – nick

    +0

    Retrotranslator sollte in der Lage sein, 6-> 5 zu machen. Ich habe es mit HSqlDB 2 versucht. Leider behandelt es nicht die neuen java.sql Klassen, so dass es fehlgeschlagen ist. Wenn Sie jedoch kein Java 6-API verwenden, versuchen Sie es. –

    2

    Source Precompilieren, alle 1,5 Sachen vor der endgültigen Zusammenstellung und Bereitstellung Strippen. Gibt es irgendwelche Werkzeuge , die das tun können?

    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?

    +0

    Retrotranslator oder Retroweaver ändern den Bytecode wie oben aufgeführt . Es stimmt zu, dass nicht alle Funktionen genutzt werden können. Generics allein wären schon ein großer Gewinn. –

    2

    Sie können mit den JDK 1.5-Funktionen und Target JDK 1.4 zum Zeitpunkt der Kompilierung codieren. Siehe verfügbare Javac-Optionen. Die meisten Bibliotheken verwenden jedoch jetzt JDK 1.5-Code, so dass Sie mit alten Bibliotheken festgefahren sind.

    +0

    Ich mag mich irren, aber das Targeting auf eine ältere Source-Ebene (in diesem Fall 1,4) beschränkt Sie darauf, nur die Features in dieser Source-Ebene zu verwenden. Bitte korrigieren Sie mich, wenn ich falsch liege. Vielleicht beziehen wir uns auf verschiedene Einstellungen. Könnten Sie Ihrer Antwort mehr Details hinzufügen? –

    +0

    Mir wurde das auch gesagt, aber ich kann es nicht funktionieren lassen. Normalerweise benötigt Source = 1.5 in Eclipse Target = 1.5 und in der Kommandozeile Javas von Plain Sun. –

    +0

    Sie können die Flagge verwenden -target jsr14 –

    0

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

    +0

    Wo ich arbeite, sind wir immer noch mit 1.4 fest, obwohl das Versprechen ist, dieses Jahr zu wechseln. Große Unternehmen sind viel konservativer und zögern, Arbeitssysteme zu ändern, als die Leute, die sich EOL-Dates bei Tech-Unternehmen ausdenken. Oder vielleicht wissen diese Leute einfach, dass diese Unternehmen auch bereit sind, für erweiterte Supportverträge gutes Geld zu zahlen. –

    +0

    -1 weil es mir nicht hilft. Ich weiß, dass wir upgraden sollten und ich bin die erste Person, die das dem Management sagt. –

    +1

    Ich arbeitete für eine Firma mit 65K Angestellten und jetzt für eine mit 139K Angestellten und sie aktualisieren nur auf Java Java 6 auf allen PCs, also weiß ich, dass es langsam sein kann, aber Java 5.0 ist für 5 Jahre und Java 6 für verfügbar 2,5 Jahre. Java 7 wird voraussichtlich bis 2010 verfügbar sein. Ich denke nicht, dass die Arbeit für ein großes Unternehmen eine gute Ausrede ist. Wenn Sie einen Geschäftsfall für die Verwendung einer unterstützten/aktuellen Java-Version haben, sollten Sie eine solche erstellen. –