LorraineJUG - Le classpath n'est pas mort

887 vues

Publié le

En 2009, la mort du classpath a été annoncée. Les classloaders à plat ou hiérarchiques devaient être remplacés par des systèmes modulaires et tous nos problèmes de dépendance devaient se résoudre d'eux-mêmes. Cinq ans plus tard, le classpath vit toujours et pour quelques temps encore.

Dans la première partie de cette session, je vous propose de revenir sur le fonctionnement des classloaders du JDK et les problèmes infernaux posés par le classpath. Nous verrons aussi comment les serveurs d'applications, comme Tomcat, gèrent leur classloaders de façon hiérarchique, afin d'isoler les applications entre elles.

Dans la deuxième partie, je parlerai de modularité et de son impact sur la gestion des dépendances, à l'exécution des applications. Des solutions existent déjà, comme OSGi, d'autres émergent, comme JBoss Modules. Je vous montrerai comment ce dernier fonctionne, dans WildFly ou en autonome.

Publié dans : Logiciels
0 commentaire
0 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Aucun téléchargement
Vues
Nombre de vues
887
Sur SlideShare
0
Issues des intégrations
0
Intégrations
5
Actions
Partages
0
Téléchargements
6
Commentaires
0
J’aime
0
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive
  • The Number of the Beast Font : http://fontmeme.com/the-number-of-the-beast-font/
  • Eddie Font : http://www.1001fonts.com/eddie-font.html
  • LorraineJUG - Le classpath n'est pas mort

    1. 1. Alexis Hassler Le classpath n'est pas mort... Janvier 2015 mais presque
    2. 2. "Classpath is dead!" Mark Reinhold JavaOne 2009
    3. 3. Classpath Classloader Mort ? Succession
    4. 4. Alexis Hassler Développeur, formateur Java Indépendant Co-leader du
    5. 5. Classpath
    6. 6. String hello = "Bonjour Devoxx"; MyStuff var; Chercher les classes CLASSPATH
    7. 7. -classpath java -cp hello-lib.jar HelloWorld
    8. 8. Manifest Manifest-Version: 1.0 Class-Path: hello-lib.jar Main-Class: HelloWorld
    9. 9. Connaître le classpath System.getProperty("java.class.path");
    10. 10. Erreurs java.lang.NoClassDefFoundError java.lang.ClassNotFoundException
    11. 11. Classpath Géré par des classloaders
    12. 12. Classloader
    13. 13. java.lang.ClassLoader loadClass(String name) : Class<?> getResource(String name) : URL getResources(String name) : Enumeration<URL> getResourceAsStream(String name) : InputStream getParent() : ClassLoader
    14. 14. Classloader sun.misc.Launcher$AppClassLoader CLASSPATH MyStuff.class.getClassLoader()
    15. 15. Bootstrap Classloader null classloader.getClass().getClassLoader()
    16. 16. Bootstrap Classloader BootstrapClassLoader
    17. 17. ExtensionClasspath sun.misc.Launcher$ExtClassLoader sun.misc.Launcher$AppClassLoader Délégation BootstrapClassLoader Parent first Parent first System ClassLoader Extension ClassLoader
    18. 18. Délégation java -cp hello-lib.jar ... System.getProperty("java.class.path"); ClasspathSystem ClassLoader
    19. 19. Délégation java -Djava.ext.dirs=~/.java8/ext ... System.getProperty("java.ext.dirs"); Extension Extension ClassLoader
    20. 20. Délégation java -Xbootclasspath:hello-rt.jar ... BootstrapClassLoader System.getProperty("sun.boot.class.path");
    21. 21. bootclasspath java -Xbootclasspath:hello-rt.jar ... java -Xbootclasspath/a:hello-lib.jar ... java -Xbootclasspath/p:hello-lib.jar ...
    22. 22. Endorsed java -Djava.endorsed.dirs=~/.java8/endorsed ... Endorsed BootstrapClassLoader
    23. 23. Endorsed APIs standards hors JCP org.omg (CORBA), org.w3c.dom, org.xml.sax (XML) APIs standalone JAXP, JAXB, Scripting, Compiler API,...
    24. 24. http://github.com/hasalex/classpath-demo
    25. 25. classloader-demo Démonstration BootstrapClassLoader java -cp cl-demo.jar fr.sewatech.classpath.Count System ClassLoader
    26. 26. classloader-demo Démonstration BootstrapClassLoader java -Xbootclasspath/p:cl-demo.jar fr.sewatech.classpath.Count
    27. 27. URLClassloader java.net.URLClassLoader sun.misc.Launcher$AppClassLoader sun.misc.Launcher$ExtClassLoader URLURLURL
    28. 28. URLClassloader System ClassLoader Bootstrap ClassLoader URL ClassLoader URL ClassLoader URL ClassLoader Parent first Parent first Parent first
    29. 29. http://github.com/hasalex/classpath-demo
    30. 30. Démonstration java -cp cl-demo.jar:msg-main.jar fr.sewatech.classpath.Hello classloader-demo message-main message-common message-printer message-main
    31. 31. classloader-demo message-main message-common message-printer message-main Démonstration java -cp cl-demo.jar:msg-main.jar fr.sewatech.classpath.HelloViaUrl message-mainClasspath URLClassloader
    32. 32. Démonstration classloader-demo message-common message-printer message-main message-main System ClassLoader ParentFirst ClassLoader
    33. 33. FLTM Classloader Fait Le Toi-Même
    34. 34. Usages Application Servers JRebel Javassist, CGLib,...
    35. 35. Tomcat System Bootstrap Common Webapp1 Webapp2 Webapp3 Local First
    36. 36. JBoss AS 5 System Bootstrap Common Web App Ent App Web Module EJB Module Local First Repo First
    37. 37. Erreurs ClassCastException MyStuff cannot be cast to MyStuff W TF ?
    38. 38. Erreurs URL ClassLoader URL ClassLoader MyStuff var = MyStuffFactory.build(); return new MyStuff() ; ≠
    39. 39. http://github.com/hasalex/classpath-demo
    40. 40. Démonstration classloader-demo message-common message-printer message-main message-main System ClassLoader ParentFirst ClassLoader
    41. 41. Démonstration classloader-demo message-common message-printer message-main message-main System ClassLoader LocalFirst ClassLoader
    42. 42. Mort ?
    43. 43. http://www.ironmaidenwallpaper.com/
    44. 44. Dépendances Maven, Gradle, ...
    45. 45. Dépendances Classpath
    46. 46. http://github.com/hasalex/classpath-demo
    47. 47. message-main message-common Démonstration message-printer classloader-demo slf4j-api 1.5.11 slf4j-api 1.7.2
    48. 48. Succession
    49. 49. Granularité Classpath Application
    50. 50. Granularité Application Web / JavaEE Librairies partagéesApplication
    51. 51. Modularité Application Web / JavaEE Application
    52. 52. 1999 Java embarqué Java SE Java serveur
    53. 53. OSGi OS + Hardware Java Execution Environment Applications (bundles) Module Life Cycle Services
    54. 54. JBoss Modules Sous-projet de Wildfly Inspiré de Jigsaw Base de JBoss OSGi
    55. 55. JBoss Modules java -jar jboss-modules.jar -mp path/to/modules my.main.module.name Java SE
    56. 56. JBoss Modules hibernate-infinispan-4.1.6.Final.jar module.xml hibernate-core-4.1.6.Final.jar hibernate-entitymanager-4.1.6.Final.jar modules com fr org ... org hibernate main
    57. 57. <?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>
    58. 58. WildFly bin Scripts de démarrage bundles Composants OSGi modules Modules JBoss standalone Profil standalone domain Profil domain
    59. 59. bin Scripts de démarrage bundles Composants OSGi modules Modules JBoss standalone Profil standalone domain Profil domain WildFly message.war
    60. 60. WildFly <?xml version="1.0" encoding="UTF-8"?> <jboss-deployment-structure> <deployment> <dependencies> <module name="fr.sewatech.conference.message-main" /> </dependencies> </deployment> </jboss-deployment-structure> message.war
    61. 61. http://github.com/hasalex/classpath-demo
    62. 62. Tomcat Classloading WEB-INF/classes, WEB-INF/lib Webapp ClassLoader $CATALINA_HOME/lib System ClassLoader Common Class Loader
    63. 63. Tomcat Module ? WEB-INF/classes, WEB-INF/lib System ClassLoader Common Class Loader Webapp ClassLoader $CATALINA_HOME/lib Module ClassLoader modules
    64. 64. Tomcat https://github.com/hasalex/tomcat-modules
    65. 65. Jigsaw Projet OpenJDK Intégré au JDK 7 9 (2016) 8 (2012) (2008) . . .
    66. 66. Jigsaw JEP 200:The Modular JDK JEP 201: Modular Source Code JEP 220:The Modular Run-Time Images JEP xxx:The JDK Module System JSR 376: Java Platform Module System
    67. 67. J'imagine qu'il est tentant, si le seul outil que vous avez est un marteau, de traiter tout problème comme si c'était un clou. Abraham MaslowPaul Watzlawick
    68. 68. @AlexisHassler http://alexis-hassler.com alexis.hassler@sewatech.fr http://sewatech.fr

    ×