Histoire de Java¶
Java est ne en 1995 dans les laboratoires de Sun Microsystems, sous la direction de James Gosling. Conçu initialement pour les systèmes embarqués sous le nom de code "Oak", il s'est impose comme le langage dominant du monde entreprise grâce à son principe fondateur : "Write Once, Run Anywhere". Aujourd'hui maintenu par Oracle et la communauté OpenJDK, Java reste l'un des langages les plus utilisés au monde, avec un cycle de releases soutenu tous les six mois.
Origines et philosophie¶
James Gosling commence le projet en 1991 chez Sun Microsystems, dans le cadre du projet "Green". L'objectif initial est de créer un langage pour les appareils grand public (décodeurs TV interactifs). Le nom Java est adopte en 1995, en référence au cafe de Java (Indonesie), boisson de predilection de l'équipe.
Les principes fondateurs du langage :
- Portabilité : le bytecode Java s'exécuté sur toute JVM, quel que soit l'OS
- Sécurité : sandbox d'exécution, gestion mémoire automatique, pas d'arithmetique sur les pointeurs
- Robustesse : typage statique fort, exceptions verifiees à la compilation
- Orientation objet : tout est objet (hormis les types primitifs)
- Simplicité relative : syntaxe inspirée de C/C++ mais sans la gestion manuelle de la mémoire
Le slogan "Write Once, Run Anywhere" (WORA) incarne la promesse de la JVM : compiler une seule fois en bytecode .class, puis exécuter sur n'importe quelle plateforme disposant d'une JVM compatible.
Chronologie des versions majeures¶
| Version | Date | Événements clés |
|---|---|---|
| Oak / 1.0 | 1995 | Première version publique, applets, AWT |
| J2SE 1.2 | 1998 | Collections Framework, Swing, JIT compiler, renommage J2SE |
| J2SE 1.4 | 2002 | assert, NIO, expressions régulières, logging |
| Java 5 | 2004 | Génériques, annotations, autoboxing, enum, varargs, for-each |
| Java 6 | 2006 | Performances JVM, scripting API, JDBC 4 |
| Java 7 | 2011 | try-with-resources, diamond operator, switch sur String, NIO 2 |
| Java 8 LTS | 2014 | Lambdas, Stream API, Optional, Date/Time API, interface default |
| Java 11 LTS | 2018 | HTTP Client standard, var pour lambdas, suppression d'applets |
| Java 17 LTS | 2021 | Sealed classes, records, pattern matching instanceof, text blocks |
| Java 21 LTS | 2023 | Virtual threads (Project Loom), sequenced collections, record patterns |
Versions LTS
En production entreprise, privilegiez les versions LTS (Long-Term Support) : Java 11, 17 et 21. Oracle propose 8 ans de support commercial pour ces versions. Java 21 est la version LTS recommandee en 2025.
Le rachat par Oracle (2010)¶
Sun Microsystems est rachetee par Oracle Corporation en 2010 pour 7,4 milliards de dollars. Ce changement de propriété entraîné plusieurs conséquences importantes :
- Licence : Oracle introduit des frais commerciaux pour certaines distributions Oracle JDK à partir de Java 8 update 211 (2019)
- Litige : Oracle poursuit Google pour l'utilisation de l'API Java dans Android (affaire tranchee en faveur de Google en 2021 par la Cour Supreme americaine)
- OpenJDK : la référence open source du JDK reste disponible sous licence GPL v2
Suite au changement de politique de licence Oracle, l'écosystème s'est structure autour d'alternatives gratuites et ouvertes.
OpenJDK et les distributions¶
OpenJDK est l'implémentation de référence open source de Java. De nombreuses organisations proposent leurs propres distributions basées sur OpenJDK :
| Distribution | Éditeur | Points forts |
|---|---|---|
| Temurin | Eclipse Foundation | Gratuit, certifie TCK, recommande par défaut |
| Corretto | Amazon | Support LTS étendu, optimise AWS |
| Microsoft JDK | Microsoft | Optimise Azure, support Teams |
| Liberica JDK | BellSoft | Variante JavaFX incluse, support embarque |
| GraalVM CE | Oracle / GraalVM.io | Compilation native, polyglotte (JS, Python, Ruby) |
| Zulu | Azul Systems | Support commercial disponible, large compatibilité |
| SapMachine | SAP | Optimise pour SAP, support LTS étendu |
Choix de distribution
Pour la plupart des projets, Eclipse Temurin est le choix par défaut. Il est gratuit, open source, certifie TCK et largement supporte par les outils CI/CD. Amazon Corretto est preferable sur AWS. GraalVM est recommande pour la compilation native (microservices, serverless).
Le cycle de release moderne¶
Depuis Java 9 (2017), Java adopte un cycle de release cadence tous les six mois (mars et septembre). Ce rythme accéléré permet de livrer plus fréquemment des fonctionnalités sans attendre des versions majeures.
Java 21 (LTS) — Sept 2023
Java 22 — Mars 2024
Java 23 — Sept 2024
Java 24 — Mars 2025
Java 25 (LTS) — Sept 2025 (prevu)
Les fonctionnalités passent par des phases :
- Preview : fonctionnalité introduite mais susceptible de changer, activee avec
--enable-preview - Incubator : module experimental (surtout pour les API de bas niveau)
- Standard : fonctionnalité definitivement stabilisee
Java 21 — Les virtual threads (Project Loom)¶
Java 21 introduit les virtual threads (JEP 444), l'une des évolutions les plus significatives depuis les lambdas de Java 8. Les virtual threads sont des threads gérés par la JVM (et non par l'OS), permettant de créer des millions de threads concurrents sans la surchargé habituelle.
import java.util.concurrent.Executors;
// Avant Java 21 : thread OS, couteux
Thread thread = new Thread(() -> System.out.println("Thread classique"));
thread.start();
// Java 21 : virtual thread, ultra-leger
Thread vthread = Thread.ofVirtual().start(() ->
System.out.println("Virtual thread")
);
// Executor avec virtual threads — remplace les thread pools
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
for (int i = 0; i < 100_000; i++) {
executor.submit(() -> {
// Chaque tache obtient son propre virtual thread
Thread.sleep(Duration.ofMillis(100));
return "done";
});
}
} // L'executor est ferme automatiquement (AutoCloseable)
Virtual threads et synchronisation
Les virtual threads sont optimaux pour les charges I/O-bound (requêtes HTTP, accès base de données). Evitez les blocs synchronized longs avec des virtual threads — ils peuvent provoquer du "thread pinning" (le virtual thread bloque un thread porteur OS). Preferez ReentrantLock pour les sections critiques longues.
Positionnement actuel¶
Java reste un choix dominant dans les secteurs exigeants fiabilité et maturité :
| Domaine | Outils / Frameworks phares |
|---|---|
| Applications web | Spring Boot, Quarkus, Micronaut, Jakarta EE |
| Microservices | Spring Cloud, Quarkus, Helidon MicroProfile |
| Systèmes distribués | Apache Kafka, Apache Flink, Hazelcast |
| Big Data | Apache Spark (JVM), Apache Hadoop |
| Android | Kotlin (premier), Java (historique et interopérabilité) |
| Finance / trading HFT | Java (latence faible, JVM tuning avance) |
| Serverless | GraalVM native-image, Quarkus, Micronaut |
L'écosystème Java beneficie de plusieurs decennies d'investissement en bibliotheques, outils et bonnes pratiques documentees. La JVM elle-même, avec son JIT compiler avance (C1/C2, GraalVM JIT), produit des performances proches du C++ pour les applications longue durée.
La JVM — Java Virtual Machine¶
La JVM est le cœur de l'écosystème Java. Elle ne exécuté pas du code machine directement, mais du bytecode compile par javac. Ce bytecode est portable entre architectures.
Source Java (.java)
|
javac
|
Bytecode (.class)
|
JVM
/ \
Interpreter JIT Compiler
|
Code machine natif
La JVM moderne comporte plusieurs composants clés :
- Class Loader : charge les classes à la demande
- JIT Compiler (C1/C2) : compile le bytecode en code natif après analyse des points chauds (hotspots)
- Garbage Collector : gestion automatique de la mémoire (G1GC par défaut depuis Java 9, ZGC et Shenandoah disponibles)
- JVM Profiling : Java Flight Recorder (JFR) intégré depuis Java 11
La JVM n'est pas exclusivement pour Java : Kotlin, Scala, Groovy, Clojure et d'autres langages compilent tous vers le même bytecode JVM.
Interopérabilité JVM — les autres langages¶
La JVM est une plateforme multi-langages. Plusieurs langages modernes ciblent la JVM et s'interoperent pleinement avec Java :
| Langage | Créé par | Points forts | Usage principal |
|---|---|---|---|
| Kotlin | JetBrains | Null-safety, coroutines, syntaxe concise, 100% interop Java | Android, backend Spring, scripts |
| Scala | EPFL | Typage fort, FP et OOP, Akka, Spark | Big Data, systèmes distribués |
| Groovy | Apache | Syntaxe souple, DSLs, scripting, Gradle | Scripts, tests (Spock), Gradle |
| Clojure | Rich Hickey | Lisp fonctionnel immuable, REPL, concurrence simplifiée | Applications fonctionnelles |
// Kotlin — interoperabilite totale avec Java
// Un service Kotlin peut appeler n'importe quelle classe Java
import com.example.item.ItemService // Classe Java importee directement
class KotlinItemController(private val service: ItemService) {
// Null-safety Kotlin : String? vs String (non-null garanti)
fun trouverNom(id: Long): String? {
// orElse remplace Optional en Kotlin grace a l'interop
return service.trouverParId(id).nom
}
}
Kotlin et Spring Boot
Kotlin est officiellement supporte par Spring Boot et le Spring Framework. La documentation Spring fournit des exemples en Java et en Kotlin. Pour les nouveaux projets, Kotlin offre une productivité supérieure tout en restant 100% compatible avec l'écosystème Java existant.
Java dans les classements et la communauté¶
Java maintient une position de premier plan dans les indices de popularité malgre son âge :
- TIOBE : Java oscille entre la 2e et la 4e place depuis des années, deriere Python
- Stack Overflow Survey : Java reste dans le top 5 des langages les plus utilisés professionnellement
- GitHub : des millions de repositories Java actifs, forte activité open source
La communauté Java est organisée autour de plusieurs événements et structures :
- JUGs (Java User Groups) : groupes locaux presents dans des dizaines de pays
- Devoxx : conference europeenne majeure (Belgique, France, UK, Maroc, etc.)
- JavaOne / Oracle CloudWorld : conference Oracle annuelle
- Foojay.io : communauté indépendante des développeurs JVM
- OpenJDK mailing lists : lieu de discussion des évolutions du langage