Java Language Compiler pour une version différente de Java


Exemple

Le langage de programmation Java (et son exécution) a subi de nombreuses modifications depuis sa sortie depuis sa publication initiale. Ces changements incluent:

  • Changements dans la syntaxe et la sémantique du langage de programmation Java
  • Modifications apportées aux API fournies par les bibliothèques de classes standard Java.
  • Modifications apportées au jeu d'instructions Java (bytecode) et au format classfile.

À quelques exceptions près (par exemple, le mot clé enum , les modifications apportées à certaines classes "internes", etc.), ces modifications sont rétrocompatibles.

  • Un programme Java compilé à l'aide d'une ancienne version de la chaîne d'outils Java s'exécute sur une plate-forme Java plus récente sans recompilation.
  • Un programme Java écrit dans une version antérieure de Java sera compilé avec un nouveau compilateur Java.

Compiler l'ancien Java avec un compilateur plus récent

Si vous devez (re) compiler un code Java plus ancien sur une plate-forme Java plus récente pour qu'il s'exécute sur la nouvelle plate-forme, vous n'avez généralement pas besoin d'indiquer de compilation spéciale. Dans quelques cas (par exemple, si vous avez utilisé enum comme identifiant), vous pouvez utiliser l'option -source pour désactiver la nouvelle syntaxe. Par exemple, compte tenu de la classe suivante:

public class OldSyntax {
    private static int enum;  // invalid in Java 5 or later
}

les éléments suivants sont requis pour compiler la classe à l'aide d'un compilateur Java 5 (ou ultérieur):

$ javac -source 1.4 OldSyntax.java

Compiler pour une plate-forme d'exécution plus ancienne

Si vous devez compiler Java pour qu'il fonctionne sur une plate-forme Java plus ancienne, l'approche la plus simple consiste à installer un JDK pour la version la plus ancienne à prendre en charge et à utiliser le compilateur JDK dans vos versions.

Vous pouvez également compiler avec un compilateur Java plus récent, mais il y a des complications. Tout d'abord, il existe des conditions préalables importantes qui doivent être satisfaites:

  • Le code que vous compilez ne doit pas utiliser les constructions de langage Java qui n'étaient pas disponibles dans la version de Java que vous ciblez.
  • Le code ne doit pas dépendre des classes Java standard, des champs, des méthodes, etc., qui n'étaient pas disponibles sur les anciennes plates-formes.
  • Les bibliothèques tierces dont dépend le code doivent également être construites pour l'ancienne plate-forme et disponibles à la compilation et à l'exécution.

Étant donné que les conditions préalables sont remplies, vous pouvez recompiler le code pour une plate-forme plus ancienne en utilisant l'option -target . Par exemple,

$ javac -target 1.4 SomeClass.java

compilera la classe ci-dessus pour produire des bytecodes compatibles avec JVM Java 1.4 ou ultérieur. (En fait, l'option -source implique un -target compatible, donc javac -source 1.4 ... aurait le même effet. La relation entre -source et -target est décrite dans la documentation Oracle.)

Cela dit, si vous utilisez simplement -target ou -source , vous compilerez toujours avec les bibliothèques de classes standard fournies par le JDK du compilateur. Si vous ne faites pas attention, vous pouvez vous retrouver avec des classes avec la version correcte du bytecode, mais avec des dépendances sur des API non disponibles. La solution consiste à utiliser l'option -bootclasspath . Par exemple:

$ javac -target 1.4 --bootclasspath path/to/java1.4/rt.jar SomeClass.java

compilera avec un autre ensemble de bibliothèques d'exécution. Si la classe compilée a des dépendances (accidentelles) sur les nouvelles bibliothèques, cela vous donnera des erreurs de compilation.