Aller au contenu

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