Je connais un peu de la source et de la compatibilité binaire JDK et JRE (par exemple, Ceci A> et Ce ), mais pas sûr de la situation suivante: p>
Considérez que j'ai une application compilée à l'aide de JDK5 et s'exécute sur JRE6. Il utilise certaines bibliothèques (pots) qui sont également compilées à l'aide de JDK5. P>
Maintenant, je veux compiler ma candidature à l'aide de JDK6. Quels nouveaux problèmes pourraient survenir dans le temps d'exécution dans un tel cas (en particulier, en compatibilité avec les "vieux" pots)? Devrais-je rétablir complètement l'application (toucher chaque bibliothèque) ou compter sur la compatibilité JDK / JRE promise? P>
3 Réponses :
jusqu'à ce que vous n'ayez pas changé votre code et que vous avez ajouté de nouvelles fonctionnalités Java 6, il ne devrait y avoir aucun problème. En ce qui concerne les autres potes, il ne devrait y avoir aucun problème. JDK maintient toujours une compatibilité en arrière. P>
" JDK maintient toujours une compatibilité en retard i>" au moins trompeur: voir la question liée dans les commentaires à l'OP.
Compatibilité essentiellement fonctionne. Je ne m'attendrais à ne pas m'attendre à ce que vous soyez de côté de divers avertissements em> pour par exemple. n'utilise pas de génériques. Peut-être que certaines API à peine utilisées ont été obsolètes, mais je suppose qu'ils étaient laissés en place, juste marqués comme obsolètes. P>
Un aspect de conception clé de Java - malheureusement - est une compatibilité complète en arrière. P>
Il existe très peu d'exceptions où la compatibilité en arrière n'a pas été préservée; La plupart des Eclipse ont subi une fois que l'algorithme de tri a été changé d'une stable à un algorithme de tri non stable (l'ordre des objets qui trit de manière identique n'était plus conservé); Mais cela n'a jamais fait partie de la spécification Java, mais un bogue dans Eclipse. P>
C'est malheureux, car il y avait quelques choix pauvres qui ne peuvent maintenant pas être changés. Bien sûr, vous devez déjà avoir des milliers de tests d'unité forts> pour vous aider à tester avec le nouveau JDK ...: -) p> itérateur code> ne doit pas avoir eu de
Supprimer () code> fonction dans l'API,
Vecteur code> ne doit pas avoir été synchronisé (résolu en ayant
arraylist < / Code> MAINTENANT),
Stringbuffer CODE> n'a pas besoin d'être synchronisé, d'où
stringbuilder code>.
chaîne code> devrait probablement avoir été une interface, pas une classe, pour permettre par ex. Strings 8 bits, chaînes 32 bits -
Chaluquantence code> est la meilleure interface de chaîne, mais trop de méthodes n'acceptent pas
charcuternence code> et nécessitent le retour d'une chaîne code> >.
Observable code> doit être une interface également: vous ne pouvez pas faire de sous-classe observable avec cette API. Nommer quelques-uns quelques-uns. Mais à cause de la compatibilité à l'envers, celles-ci ne peuvent plus être réparées avant que la modularisation JDK peut-être (à quel point certains peuvent au moins disparaître dans un module de donotuse ...). P>
Et vous devez également essayer d'exécuter l'unité compilée, s'il est exécutable .. Utilisation de la VM Java destinée qui lancera la production utilisée dans la production. De cette façon, je suppose que je vérifie la compatibilité.
Pour être juste, " l'essayer juste, s'il est conforme à [sic], vous devriez être bien i>" Cela me semble une approche trop risquée: je craignais toujours des problèmes inattendus au moment de l'exécution. Donc, le -1 (que je ne peux pas annuler sans modifier la réponse) reste toujours.
Java a des exigences de compatibilité élevées à l'envers. Ils sont censés avoir une vaste suite de tests aussi. Donc, à moins qu'ils ont fait des hacks laids à l'époque, le code devrait toujours être compatible; Parce que toutes les méthodes doivent encore être là, comme elles étaient. Et s'ils n'ont pas écrit de tests ...
Normalement, aucun problème ne doit survenir que si vous définissez l'option Compiler de JDK6 pour utiliser la compatibilité de la source 1.5. Cependant, Parfois, ce n'est pas toujours vrai em>. p>
Je me souviens d'une fois lors de la compilation du code 1.4 avec le compilateur 1.5 (en utilisant la compatibilité 1.4). Les pots où OK (1,4 niveau binaire), mais l'application s'est écrasée à cause d'une conversion amusante. P>
Nous avons utilisé un nombre bigdecimal qui passe un entier comme argument au constructeur. version 1.4 n'avait qu'un constructeur de Je dois admettre que c'était un cas étrange, mais c'est l'un de ces cas où la logique ne fonctionne pas. Mon conseil est donc si vous envisagez de compiler pour les anciennes versions de JRE, essayez d'utiliser la version cible JDK chaque fois que possible. P> double code> mais le 1.5 Version avait les deux, le
int code> et les constructeurs code> code>. Ainsi, lors de la compilation avec la compilation 1.4, la conversion automatique de
int code> sur
double code>, mais avec le Compilateur 1.5, il vérifiait que le constructeur
int code> ne pas se rendre compte de cette conversion. Ensuite, lorsque vous utilisez le code compatible Binaire parfait sur 1,4 JRE, le programme s'est écrasé avec un
NoschmethodException code>. P>
@Igor, à partir du document de compatibilité JDK: 7. Java SE 6 rejette correctement les lancements illégaux La mise en œuvre de la distribution adhère de plus près à la spécification de la langue Java. En général, cela signifie que Javac acceptera plus de programmes. Cependant, dans certains cas rares, Javac peut maintenant rejeter des programmes déjà acceptés, mais incorrects. oracle.com/technetwork/java/javase/... En fait, j'ai 1 tel problème.
Bien sûr, ils pourraient avoir des problèmes de compatibilité améliorés. Mon cas était de 1,4-> 1,5 migration. Et 1.3-> 1,4 était encore pire (1,3 était mal brisé)
Désolé de ressusciter ce problème - j'ai mal interprété la question et évitée, et après la lecture, je me sens obligé d'annuler mon vote-- Je ne suis pas sûr que votre situation décrite correspond à celle de l'OP. Ne parlez-vous que sur la compatibilité des sources ( -source code>), ou également sur la cible (
-Target code>) compatibilité? Et vous avez mentionné que vous avez compilé avec un JDK5 à courir dans un JRE1.4. L'OP compile avec JDK5 pour JRE6 et mises à niveau pour compiler avec JDK6 pour JRE6. Votre situation semble beaucoup différente. Mais si vous ne vous en souvenez pas, oubliez-le de toute façon (j'ai déjà évoqué, et cela pourrait toujours servir d'avertissement pour les autres)
duplicaillard possible de Existe-t-il des exemples spécifiques d'en arrière Incompatibilités entre les versions Java?