Java 25 est sorti le 16 septembre et est désormais disponible en télécharrgement chez les principaux distributeurs (Eclipse Temurin par exemple) ainsi qu’en images dockers pour la plupart des systèmes. Voici quelques conseils pour pouvoir migrer.
Le passage de java 21 à java 25 ne devrait pas provoquer de grosse rupture sur les applications de gestion classiques. Les retraits portent sur des éléments déjà dépréciés depuis plusieurs versions ou qui ne sont plus utilisés. La suite du document reprend les principaux changements et un résumé des plus mineurs. Par contre les dépréciations ne sont pas mentionnées.
Pour les lib avec annotations processors (lombok, …) Link to heading
Lombok est un annotation processor : ce qui signifie que la librairie génère du code à la compilation suivant les annotations existantes dans le code compilé. De nombreuses autres librairies de la sorte existent comme Manifold qui permettent de générer du code utile à la compilation à partir de simples annnotations.
A partir de java 23, le comportement par défaut de java n’est plus de traiter automatiquement les annotation processors. Ainsi il ne suffit plus d’avoir lombok dans son classpath pour que l’annotation processor soit appelé : il faut spécifier explicitement au compilateur de le faire à l’aide d’une option sur la ligne de commande. La façon de faire recommandée consiste à explicitement placer les librairies d’annotation processor dans le --processor-path (en plus du classpath). Ce qui donne pour un fichier pom.xml dans le cas de lombok :
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--Autres dépendances du projet-->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.14.0</version>
<configuration>
<!--Ajout nécessaire à partir de java 23-->
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<!-- Autres plugins du projet-->
</plugins>
<!--éventuelles autres configurations pour le build-->
</build>
NB : fichier pom.xml reproduit partiellement avec seulement les parties pertinentes
Le Security Manager va être supprimé Link to heading
la classe
SecurityManagerva être supprimée : elle existe encore mais les appels conduisent à des erreursil faut supprimer :
- les appels à
System#setSecurityManageretSystem#getSecurityManager - les utilisations de la propriété système
java.security.manager - L’utilisation de la classe
javax.security.auth.Subject(pour gérer le informations d’authentification) ne doivent plus s’appuyer sur le security manager mais sur la nouvelle API Java Authentication and Authorization Service (JAAS) :- Remplacer
Subject::doAsparSubject::callAs - Remplacer
Subject::getSubjectparSubject::current
- Remplacer
- les appels à
Voir la JEP 486 pour les motivations de la suppression et les alternatives
Des flags de la ligne de commande supprimés Link to heading
Ce sont des flags qui n’ont plus de raison d’être ou sont sans effet mais qui peuvent encore traîner dans certains scripts :
-XX:[+-]RegisterFinalizersAtInit-XX:+UseEmptySlotsInSupers-Xnoagent-t-tm-Xfuture-checksource- ‘-cs`
-noasyncgc
-profile et -p sont retirés de jdeps car les options en question étaient dépréciées
Le module jdk.random est retiré
Link to heading
Les packages du module jdk.random ont été déplacés dans java.base
Changements plus annodins Link to heading
On note des changements “plus annodins” car la plupart des applications ne devraient pas être concernées. Au besoin ils sont détaillés dans la vidéo citée en référence (bien lire les liens dans la description de la vidéo) :
- utilisation interdite de
finalavec un record pattern - utilisation interdite de
includecomme nom de propriété dans les fichiers de propriétés pour la sécurité - Vérification de nullité lors de l’utilisation de la réflexioon dans les contructeurs des classes internes
- Warning lors de l’utilisation de
sun.misc.Unsafeet restrictions sur certaines opérations de JNI et Foreign function memory api - Suppressions (éléments déjà dépréciés) :
- prise en charge du 32bit
- GTK2
- Suppression de certaines Time Zone
Thread#suspend,Thread#resume,ThreadGroup#suspendetThreadGroup#resume
- Correction de “bogues” sur l’utilisation des I/O avec Windows :
- les chemins commençant en
\\?sont maintenant acceptés - les noms de fichiers et de répertoires finissant par des espaces sont rejettés (comme dans les outils natifs windows)
- il n’y a plus de tentative de supprimer des fichiers en lecture seule
- les chemins commençant en
- Ne plus utiliser les définitions de locales tirées de JRE/COMPAT (affecter la valeur
COMPATou bienJREà la propriétéjava.locale.providersn’a aucun effet : utiliser CLDR (c’est ce que fait java par défaut avec CLDR version 44
Scanner son code à la recherche d’éléments dépréciés d’API Link to heading
- Utiliser jdeprscan