Comment justifier la migration de Java 6 vers Java 7?

28

Nous migrions de Java 6 vers Java 7 . Le projet est en retard et risque d'être abandonné, auquel cas il continuera d'utiliser Java 6.

Quelles sont les améliorations spécifiques de Java 7 avec lesquelles nous pourrions revenir à notre responsable et le convaincre qu'il est important d'utiliser JDK 7? Vous cherchez des corrections de bugs que je pourrais mettre en évidence dans Oracle Java 7 (par rapport à Java 6). Les correctifs de sécurité, de performances, Java 2D / impression, etc. seront plus vendables dans mon cas. Les correctifs du compilateur, par exemple, ne seront pas très utiles.

[Je passe par de nombreux sites comme le guide d'adoption Oracle , la base de données de bogues, les questions sur Stack Overflow].

Mise à jour: Merci pour les réponses. Nous avons reporté la mise à jour à la prochaine version. Au plus près, nous avons eu la sécurité. Accepter la réponse votée la plus élevée.

Jayan
la source
5
Tu es chanceux. À en juger par les questions qui apparaissent toujours régulièrement sur Stack Overflow , certaines personnes sont toujours bloquées avec Java 1.4 (une plate-forme qui a 11 ans!).
Joachim Sauer
3
Pourquoi effectuez-vous la mise à niveau maintenant si vous ne connaissez pas déjà certaines fonctionnalités de 7 dont vous avez besoin? Peut-être que vous perdez votre temps et que vous devriez penser un peu plus à savoir si vous devez le justifier plutôt que comment vous devez le justifier.
Bryan Oakley
1
Est-ce juste moi ou le titre est-il à l'envers?
Radu Murzea
1
La plus grande question est: pourquoi avez-vous tant de mal à mettre à niveau? J'ai pu mettre à niveau un million de projets loc en une semaine vers Java 7. Je pense que la réponse à vos problèmes consiste à analyser pourquoi vous avez tant de mal à effectuer la mise à niveau.
Andrew T Finnell
2
@ Andrew Finnell: Désolé. Je ne pensais pas que c'était pertinent. Le portage a été effectué en moins d'une semaine. Principalement en raison des API propriétaires que nous avons utilisées. C'était un code affecté par la compatibilité spécifique à la fonction que le nombre réel de lignes de code (environ 4 millions). Le retard causé était dû à divers facteurs tels que la prise en charge d'outils - Par exemple, la couverture du code à l'aide de cobertura 2.0. se stabilise. Un autre outil était Rational Functional Tester qui nécessitait une mise à niveau (nous avons choisi de ne pas le faire). Peut-être que j'écrirai une note sur les facteurs globaux qui ont affecté l'effort ..
Jayan

Réponses:

44

Java 6 a atteint EOL en février de cette année et ne recevra plus de mises à jour publiques (y compris la sécurité) à moins que vous n'achetiez un support d'entreprise très coûteux.

Cela devrait être toute la raison nécessaire.

En outre, des preuves accablantes suggèrent que la compatibilité descendante pour les runtimes Java est excellente. Il y a de fortes chances que vous ayez juste à remplacer les installations Java 6 par Java 7 et toutes les applications continueront de fonctionner sans aucun problème. Bien sûr, cela n'est pas garanti et des tests approfondis sont recommandés pour confirmer qu'il n'y aura en effet aucun problème.

Michael Borgwardt
la source
2
cela devrait être une réponse acceptée. Le raisonnement basé sur la date de fin de vie s'est avéré le plus efficace pour moi chaque fois qu'il était nécessaire de justifier des mises à jour de produits particulières, notamment Java. Pour compléter la justification, j'ajouterais également la note sur la compatibilité binaire en amont (de préférence sauvegardée avec une déclaration Oracle officielle) et une note sur la nécessité de tester la fumée de la mise à jour (pour, par exemple, certaines dépendances inattendues sur les références codées en dur à la version " 6 "dans les configurations d'application)
moucher
1
c'est essentiellement la seule raison pour laquelle la plupart des entreprises mettront à niveau.
jwenting
Michael, serait-il judicieux d'ajouter des notes que j'ai mentionnées ( clarifications sur la compatibilité et les tests de fumée ) dans votre réponse? par souci d'exhaustivité pour ainsi dire
moucher
1
@gnat: c'est fait, même si je doute que les personnes qui s'opposent à la migration aient besoin d'être informées de la nécessité de faire des tests et plus que de simples tests de fumée. Il certainement sont parfois graves incompatibilités.
Michael Borgwardt
@MichaelBorgwardt bien, parler de cela est quelque chose de délicat et cela a plus à voir avec le fait d'être convaincant que techniquement correct. Pour ma part, j'ai appris de manière assez difficile à énoncer des choses comme ça explicitement et clairement quand il y a des gars "contre le changement". Ce genre de message leur envoie, "nous écoutons et partageons vos préoccupations, et nous nous inquiétons aussi", les fait se sentir valorisés (par opposition à ignorés) ... et conduit finalement à une approbation plus facile du changement :)
gnat
29

En général, il y a un certain nombre de changements assez larges pour faciliter les choses sur le programmeur. Votre gestionnaire ne se soucie peut-être pas trop de ces choses, mais faire en sorte que les programmeurs passent moins de temps à penser au code passe-partout, et ont donc plus de temps pour réfléchir à l'objectif réel de ce qu'ils implémentent, devrait augmenter l'efficacité, réduire les bogues, etc., ce qui peut être un argument très puissant. Oracle a une liste assez complète de changements , mais elle est assez longue, je vais donc résumer autant que possible.

Les fonctionnalités linguistiques incluent:

  • Moins de passe-partout sur les génériques. Le code Map<String, String> myMap = new HashMap<String, String>();peut être réduit à Map<String, String> myMap = new HashMap<>(). Le compilateur peut déduire les types génériques nécessaires sur le côté droit à partir de la gauche, de sorte que votre code devient un peu plus court et plus rapide à lire.
  • Les chaînes fonctionnent maintenant dans les instructions switch , en utilisant la sémantique de la .equals()méthode au lieu de ==.
  • Gestion automatique des ressources à l'aide d'essayer avec des ressources. Cela rend le code plus propre, mais a également un avantage sur le code try / finalement basé sur l'ancien. Si une exception est levée dans l'instruction try, puis une autre est levée lors de la fermeture, le code qui utilise les instructions try / finally traditionnelles perdra complètement l'exception d'origine et ne transmettra que celle qui a été levée dans le bloc finally. Dans une instruction try-with-resources, le runtime supprime l'exception que les appels close () ont lancée et fait remonter l'exception d'origine dans la pile, en supposant que cette exception d'origine est celle qui a causé tous les problèmes dans le premier endroit. De plus, au lieu d'abandonner l'autre exception au garbage collector, cette suppression permet de récupérer les exceptions rapprochées à l'aide de Throwable.getSuppressed.
  • Les littéraux numériques peuvent être plus faciles à lire. Tous les littéraux numériques autorisent les soulignements , de sorte que des choses comme int n = 1000000000peuvent être transformées en un texte beaucoup plus lisible int n = 1_000_000_000, qui est beaucoup plus facile à analyser comme étant un milliard, et plus difficile à taper à tort sans le remarquer. De plus, les littéraux binaires sont autorisés dans le formulaire 0b10110101, ce qui rend le code qui fonctionne avec les champs binaires un peu plus agréable à lire.
  • La gestion de plusieurs types d'exception dans la même instruction catch peut être effectuée, ce qui réduit la duplication de code et peut éventuellement faciliter la refactorisation plus tard.

Chacun de ces changements est quelque chose que votre gestionnaire ne peut pas directement s'intéresser, mais ils facilitent un peu l'écriture du code correct sans autant d'effort et de réflexion, libérant votre esprit pour se concentrer un peu plus sur la logique réelle que vous essayez à implémenter, et ils facilitent également la lecture du code plus tard, ce qui rend le débogage un peu plus rapide.

Côté API, un certain nombre de mises à jour d'API ont également eu lieu:

  • En termes de sécurité , plusieurs méthodes de cryptage ont été ajoutées / déconseillées, car la cryptographie évolue sans cesse.
  • Le fichier IO a été modifié, ( ce pourrait être un meilleur lien, cependant ) en ajoutant une meilleure abstraction à plusieurs endroits. Je n'ai pas personnellement plongé dans les nouveaux trucs d'E / S, mais cela ressemble à une refonte très utile, ce qui rend beaucoup plus facile de travailler avec le système de fichiers sans autant de douleur.
  • La prise en charge d'Unicode est jusqu'à Unicode 6.0, avec un certain nombre d'autres améliorations d'internationalisation.
  • Java2D , que vous avez mentionné dans votre question, a été amélioré. Meilleure prise en charge des polices Linux, meilleur rendu X11 sur les machines modernes et gestion des scripts tibétains.
Billy Mailman
la source
1
Nit pick: En fait, le changement de chaîne fonctionne "comme s'il utilisait la String.equalsméthode" (à partir du document auquel vous avez lié). En réalité, le compilateur est libre d'optimiser ce qui String.equalsn'est pas utilisé ... à condition que l'effet net soit le même. (Et, je m'attends à ce qu'il utilise String.hashcodeau-dessus d'un certain nombre de boîtiers de commutation.)
Stephen C
Assez vrai. La plupart des compilateurs sont autorisés à faire une tonne d'optimisations qui ne changent pas la sémantique, il est donc souvent redondant de signaler de petites choses comme ça; J'avais seulement mentionné spécifiquement .equals () pour être explicite sur le fait que le cas n'est pas ignoré. Néanmoins, j'ai un peu mis à jour le libellé.
Billy Mailman
Les commutateurs de chaîne ne sont pas recommandés car vous basculez sur un domaine non lié. Activer les énumérations est un terrain d'entente typique ici car vous pouvez avoir une représentation de type chaîne, mais avec une signification sémantique. Oh et +1 pour la réponse complète BTW.
Martijn Verburg
Quels sont les avantages de l'utilisation de chaînes dans une instruction switch au lieu de constantes entières?
Giorgio
3
la seule raison commerciale parmi celles-ci peut être l'amélioration de la sécurité. Les subtilités techniques sont à la fois discutables et totalement hors de propos pour les hommes d'affaires.
jwenting
8

try-with-resources est une fonctionnalité qui mérite une mise à niveau vers Java 7 pour, toute seule. Les fuites de ressources / fuites de mémoire sont un gros risque dans le développement Java et TWR réduit ce risque de manière significative.

J'ajouterai que la nouvelle abstraction de fichiers NIO.2 et les capacités asynchrones valent également la peine d'être déplacées si votre application dispose de fonctionnalités d'E / S de fichier / réseau.

Martijn Verburg
la source
Ils réduisent également la quantité de PermGen nécessaire et utilisent à la place le tas ou la mémoire native, je ne sais pas où il sera stocké maintenant. Cela signifie qu'en Java 8, vous n'aurez pas besoin de définir deux paramètres de mémoire max.
Andrew T Finnell
L'essai avec les ressources n'est-il pas identique à un essai final mais avec moins de passe-partout?
jhewlett
1
Je pense que l'idée est que moins de passe-partout signifie qu'il est plus facile de bien faire les choses.
MatrixFrog
1
Moins de plaque de chaudière et une bonne smeantics de fermeture. Ils ont découvert qu'à l' intérieur de l'OpenJDK, ils le faisaient manuellement mal environ 2/3 du temps .... Je soupçonne d'autres pourcentages élevés de cela dans d'autres corpus de code.
Martijn Verburg
6

Il peut y avoir une raison pour laquelle vous ne devriez pas passer à Java 7: si vous devez utiliser la machine virtuelle d'Oracle et que votre logiciel fonctionne sur du matériel intégré ou que vous le distribuerez avec du matériel intégré: Oracle a modifié la licence de JRE afin qu'elle ne soit pas concédée si ci-dessus les conditions sont remplies; vous devrez acheter une licence intégrée Java SE. Voir Que signifie "système à usage général" pour Java SE Embedded?

Réintégrer Monica - M. Schröder
la source