Wie rechtfertigt man die Migration von Java 6 nach Java 7?

28

Wir haben von Java 6 auf Java 7 migriert . Das Projekt ist in Verzug und es besteht die Gefahr, dass es fallengelassen wird. In diesem Fall wird Java 6 weiterhin verwendet.

Was sind die spezifischen Verbesserungen in Java 7, mit denen wir zu unserem Manager zurückkehren und ihn davon überzeugen könnten, dass es wichtig ist, JDK 7 zu verwenden? Suchen Sie nach Fehlerkorrekturen, die ich in Oracle Java 7 (in Bezug auf Java 6) hervorheben könnte. In meinem Fall sind Korrekturen in Bezug auf Sicherheit, Leistung, Java 2D / Drucken usw. besser zu verkaufen. Compiler-Fixes werden zum Beispiel nicht viel nützen.

[Ich gehe viele Websites durch, wie den Oracle Adoptionsleitfaden , die Fehlerdatenbank und Fragen zum Stapelüberlauf].

Update: Danke für die Antworten. Wir haben das Update auf die nächste Version verschoben. Das nächste, was wir bekamen, war die Sicherheit. Akzeptiere die Antwort mit der höchsten Bewertung.

Jayan
quelle
5
Du hast Glück. Nach den Fragen, die immer noch regelmäßig bei Stack Overflow auftauchen , sind einige Leute immer noch mit Java 1.4 (einer Plattform, die 11 Jahre alt ist!) Beschäftigt.
Joachim Sauer
3
Warum führen Sie das Upgrade jetzt durch, wenn Sie einige der in 7 benötigten Funktionen noch nicht kennen? Vielleicht verschwenden Sie Ihre Zeit und sollten sich ein bisschen mehr Gedanken darüber machen, ob Sie es rechtfertigen sollten, anstatt wie Sie es rechtfertigen sollten.
Bryan Oakley
1
Bin es nur ich oder ist der Titel rückwärts?
Radu Murzea
1
Die größere Frage ist: Warum fällt es Ihnen so schwer, ein Upgrade durchzuführen? Ich konnte in einer Woche ein Projekt mit einer Million Loks auf Java 7 aktualisieren. Ich denke, die Antwort auf Ihre Probleme besteht darin, zu analysieren, warum Sie das Upgrade so schwer haben.
Andrew T Finnell
2
@ Andrew Finnell: Entschuldigung. Ich fand es nicht so relevant. Die eigentliche Portierung war in weniger als einer Woche abgeschlossen. Hauptsächlich wegen der von Sun geschützten APIs, die wir verwendet haben. Es war ein funktionsspezifisch kompatibler Code als die tatsächliche Anzahl der Codezeilen (ca. 4 Millionen). Die Verzögerung wurde durch verschiedene Faktoren wie die Unterstützung von Tools verursacht. Zum Beispiel durch die Codeabdeckung mit Cobertura 2.0. stabilisiert sich nur. Ein weiteres Tool war Rational Functional Tester, für das ein Upgrade erforderlich war (wir haben uns dagegen entschieden). Vielleicht schreibe ich eine Notiz über die allgemeinen Faktoren, die den Aufwand beeinflusst haben.
Jayan

Antworten:

44

Java 6 hat EOL im Februar dieses Jahres erreicht und wird keine öffentlichen Updates (einschließlich Sicherheit) mehr erhalten, es sei denn, Sie kaufen sehr teuren Unternehmens-Support.

Das sollte der Grund sein, der gebraucht wird.

Außerdem deuten überwältigende Beweise darauf hin, dass die Abwärtskompatibilität für Java-Laufzeiten ausgezeichnet ist. Möglicherweise müssen Sie nur die Java 6-Installationen durch Java 7 ersetzen, und alle Anwendungen funktionieren problemlos weiter. Dies ist natürlich nicht garantiert und es werden umfangreiche Tests empfohlen, um sicherzustellen, dass es tatsächlich keine Probleme gibt.

Michael Borgwardt
quelle
2
das sollte eine akzeptierte Antwort sein. Die auf EOL-Daten basierende Argumentation hat sich für mich als am besten erwiesen, wenn bestimmte Produktupdates, insbesondere Java, gerechtfertigt werden mussten. Um die Begründung zu vervollständigen, würde ich auch den Hinweis zur Abwärtskompatibilität mit Binärdateien (vorzugsweise mit einer offiziellen Oracle-Anweisung gesichert) und einen Hinweis zur Notwendigkeit, das Update zu testen (für den Fall, dass beispielsweise unerwartete Abhängigkeiten von fest codierten Verweisen auf die Version vorliegen) hinzufügen. 6 "in Anwendungskonfigurationen)
Gnat
1
Dies ist im Grunde der einzige Grund, warum die meisten Unternehmen ein Upgrade durchführen.
Jwenting
Michael, wäre es sinnvoll, die von mir erwähnten Notizen (Erläuterungen zu Verträglichkeit und Rauchprüfung ) in Ihre Antwort aufzunehmen? der Vollständigkeit halber sozusagen
gnat
1
@gnat: erledigt, obwohl ich bezweifle, dass die Leute, die gegen die Migration sind, über die Notwendigkeit von Tests informiert werden müssen und eher über mehr als nur Rauchtests. Es definitiv sind manchmal schweren Unverträglichkeiten.
Michael Borgwardt
@MichaelBorgwardt Nun, darüber zu erzählen ist etwas knifflig und es hat mehr damit zu tun, überzeugend zu sein als technisch korrekt. Ich für meinen Teil habe ziemlich schwer gelernt, solche Dinge explizit und klar zu formulieren, wenn es Leute gibt, die "gegen den Wandel" sind. Diese Art sendet ihnen das Signal "Wir hören zu und teilen Ihre Bedenken, und wir sorgen uns auch". Sie fühlen sich geschätzt (im Gegensatz zu ignoriert) ... und führen schließlich zu einer leichteren Genehmigung der Änderung :)
gnat
29

Im Allgemeinen gibt es eine Reihe ziemlich umfangreicher Änderungen, um dem Programmierer die Arbeit zu erleichtern. Ihr Vorgesetzter mag sich nicht allzu sehr um solche Dinge kümmern, aber Programmierer sollten weniger Zeit damit verbringen, sich mit dem Boilerplate-Code zu befassen, und somit mehr Zeit haben, über das eigentliche Ziel der Implementierung nachzudenken, die Effizienz zu steigern, Fehler zu verringern usw. Das kann ein sehr starkes Argument sein. Oracle hat eine ziemlich umfangreiche Liste von Änderungen , die jedoch ziemlich lang ist, sodass ich so viel wie möglich zusammenfassen werde.

Sprachfunktionen umfassen:

  • Weniger Boilerplate auf Generika. Der Code Map<String, String> myMap = new HashMap<String, String>();kann auf reduziert werden Map<String, String> myMap = new HashMap<>(). Der Compiler kann die benötigten generischen Typen auf der rechten Seite von links ableiten, sodass Ihr Code etwas kürzer und schneller lesbar wird.
  • Zeichenfolgen funktionieren jetzt in switch-Anweisungen , wobei die Semantik der .equals()Methode anstelle von verwendet wird ==.
  • Automatische Ressourcenverwaltung mit Try-with-Resources. Dies macht den Code sauberer, hat aber auch einen Vorteil gegenüber altem try / finally-basierten Code. Wenn eine Ausnahme in der try-Anweisung ausgelöst wird und beim Schließen eine andere ausgelöst wird, verliert Code, der herkömmliche try / finally-Anweisungen verwendet, die ursprüngliche Ausnahme vollständig und übergibt nur die Ausnahme, die im finally-Block ausgelöst wurde. In einer try-with-resources-Anweisung unterdrückt die Laufzeit die Ausnahme, die der Aufruf von close () ausgelöst hat, und sprudelt die ursprüngliche Ausnahme in den Stapel, unter der Annahme, dass diese ursprüngliche Ausnahme diejenige ist, die alle Probleme in der ersten verursacht hat Ort. Anstatt die andere Ausnahme dem Garbage Collector zu überlassen, können mit dieser Unterdrückung die in der Nähe ausgelösten Ausnahmen mit abgerufen werden Throwable.getSuppressed.
  • Numerische Literale können leichter lesbar gemacht werden. Alle numerischen Literale lassen Unterstriche zu , so dass Dinge wie int n = 1000000000eine viel besser lesbare werden können int n = 1_000_000_000, was einfacher als eine Milliarde zu analysieren und schwieriger ist, falsch zu schreiben, ohne es zu bemerken. Außerdem sind binäre Literale im Formular zulässig0b10110101 , wodurch Code, der mit Bitfeldern arbeitet, etwas besser lesbar ist.
  • Das Behandeln mehrerer Ausnahmetypen in derselben catch-Anweisung kann durchgeführt werden, wodurch das Duplizieren von Code verringert wird und das spätere Umgestalten möglicherweise vereinfacht wird.

Jede dieser Änderungen ist etwas, das Ihrem Manager möglicherweise nicht direkt am Herzen liegt, aber sie erleichtern es Ihnen ein wenig, korrekten Code ohne viel Aufwand und Gedanken zu schreiben zu implementieren, und sie machen es auch ein wenig einfacher, Code später zu lesen, was das Debuggen etwas schneller macht.

Auf der API-Seite sind auch eine Reihe von API-Aktualisierungen aufgetreten:

  • In Bezug auf die Sicherheit wurden verschiedene Verschlüsselungsmethoden hinzugefügt / veraltet, da die Kryptografie immer weiter voranschreitet.
  • Datei-E / A wurde geändert ( dies könnte jedoch eine bessere Verknüpfung sein ) und an einigen Stellen eine bessere Abstraktion hinzugefügt. Ich habe mich noch nicht persönlich mit dem neuen IO-Material befasst, aber es sieht nach einer sehr nützlichen Überarbeitung aus, die es viel einfacher macht, mit dem Dateisystem ohne größere Schmerzen zu arbeiten.
  • Unicode-Unterstützung ist bis zu Unicode 6.0 verfügbar, zusammen mit einer Reihe anderer Internationalisierungsverbesserungen.
  • Java2D , das Sie in Ihrer Frage erwähnt haben, wurde verbessert. Bessere Linux-Schriftartunterstützung, bessere X11-Darstellung auf modernen Computern und bessere Verarbeitung tibetischer Skripte.
Billy Mailman
quelle
1
Nit pick: Tatsächlich funktioniert der String-Schalter "so, als würde er die String.equalsMethode verwenden" (aus dem Dokument, mit dem Sie verlinkt haben). In der Realität kann der Compiler frei optimieren, sodass er String.equalsnicht verwendet wird ... vorausgesetzt, der Nettoeffekt ist der gleiche. (Und ich würde erwarten, dass es String.hashcodeüber eine bestimmte Anzahl von Schalter Fällen verwenden würde.)
Stephen C
Wahr genug. Die meisten Compiler dürfen eine Menge Optimierungen vornehmen, die die Semantik jedoch nicht ändern. Daher ist es häufig überflüssig, auf solche Kleinigkeiten hinzuweisen. Ich hatte nur ausdrücklich .equals () erwähnt, um zu verdeutlichen, dass Groß- und Kleinschreibung nicht ignoriert wird. Trotzdem habe ich den Wortlaut ein wenig aktualisiert.
Billy Mailman
Das Wechseln von Zeichenfolgen wird nicht empfohlen, da Sie eine ungebundene Domäne aktivieren. Das Einschalten von Enums ist hier ein typischer Mittelweg, da Sie eine String-ähnliche Darstellung haben können, jedoch mit semantischer Bedeutung. Oh und +1 für die vollständige Antwort BTW.
Martijn Verburg
Was sind die Vorteile der Verwendung von Zeichenfolgen in einer switch-Anweisung anstelle von Ganzzahlkonstanten?
Giorgio
3
Der einzige geschäftliche Grund dafür sind möglicherweise die Sicherheitsverbesserungen. Technische Feinheiten sind umstritten und für Geschäftsleute völlig irrelevant.
Jwenting
8

try-with-resources ist eine Funktion, für die es sich lohnt, ein Upgrade auf Java 7 durchzuführen. Ressourcenlecks / Speicherverluste sind ein großes Risiko in der Java-Entwicklung, und TWR reduziert dieses Risiko erheblich.

Ich füge hinzu, dass die neuen Funktionen für NIO.2-Dateiabstraktion und Asynchronität ebenfalls einen Umstieg wert sind, wenn Ihre Anwendung über Datei- / Netzwerk-E / A-Funktionen verfügt.

Martijn Verburg
quelle
Sie reduzieren auch die Menge an benötigtem PermGen und verwenden stattdessen entweder Heap oder nativen Speicher. Ich bin nicht sicher, wo es jetzt gespeichert wird. Dies bedeutet, dass Sie in Java 8 nicht zwei maximale Speicherparameter festlegen müssen.
Andrew T Finnell
Ist try-with-resources nicht dasselbe wie try-finally, aber mit weniger Boilerplate?
Jhewlett
1
Ich denke, die Idee ist, dass weniger Boilerplate es einfacher macht, richtig zu machen.
MatrixFrog
1
Weniger Kesselblech und korrekt schließende Smeantics. Sie entdeckten , dass im Inneren der OpenJDK sie es manuell falsch etwa 2/3 der Zeit zu tun .... Ich vermute , dass andere hohe Anteile an diesen in anderen Korpusse Code.
Martijn Verburg
6

Es kann einen Grund geben, warum Sie nicht auf Java 7 wechseln sollten : Wenn Sie die VM von Oracle verwenden müssen und Ihre Software entweder auf eingebetteter Hardware ausgeführt wird oder Sie sie mit eingebetteter Hardware verteilen: Oracle hat die JRE-Lizenz so geändert, dass sie nicht lizenziert ist, falls dies oben angegeben ist Bedingungen sind erfüllt; Sie müssen kaufen eine Java SE Embedded - Lizenz. Siehe Was bedeutet "Allzwecksystem" für Java SE Embedded?

Wiedereinsetzung von Monica - M. Schröder
quelle