Le classpath n'est pas
        mort...
       mais presque
   10:40-11:30 - Salle Miles Davis
Le classpath n'est pas
        mort...
         mais presque




         @AlexisHassler
  Développeur, formateur indépendant



                                       27 au 29 mars 2013
"Classpath is dead!"


Mark Reinhold
JavaOne 2009
Classpath
Classloader
Mort ?
Successeur
Alexis Hassler

Développeur, formateur Java
Indépendant
Co-leader du
Classpath
Chercher les classes

 String hello = "Bonjour Devoxx";
 MyStuff var;




                                            T H
                                       PA
                                    SS
                                 LA
                               C
-classpath



   java -cp hello-lib.jar HelloWorld
Manifest


       Manifest-Version: 1.0
       Class-Path: hello-lib.jar
       Main-Class: HelloWorld
Connaitre le classpath



     System.getProperty("java.class.path");
Erreurs

java.lang.NoClassDefFoundError


    java.lang.ClassNotFoundException
Classpath



     Géré par des classloaders
Classloader
java.lang.ClassLoader

loadClass(String name) : Class<?>

getResource(String name) : URL
getResources(String name) : Enumeration<URL>
getResourceAsStream(String name) : InputStream

getParent() : ClassLoader
Classloader

          MyStuff.class.getClassLoader()




                                                        T H
                                                   PA
sun.misc.Launcher$AppClassLoader                SS
                                             LA
                                           C
Bootstrap Classloader


    classloader.getClass().getClassLoader()




                                  null
Bootstrap Classloader




           BootstrapClassLoader
Délégation

un.misc.Launcher$AppClassLoader
      System ClassLoader              Parent
                   t h                 first
                p asun.misc.Launcher$ExtClassLoader
             s s        Extension ClassLoader          Parent first

       C   la                      nsion
                                xte             BootstrapClassLoader
                               E
Délégation

  System ClassLoader
               t h
            p a
         s s           java -cp hello-lib.jar ...

   C   la
                       System.getProperty("java.class.path")
                       ;
Délégation

 java -Djava.ext.dirs=~/.java7/ext ...


                   Extension ClassLoader

                              sion
                             n
                         xte
                        E


                   System.getProperty("java.ext.dirs");
Délégation



         Ext != Endorsed
Délégation


  java -Xbootclasspath:hello-rt.jar ...



                                          BootstrapClassLoader



  System.getProperty("sun.boot.class.path")
  ;
bootclasspath

 java -Xbootclasspath:hello-rt.jar ...



 java -Xbootclasspath/a:hello-lib.jar ...




 java -Xbootclasspath/p:hello-lib.jar ...
Endorsed

  java -Djava.endorsed.dirs=~/.java7/endorsed ...




                                        BootstrapClassLoader
                                                    d
                                                 rse
                                           d   o
                                         En
Endorsed

APIs standards hors JCP
   org.omg (CORBA), org.w3c.dom, org.xml.sax
    (XML)

APIs standalone
   JAXP, JAXB, Scripting, Compiler API,...
Démonstration

http://github.com/hasalex/classpath-demo




                                           27 au 29 mars 2013
Démonstration
 System ClassLoader             BootstrapClassLoader




  classloader-demo




 java -cp cl-demo.jar fr.sewatech.classpath.Count
Démonstration
                                   BootstrapClassLoader




    classloader-demo




java -Xbootclasspath/p:lib/cl-demo.jar fr.sewatech.classpath.Count
URLClassloader


             java.net.URLClassLoader
                                                      URL
                                                       URL
                                                        URL

un.misc.Launcher$AppClassLoader

                   sun.misc.Launcher$ExtClassLoader
URLClassloader

  URL ClassLoader          Parent
                            first

                    URL ClassLoader          Parent
                                              first

  URL ClassLoader
                                    System ClassLoader    Parent
                                                           first

                                                Bootstrap ClassLoader
FLTM Classloader



       Fait Le Toi-Même
Usages

Application Servers
JRebel
Javassist, CGLib,...
Tomcat

   Webapp1


 Webapp2
                      Common

 Webapp3
                               System
             Local First

                                        Bootstrap
JBoss AS 5

                Web App
                Local First

                                Common


                   Repo First
Web Module
 Web App                                 System
                   Ent App

   EJB Module                                     Bootstrap
Erreurs

                      WT
ClassCastException
                        F ?
      MyStuff cannot be cast to MyStuff
Erreurs


URL ClassLoader   MyStuff var = MyStuffFactory.build();


                               ≠
URL ClassLoader   return new MyStuff() ;
Démonstration


http://github.com/hasalex/classpath-demo




                                           27 au 29 mars 2013
Démonstration

                     message-main



  classloader-demo
                         message-common



                     message-printer
Démonstration




                                              Ma a
                                                ve ssL
                                                 Cl
          path




                                                  n R oa
 C la   ss                     message-main




                                                     ep d e
                                                       os r
      classloader-demo
                                   message-common




                                                         ito
                                                             ry
                              message-printer

java -cp cl-demo.jar:msg-main.jar fr.sewatech.classpath.HelloViaMvnRepo
Démonstration

        System ClassLoader   ParentFirst ClassLoader




                                  message-main
 classloader-demo

                                message-common
         message-main
                                 message-printer
Démonstration

        System ClassLoader   LocalFirst ClassLoader




                                 message-main
 classloader-demo

                               message-common
         message-main
                                message-printer
Mort
Jar
                                  HELL


http://www.ironmaidenwallpaper.
Dépendances

Maven, Gradle,...
Dépendances



                     ath
                  sp
                s
          C   la
Runtime

A plat
                                            t h
Fichiers jar                             p a
                                    ss
   juste du stockage          C   la
   pas ou peu de métadonnée
Runtime

Hiérarchique
   applications server
Démonstration

http://github.com/hasalex/classpath-demo




                                           27 au 29 mars 2013
Démonstration
                                          slf4j-api
                                            1.7.2

                     message-main



  classloader-demo
                         message-common



                     message-printer
                                          slf4j-api
                                           1.5.11
Remplaçant
Granularité

Classpath

            Application
Granularité

Application Web / JavaEE
              Application Monolithique
Granularité

Application Web / JavaEE
         Application   Librairies partagées
Modularité

Application Web / JavaEE
    Application
Modularité

             Visibilité
Import
          Export


Dépendances transitives
Java embarqué
       Java SE
       Java serveur
1999
OSGi

Bundle
   Fichier jar
   META-INF/MANIFEST.MF
   Import / export de packages
OSGi


   Bundle-Name = Simple Bundle
   Bundle-SymbolicName = simple-bundle
   Bundle-Description = Simple Bundle.
   Export-Package = fr.sewatech.mystuff.services
   Import-Package = org.osgi.framework;version=1.3
   Bundle-Version = 1.0.1
OSGi


                                             Services
       Applications
       (bundles)
                                       Life Cycle

                                    Module

                      Java Execution Environment

                       OS + Hardware
OSGi

Apporte de la valeur
   => applications hautement dynamiques

Apporte de la complexité
   => outils pour gérer la complexité
Jigsaw

Projet OpenJDK


             (2008)   8 (2012)   9 (2015)   ...
Intégré au JDK 7
Jigsaw

Modularité des applications


Modularité du JDK
Jigsaw

Dépendance à une partie du JDK
   Plus besoin de Corba pour Hello World
   Plus besoin de Swing pour Tomcat

Repository
   Téléchargement automatique des modules
Jigsaw

module-info.java
     module message-main @ 1.0 {
         exports fr.sewatech.message;
         requires fr.sewatech.message-common @ 1.1;
         class fr.sewatech.message.Main;
     }
JBoss Modules

Sous-projet de JBoss AS 7
Inspiré de Jigsaw
Base de JBoss OSGi
JBoss Modules

Java SE

     java -jar jboss-modules.jar -mp path/to/modules
          my.main.module.name
JBoss Modules
            org
                  hibernate
  module              main
    s
     com                 hibernate-infinispan-4.1.6.F
    fr                             inal.jar
                         hibernate-core-4.1.6.Fin
    org                           al.jar
                         hibernate-entitymanager-4.1.6
    ...                             .Final.jar
                         module.x
                            ml
JBoss Modules
  <?xml version="1.0" encoding="UTF-8"?>
  <module xmlns="urn:jboss:module:1.1"
         name="fr.sewatech.conference.classloader-demo">
     <main-class name="fr.sewatech.classpath.Hello"/>
     <resources>
         <resource-root path="classloader-demo-1.0-SNAPSHOT.jar"/>
     </resources>
     <dependencies>
         <module name="fr.sewatech.conference.message-main" />
     </dependencies>
  </module>
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="org.hibernate">
   <resources>
       <resource-root path="hibernate-core-4.0.0.Final.jar"/>
       <resource-root path="hibernate-commons-annotations-4.0.1.Final.jar"/>
       <resource-root path="hibernate-entitymanager-4.0.0.Final.jar"/>
   </resources>
   <dependencies>
       <module name="javax.api"/>
       <module name="javax.persistence.api"/>
       <module name="javax.transaction.api"/>
       <module name="org.apache.commons.collections"/>
       <!-- ... -->
   </dependencies>
</module>
Démonstration


http://github.com/hasalex/classpath-demo




                                           27 au 29 mars 2013
JBoss AS 7




             bin          Scripts de démarrage
             modules      Modules JBoss
             standalone     Profil standalone
             domain       Profil
                   domain Composants
             bundles
                      OSGi
JBoss AS 7


  message.war



                bin          Scripts de démarrage
                modules      Modules JBoss
                standalone     Profil standalone
                domain       Profil
                      domain Composants
                bundles
                         OSGi
Tomcat

Classloading
                                System
                              ClassLoader

                                Common
         $CATALINA_HOME/li
                              Class Loader
         b


           WEB-INF/classes,     Webapp
                WEB-INF/lib   ClassLoader
Tomcat

Module ?
                                  System
                                ClassLoader

                                  Common
         $CATALINA_HOME/li
                                Class Loader
         b


             WEB-INF/classes,     Webapp
                  WEB-INF/lib     Module
                                ClassLoader
                                ClassLoader
    module
      s
Tomcat

A suivre...


https://github.com/hasalex/tomcat-modules
Démonstration


http://github.com/hasalex/classpath-demo




                                           27 au 29 mars 2013
Cible

Applications complexes


Beaucoup de réutilisation
Développement / déploiement



          Artefacts ≠ Modules
   Notions différentes
   Outillage difficile
En attendant Jigsaw ?
Merci
Questions
    /
Réponses

            27 au 29 mars 2013

DevoxxFR 2013 - Le classpath n'est pas mort, mais presque