Avec la sortie de Java 25, les développeurs sont confrontés à de nouveaux défis de compatibilité, notamment en ce qui concerne les API internes et les bibliothèques tierces.
- Approfondissement du système de modules Jigsaw
Java 25 continue de renforcer le système de modules Jigsaw, entraînant une encapsulation plus stricte des API internes du JDK. L'accès direct aux packages commençant par sun.* ou com.sun.* entraînera des erreurs de compilation ou d'exécution. Pour résoudre ce problème, vous pouvez explicitement ouvrir des modules à l'aide des options --add-exports ou --add-opens.
Exemple : Accès aux API internes au démarrage
java --add-exports java.base/sun.nio.ch=ALL-UNNAMED -jar mon_application.jar
- API obsolètes et supprimées
Plusieurs API ont été officiellement marquées comme obsolètes ou supprimées dans Java 25. Par exemple, le framework d'activation RMI a été entièrement supprimé, ce qui affecte les applications qui dépendent de l'activation dynamique des objets distants. Les développeurs doivent examiner l'utilisation des classes suivantes :
java.rmi.activation.Activatablejava.rmi.activation.ActivationGroupjavax.xml.bind.JAXBContext(peut encore être utilisé via des bibliothèques tierces)
- Compatibilité des bibliothèques tierces
Les versions antérieures des frameworks populaires tels que Spring Framework, Hibernate et Apache Kafka peuvent ne pas être compatibles avec les politiques d'encapsulation renforcées de Java 25. Il est conseillé de consulter la documentation officielle de chaque projet pour connaître la version minimale prise en charge.
Compatibilité des bibliothèques courantes
| Nom de la bibliothèque | Version minimale compatible | Remarques |
|---|---|---|
| Spring Framework | 5.3+ | Nécessite l'activation de l'accès aux classes internes via réflexion |
| Hibernate | 5.6.0.Final+ | Évitez d'utiliser le proxy JDK pour la génération d'entités |
| Log4j 2 | 2.17.0+ | Correction des problèmes de chargement du chemin du module |
- Évolution des caractéristiques du langage Java
Depuis Java 8, le langage a considérablement évolué, introduisant des fonctionnalités modernes pour améliorer l'efficacité et la lisibilité du code.
- Java 8 : Expressions Lambda et API Stream pour la manipulation des collections.
- Java 9 : Système de modules (JPMS) pour une meilleure encapsulation.
- Java 10 : Inférence de type de variable locale (
var). - Java 14 : Types
recordet expressionsswitch. - Java 17 : Classes scellées pour un contrôle d'héritage amélioré.
Exemple : Utilisation de l'API Stream
List<string> noms = personnes.stream()
.filter(p -> p.getAge() > 18)
.map(Personne::getNom)
.collect(Collectors.toList());</string>
- Impact du système de modules sur la gestion des dépendances
Le système de modules de la plateforme Java (JPMS), introduit dans Java 9, a transformé la gestion des dépendances par rapport au classpath traditionnel. Il garantit l'encapsulation et la maintenabilité grâce à la déclaration explicite des dépendances des modules.
Exemple : Déclaration de module
module com.exemple.service {
requires com.exemple.core;
exports com.exemple.service.api;
}
Ce code définit un module com.exemple.service qui dépend de com.exemple.core et n'exporte que le package api.
- Migration d'API obsolètes dans les frameworks
Lors de la mise à niveau de Spring Framework 5 vers Spring 6, l'ancien mécanisme d'écoute HttpSessionBindingListener a été marqué comme obsolète. Il est désormais recommandé d'utiliser un modèle piloté par les événements plus flexible.
Exemple : Ancien code (HttpSessionBindingListener)
public class UserSessionListener implements HttpSessionBindingListener {
@Override
public void valueBound(HttpSessionBindingEvent event) {
log.info("Utilisateur connecté : " + event.getName());
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
log.info("Utilisateur déconnecté : " + event.getName());
}
}
Exemple : Nouvelle approche recommandée (ApplicationListener)
@Component
public class SessionCleanupListener implements ApplicationListener<SessionDestroyedEvent> {
@Override
public void onApplicationEvent(SessionDestroyedEvent event) {
event.getSession().getAttributeNames().forEach(name -> {
log.info("Nettoyage de l'attribut : " + name);
});
}
}
- Adaptation des bibliothèques tierces aux nouvelles versions
Alors que les frameworks de développement populaires mettent à jour leurs versions majeures, la compatibilité des bibliothèques tierces devient une préoccupation majeure. De nombreuses bibliothèques ont publié des versions compatibles, mais la fragmentation de l'écosystème persiste.
Exemple : Intercepteurs Axios mis à jour
L'écriture des intercepteurs Axios a évolué. Le nouveau code nécessite une gestion explicite des promesses.
// Ancienne écriture d'intercepteur Axios
axios.interceptors.response.use(res => res.data);
// Nouvelle écriture nécessitant le renvoi explicite de Promise
axios.interceptors.response.use(
response => response,
error => Promise.reject(error)
);