Alexis Hassler
Le classpath
n'est pas mort...
ElsassJUG
Janvier 2015
mais presque
"Classpath is dead!"
Mark Reinhold
JavaOne 2009
Classpath
Classloader
Mort 
?
Succession
Alexis Hassler
Développeur, formateur Java
Indépendant
Co-leader du
Classpath
String hello = "Bonjour Devoxx";
MyStuff var;
Chercher les classes
CLASSPATH
-classpath
java -cp hello-lib.jar HelloWorld
Manifest
Manifest-Version: 1.0
Class-Path: hello-lib.jar
Main-Class: HelloWorld
Connaître le classpath
System.getProperty("java.class.path");
Erreurs
java.lang.NoClassDefFoundError
java.lang.ClassNotFoundException
http://github.com/hasalex/classpath-demo
Classpath
Géré par des classloaders
Classloader
java.lang.ClassLoader
loadClass(String name) : Class<?>
getResource(String name) : URL
getResources(String name) : Enumera...
Classloader
sun.misc.Launcher$AppClassLoader
CLASSPATH
MyStuff.class.getClassLoader()
Bootstrap Classloader
null
classloader.getClass().getClassLoader()
Bootstrap Classloader
BootstrapClassLoader
ExtensionClasspath
sun.misc.Launcher$ExtClassLoader
sun.misc.Launcher$AppClassLoader
Délégation
BootstrapClassLoader
Paren...
Délégation
java -cp hello-lib.jar ...
System.getProperty("java.class.path");
ClasspathSystem ClassLoader
Délégation
java -Djava.ext.dirs=~/.java8/ext ...
System.getProperty("java.ext.dirs");
Extension
Extension ClassLoader
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-...
Endorsed
java -Djava.endorsed.dirs=~/.java8/endorsed ...
Endorsed
BootstrapClassLoader
Endorsed
APIs standards hors JCP
org.omg (CORBA), org.w3c.dom,
org.xml.sax (XML)
APIs standalone
JAXP, JAXB, Scripting, Co...
http://github.com/hasalex/classpath-demo
classloader-demo
Démonstration
BootstrapClassLoader
java -cp cl-demo.jar fr.sewatech.classpath.Count
System ClassLoader
classloader-demo
Démonstration
BootstrapClassLoader
java -Xbootclasspath/p:cl-demo.jar fr.sewatech.classpath.Count
URLClassloader
java.net.URLClassLoader
sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$ExtClassLoader
URLURLURL
URLClassloader
System ClassLoader
Bootstrap ClassLoader
URL ClassLoader
URL ClassLoader
URL ClassLoader
Parent
first
Paren...
http://github.com/hasalex/classpath-demo
Démonstration
java -cp cl-demo.jar:msg-main.jar fr.sewatech.classpath.Hello
classloader-demo
message-main
message-common
m...
classloader-demo
message-main
message-common
message-printer
message-main
Démonstration
java -cp cl-demo.jar:msg-main.jar ...
Démonstration
classloader-demo
message-common
message-printer
message-main
message-main
System ClassLoader ParentFirst Cla...
FLTM Classloader
Fait Le Toi-Même
Usages
Application Servers
JRebel
Javassist, CGLib,...
Tomcat
System
Bootstrap
Common
Webapp1
Webapp2
Webapp3
Local First
JBoss AS 5
System
Bootstrap
Common
Web App
Ent App
Web Module
EJB Module
Local First
Repo First
Erreurs
ClassCastException
MyStuff cannot be cast to MyStuff
W
TF
?
Erreurs
URL ClassLoader
URL ClassLoader
MyStuff var = MyStuffFactory.build();
return new MyStuff() ;
≠
http://github.com/hasalex/classpath-demo
Démonstration
classloader-demo
message-common
message-printer
message-main
message-main
System ClassLoader ParentFirst Cla...
Démonstration
classloader-demo
message-common
message-printer
message-main
message-main
System ClassLoader LocalFirst Clas...
Mort ?
http://www.ironmaidenwallpaper.com/
Dépendances
Maven,
Gradle,
...
Dépendances
Classpath
Runtime
ClasspathA plat
Fichiers jar
juste du stockage
pas ou peu de métadonnée
Runtime
Hiérarchique
applications server
http://github.com/hasalex/classpath-demo
message-main
message-common
Démonstration
message-printer
classloader-demo
slf4j-api
1.5.11
slf4j-api
1.7.2
Succession
Granularité
Classpath
Application
Granularité
Application Web / JavaEE
Application Monolithique
Granularité
Application Web / JavaEE
Librairies partagéesApplication
Modularité
Application Web / JavaEE
Application
Modularité
Visibilité
Import
Export
Dépendances
transitives
1999
Java embarqué
Java SE
Java serveur
OSGi
Bundle
Fichier jar
META-INF/MANIFEST.MF
Import / export de packages
Bundle-Name = Simple Bundle
Bundle-SymbolicName = simple-bundle
Bundle-Description = Simple Bundle.
Bundle-Version = 1.0.1...
OSGi
OS + Hardware
Java Execution Environment
Applications
(bundles)
Module
Life Cycle
Services
JBoss Modules
Sous-projet de Wildfy
Inspiré de Jigsaw
Base de JBoss OSGi
JBoss Modules
java -jar jboss-modules.jar -mp path/to/modules
my.main.module.name
Java SE
JBoss Modules
hibernate-infinispan-4.1.6.Final.jar
module.xml
hibernate-core-4.1.6.Final.jar
hibernate-entitymanager-4.1.6...
JBoss Modules
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1"
name="fr.sewatech.conference.cla...
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="org.hibernate">
<resources>
<resource-ro...
http://github.com/hasalex/classpath-demo
WildFly
bin Scripts de démarrage
bundles Composants OSGi
modules Modules JBoss
standalone Profil standalone
domain Profil ...
bin Scripts de démarrage
bundles Composants OSGi
modules Modules JBoss
standalone Profil standalone
domain Profil domain
W...
WildFly
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<dependencies>
<module name="fr.s...
http://github.com/hasalex/classpath-demo
Tomcat
Classloading
WEB-INF/classes,
WEB-INF/lib
Webapp
ClassLoader
$CATALINA_HOME/lib
System
ClassLoader
Common
Class Loa...
Tomcat
Module ?
WEB-INF/classes,
WEB-INF/lib
System
ClassLoader
Common
Class Loader
Webapp
ClassLoader
$CATALINA_HOME/lib
...
Tomcat
https://github.com/hasalex/tomcat-modules
http://github.com/hasalex/classpath-demo
Cible
Applications complexes
Beaucoup de réutilisation
Développement / déploiement
Artefacts ≠ Modules
Notions différentes
Outillage diffcile
Jigsaw
Projet OpenJDK
Intégré au JDK 7
9 (2016)
8 (2012)
(2008)
. . .
Jigsaw
Modularité du JDK
Corba pour Hello World ?
Swing pour Tomcat ?
Jigsaw
Modularité des applications
module-info.java
module message-main @ 1.0 {
exports fr.sewatech.message;
requires fr.s...
Jigsaw
JEP 200: The Modular JDK
JEP 201: Modular Source Code
JEP 220: The Modular Run-Time Images
JEP xxx: The JDK Module ...
Jigsaw
rt.jar tools.jar
Jigsaw
Extension
sun.misc.Launcher$ExtClassLoader
sun.misc.Launcher$AppClassLoader
BootstrapClassLoader
Parent
first
Paren...
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 c...
?
@AlexisHassler
http://alexis-hassler.com
alexis.hassler@sewatech.fr
http://sewatech.fr
ElsassJUG - Le classpath n'est pas mort...
Prochain SlideShare
Chargement dans…5
×

ElsassJUG - Le classpath n'est pas mort...

661 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
661
Sur SlideShare
0
Issues des intégrations
0
Intégrations
9
Actions
Partages
0
Téléchargements
7
Commentaires
0
J’aime
0
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

ElsassJUG - Le classpath n'est pas mort...

  1. 1. Alexis Hassler Le classpath n'est pas mort... ElsassJUG 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. http://github.com/hasalex/classpath-demo
  12. 12. Classpath Géré par des classloaders
  13. 13. Classloader
  14. 14. java.lang.ClassLoader loadClass(String name) : Class<?> getResource(String name) : URL getResources(String name) : Enumeration<URL> getResourceAsStream(String name) : InputStream getParent() : ClassLoader
  15. 15. Classloader sun.misc.Launcher$AppClassLoader CLASSPATH MyStuff.class.getClassLoader()
  16. 16. Bootstrap Classloader null classloader.getClass().getClassLoader()
  17. 17. Bootstrap Classloader BootstrapClassLoader
  18. 18. ExtensionClasspath sun.misc.Launcher$ExtClassLoader sun.misc.Launcher$AppClassLoader Délégation BootstrapClassLoader Parent first Parent first System ClassLoader Extension ClassLoader
  19. 19. Délégation java -cp hello-lib.jar ... System.getProperty("java.class.path"); ClasspathSystem ClassLoader
  20. 20. Délégation java -Djava.ext.dirs=~/.java8/ext ... System.getProperty("java.ext.dirs"); Extension Extension ClassLoader
  21. 21. Délégation Ext != Endorsed
  22. 22. Délégation java -Xbootclasspath:hello-rt.jar ... BootstrapClassLoader System.getProperty("sun.boot.class.path");
  23. 23. bootclasspath java -Xbootclasspath:hello-rt.jar ... java -Xbootclasspath/a:hello-lib.jar ... java -Xbootclasspath/p:hello-lib.jar ...
  24. 24. Endorsed java -Djava.endorsed.dirs=~/.java8/endorsed ... Endorsed BootstrapClassLoader
  25. 25. Endorsed APIs standards hors JCP org.omg (CORBA), org.w3c.dom, org.xml.sax (XML) APIs standalone JAXP, JAXB, Scripting, Compiler API,...
  26. 26. http://github.com/hasalex/classpath-demo
  27. 27. classloader-demo Démonstration BootstrapClassLoader java -cp cl-demo.jar fr.sewatech.classpath.Count System ClassLoader
  28. 28. classloader-demo Démonstration BootstrapClassLoader java -Xbootclasspath/p:cl-demo.jar fr.sewatech.classpath.Count
  29. 29. URLClassloader java.net.URLClassLoader sun.misc.Launcher$AppClassLoader sun.misc.Launcher$ExtClassLoader URLURLURL
  30. 30. URLClassloader System ClassLoader Bootstrap ClassLoader URL ClassLoader URL ClassLoader URL ClassLoader Parent first Parent first Parent first
  31. 31. http://github.com/hasalex/classpath-demo
  32. 32. Démonstration java -cp cl-demo.jar:msg-main.jar fr.sewatech.classpath.Hello classloader-demo message-main message-common message-printer message-main
  33. 33. 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
  34. 34. Démonstration classloader-demo message-common message-printer message-main message-main System ClassLoader ParentFirst ClassLoader
  35. 35. FLTM Classloader Fait Le Toi-Même
  36. 36. Usages Application Servers JRebel Javassist, CGLib,...
  37. 37. Tomcat System Bootstrap Common Webapp1 Webapp2 Webapp3 Local First
  38. 38. JBoss AS 5 System Bootstrap Common Web App Ent App Web Module EJB Module Local First Repo First
  39. 39. Erreurs ClassCastException MyStuff cannot be cast to MyStuff W TF ?
  40. 40. Erreurs URL ClassLoader URL ClassLoader MyStuff var = MyStuffFactory.build(); return new MyStuff() ; ≠
  41. 41. http://github.com/hasalex/classpath-demo
  42. 42. Démonstration classloader-demo message-common message-printer message-main message-main System ClassLoader ParentFirst ClassLoader
  43. 43. Démonstration classloader-demo message-common message-printer message-main message-main System ClassLoader LocalFirst ClassLoader
  44. 44. Mort ?
  45. 45. http://www.ironmaidenwallpaper.com/
  46. 46. Dépendances Maven, Gradle, ...
  47. 47. Dépendances Classpath
  48. 48. Runtime ClasspathA plat Fichiers jar juste du stockage pas ou peu de métadonnée
  49. 49. Runtime Hiérarchique applications server
  50. 50. http://github.com/hasalex/classpath-demo
  51. 51. message-main message-common Démonstration message-printer classloader-demo slf4j-api 1.5.11 slf4j-api 1.7.2
  52. 52. Succession
  53. 53. Granularité Classpath Application
  54. 54. Granularité Application Web / JavaEE Application Monolithique
  55. 55. Granularité Application Web / JavaEE Librairies partagéesApplication
  56. 56. Modularité Application Web / JavaEE Application
  57. 57. Modularité Visibilité Import Export Dépendances transitives
  58. 58. 1999 Java embarqué Java SE Java serveur
  59. 59. OSGi Bundle Fichier jar META-INF/MANIFEST.MF Import / export de packages
  60. 60. Bundle-Name = Simple Bundle Bundle-SymbolicName = simple-bundle Bundle-Description = Simple Bundle. Bundle-Version = 1.0.1 Export-Package = fr.sewatech.mystuff.services Import-Package = org.osgi.framework;version=1.3 OSGi
  61. 61. OSGi OS + Hardware Java Execution Environment Applications (bundles) Module Life Cycle Services
  62. 62. JBoss Modules Sous-projet de Wildfy Inspiré de Jigsaw Base de JBoss OSGi
  63. 63. JBoss Modules java -jar jboss-modules.jar -mp path/to/modules my.main.module.name Java SE
  64. 64. 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
  65. 65. 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>
  66. 66. <?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>
  67. 67. http://github.com/hasalex/classpath-demo
  68. 68. WildFly bin Scripts de démarrage bundles Composants OSGi modules Modules JBoss standalone Profil standalone domain Profil domain
  69. 69. bin Scripts de démarrage bundles Composants OSGi modules Modules JBoss standalone Profil standalone domain Profil domain WildFly message.war
  70. 70. 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
  71. 71. http://github.com/hasalex/classpath-demo
  72. 72. Tomcat Classloading WEB-INF/classes, WEB-INF/lib Webapp ClassLoader $CATALINA_HOME/lib System ClassLoader Common Class Loader
  73. 73. Tomcat Module ? WEB-INF/classes, WEB-INF/lib System ClassLoader Common Class Loader Webapp ClassLoader $CATALINA_HOME/lib Module ClassLoader modules
  74. 74. Tomcat https://github.com/hasalex/tomcat-modules
  75. 75. http://github.com/hasalex/classpath-demo
  76. 76. Cible Applications complexes Beaucoup de réutilisation
  77. 77. Développement / déploiement Artefacts ≠ Modules Notions différentes Outillage diffcile
  78. 78. Jigsaw Projet OpenJDK Intégré au JDK 7 9 (2016) 8 (2012) (2008) . . .
  79. 79. Jigsaw Modularité du JDK Corba pour Hello World ? Swing pour Tomcat ?
  80. 80. Jigsaw Modularité des applications module-info.java module message-main @ 1.0 { exports fr.sewatech.message; requires fr.sewatech.message-common @ 1.1; class fr.sewatech.message.Main; }
  81. 81. 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
  82. 82. Jigsaw rt.jar tools.jar
  83. 83. Jigsaw Extension sun.misc.Launcher$ExtClassLoader sun.misc.Launcher$AppClassLoader BootstrapClassLoader Parent first Parent first System ClassLoader Extension ClassLoader
  84. 84. 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
  85. 85. ?
  86. 86. @AlexisHassler http://alexis-hassler.com alexis.hassler@sewatech.fr http://sewatech.fr

×