39 votes

Si je compile un fichier Java avec le dernier JDK, une JVM plus ancienne sera-t-elle capable d'exécuter les fichiers .class ?

Le bytecode dépend-il de la version de Java avec laquelle il a été créé ?

41voto

Stephen C Points 255558

Si je compile un fichier java dans le dernier JDK, une JVM plus ancienne sera-t-elle capable d'exécuter les fichiers .class ?

Cela dépend de trois choses :

  • Les versions réelles de Java dont vous parlez. Par exemple, une JVM 1.4.0 peut exécuter du code compilé par un compilateur 1.4.2, mais pas une JVM 1.3.x. 1 .

  • Les drapeaux de compilation utilisés. Il existe un -target qui lui indique de générer du code qui fonctionnera sur une ancienne JVM (cible). Et le -source indique au compilateur de n'accepter que les caractéristiques du langage de l'ancienne JVM. (Cette approche ne fonctionnera pas toujours, en fonction des caractéristiques du langage Java utilisées par votre code. Mais si le code se compile, il devrait fonctionner).

  • Les classes de la bibliothèque que le fichier de classe utilise. S'il utilise des classes de bibliothèque qui n'existent pas dans les anciennes bibliothèques de classe, il ne fonctionnera pas ... à moins que vous puissiez inclure un JAR qui rétrocomporte les classes. 2 . Vous pouvez éviter ce problème en utilisant l'option -bootclasspath pour compiler votre code avec les API de l'ancienne version de Java.

Le bytecode dépend-il de la version de java avec laquelle il a été créé ?

Oui, modulo les points ci-dessus.


1 - Le JVMS de Java 8 indique ceci : "L'implémentation de la machine virtuelle Java d'Oracle dans la version JDK 1.0.2 prend en charge les versions du format de fichier de classe 45.0 par le biais de 45.3 inclusive. Les versions du JDK 1.1.* support des versions de format de fichier de classe dans la gamme 45.0 par le biais de 45.65535 inclusive. Pour k 2, la version du JDK 1.k prend en charge les versions du format de fichier de classe dans la plage 45.0 par le biais de 44+k.0 inclusivement."

2 - Un backport pourrait aussi être problématique. Par exemple : 1) Les choses qui dépendent du support du code natif nécessiteront très probablement que vous mettre en œuvre que le code natif supporte. 2) Vous devrez très probablement placer tout fichier JAR de back-port sur le bootclasspath lorsque vous exécuter le code sur l'ancienne JVM.

10voto

Andrew Thompson Points 108505

Le bytecode dépend-il de la version de java avec laquelle il a été créé ?

Normalement oui. Mais en utilisant les options -source, -target et -bootclasspath un compilateur 1.7+ peut être utilisé pour créer des binaires compatibles avec Java 1.1.

0 votes

Notez que le JDK 1.8 indique que la compilation pour la cible 1.5 est dépréciée, et que le JDK 1.9 supprimera complètement le support de la cible 1.5 : openjdk.java.net/jeps/182 ...mais cependant, sur le JDK 1.9, la compilation pour les anciennes versions est plus facile car le bootclasspath n'est pas requis : openjdk.java.net/jeps/247

3voto

birryree Points 29165

Le bytecode de la JVM est compatible avec les principales versions de la JVM, mais pas avec les versions précédentes. Toutefois, pour obtenir les meilleures informations, vous devez lire les notes de mise à jour de la JVM, car elles indiquent généralement dans quelle mesure le bytecode est rétrocompatible.

Modifier la clarification puisque cela a provoqué une discussion dans les commentaires

Le bytecode de la JVM est compatible avec les versions ultérieures de la JVM, ce qui signifie que le bytecode d'une JVM est compatible avec les versions ultérieures de la JVM. Par exemple, vous pouvez prendre le bytecode de la JVM 1.4 et l'exécuter dans la JVM Java 5 ou Java 6 (en dehors de tout problème de régression comme l'a souligné Andrew).

Le bytecode JVM n'est pas rétrocompatible entre les JVM, de sorte que le bytecode d'une JVM n'est pas garanti de fonctionner dans une version antérieure de la JVM, comme ce serait le cas si vous essayiez d'exécuter du code compilé pour Java 6 dans une JVM 1.4.2.

1 votes

@birryree : Les nouvelles versions sont rétrocompatibles. Les anciennes versions ne sont pas compatibles avec le futur. Cela aura plus de sens, qu'en dites-vous ?

1 votes

@Adeel : Je dirais que c'est votre commentaire qui est absurde. Une applet créée en Java 1.1 devrait fonctionner sans problème en Java 1.6, sauf bogues de régression.

0 votes

@Andrew : Je dis exactement la même chose. Est-ce que je l'ai formulé différemment ? Les nouvelles versions sont rétrocompatibles, ce qui signifie que l'applet 1.1 devrait fonctionner parfaitement dans la version 1.6.

3voto

MeBigFatGuy Points 12489

Tout d'abord, tous les fichiers java ont un octet de version dans l'en-tête de la classe. Les anciens jvms ne chargeront pas les classes avec des versions plus récentes, quelles que soient les fonctionnalités qu'elles possèdent.

1voto

Adeel Ansari Points 24434

Le bytecode dépend-il de la version de java avec laquelle il a été créé ?

Oui.

Si je compile un fichier java dans le dernier JDK, une JVM plus ancienne sera-t-elle capable d'exécuter les fichiers .class ?

Non. Mais l'inverse fonctionnera, très probablement. Vous pourriez aimer voir ça fil conducteur intéressant il parle du backporting de Java.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X