Une récente Java Enhancement Proposal (JPE, proposition d'amélioration du JDK), qui cible à la fois les versions 8 et 9 de java, tend à réguler le support des options -target
et -source
du compilateur Java. La proposition part du principe qu'un compilateur doit supporter au plus 3 versions antérieures à la version du compilateur lui-même.
L'option -target
indique au compilateur de générer les classes Java dans une version spécifique de Java. Bien que généralement spécifié comme une version de Java telle que 1.5 ou 1.6, cette option se traduit par une version cible du bytecode généré:
- 48: Java 4
- 49: Java 5
- 50: Java 6
- 51: Java 7
- 52: Java 8 (à paraître)
- 53: Java 9 (à paraître)
L'option -source
permet au compilateur de remonter ou de traiter comme des erreurs les nouveaux concepts du langage, tels que les expressions lambda, try-with-resources, strings-in-switch, etc... Certaines des nouvelles fonctionnalités du langage (comme les expressions lambda) s'appuient sur des caractéristiques spécifiques du bytecode (comme invokedynamic
). Il en résulte qu'il est rarement possible d'utiliser du code s'appuyant sur une version plus récente que la version ciblée.
La JEP 182 propose qu'au plus 3 versions -target
et -source
soient supportées par les prochaines versions du compilateur. Cette limitation implique la fin de Java 6 cette année, la limitation de supporter Java 6 n'incombant qu'au compilateur Java 8 (de même pour Java 7 avec le compilateur Java 9). Cette restriction ne devrait pas affecter qui que ce soit de manière significative. Néanmoins, certains outils de build (tels que Maven), fixent la version de Java à 1.5 si celle-ci n'est pas spécifiée de manière explicite, ce qui pourrait entraîner la nécessité d'une mise à jour pour permettre au programme d'être exécuté sous Java 8.
Le changement est en marche, la jsr14
et la cible 1.4
ne sont plus acceptés par Java 8, l'utilisation de Java 1.5
lèvera des warnings. Java 9 supprimera le support de la version 1.5
et lèvera des warnings pour la version 1.6
.
D'un point de vue pratique, tout ceci n'a pas l'air d'un grand changement, mais jusqu'à il n'y a pas longtemps, les contextes OSGi étaient compilés avec les options -source 1.5 -target jsr14
afin de compiler du code contenant des génériques tout en générant du bytecode compatible avec J2ME. L'utilisation de jsr14 a été supprimée l'année dernière de la code base d'Eclipse. Sachant qu'Android a largement pris le dessus sur J2ME (et dans tous les cas, des runtimes OSGI comme Felix et Equinox demeurent disponibles au cas où le besoin commercial existerai), le fait qu'ils soient compilés à l'aide d'une version plus récente ne devrait pas poser de problème à la majorité des développeurs Java.