Alexis Hassler
Le classpath
n'est pas mort...
MarsJUG
septembre 2013
mais presque
"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;
CLASSPATH
-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) : Enumerati...
Classloader
MyStuff.class.getClassLoader()
sun.misc.Launcher$AppClassLoader
CLASSPATH
Bootstrap Classloader
classloader.getClass().getClassLoader()
null
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=~/.java7/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:...
Endorsed
java -Djava.endorsed.dirs=~/.java7/endorsed ...
Endorsed
BootstrapClassLoader
Endorsed
APIs standards hors JCP
org.omg (CORBA), org.w3c.dom,
org.xml.sax (XML)
APIs standalone
JAXP, JAXB, Scripting, Co...
27 au 29 mars 2013
Démonstration
http://github.com/hasalex/classpath-demo
classloader-demo
Démonstration
BootstrapClassLoaderSystem ClassLoader
java -cp cl-demo.jar fr.sewatech.classpath.Count
classloader-demo
Démonstration
BootstrapClassLoader
java -Xbootclasspath/p:lib/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...
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() ;
≠
27 au 29 mars 2013
Démonstration
http://github.com/hasalex/classpath-demo
classloader-demo
message-main
message-common
Démonstration
message-printer
classloader-demo
message-main
message-common
Démonstration
message-printer
java -cp cl-demo.jar:msg-main.jar fr.sewatech.c...
Démonstration
java -cp cl-demo.jar:msg-main.jar fr.sewatech.classpath.HelloViaMvnRepo
classloader-demo
message-main
messag...
Démonstration
classloader-demo
message-common
message-printer
message-main
message-main
System ClassLoader ParentFirst Cla...
Démonstration
System ClassLoader LocalFirst ClassLoader
classloader-demo
message-common
message-printer
message-main
messa...
Mort
Jar
HELL
http://www.ironmaidenwallpaper.com/
Dépendances
Maven, Gradle,...
Dépendances
Classpath
Runtime
A plat
Fichiers jar
juste du stockage
pas ou peu de métadonnée
Classpath
Runtime
Hiérarchique
applications server
27 au 29 mars 2013
Démonstration
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
Remplaçant
Application
Granularité
Classpath
Application Monolithique
Granularité
Application Web / JavaEE
Librairies partagéesApplication
Granularité
Application Web / JavaEE
Application
Modularité
Application Web / JavaEE
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.
Export-Package = fr.se...
OSGi
OS + Hardware
Java Execution Environment
Applications
(bundles)
Module
Life Cycle
Services
OSGi
Apporte de la valeur
= applications hautement dynamiques
Apporte de la complexité
= outils pour gérer la complexité
Jigsaw
Projet OpenJDK
Intégré au JDK 7
9 (2016)
8 (2012)
(2008)
. . .
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é...
Jigsaw
module-info.java
module message-main @ 1.0 {
exports fr.sewatech.message;
requires fr.sewatech.message-common @ 1.1...
JBoss Modules
Sous-projet de JBoss AS 7
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.classloader-d...
?xml version=1.0 encoding=UTF-8?
module xmlns=urn:jboss:module:1.1 name=org.hibernate
resources
resource-root path=hiberna...
27 au 29 mars 2013
Démonstration
http://github.com/hasalex/classpath-demo
JBoss AS 7
bin Scripts de démarrage
bundles Composants OSGi
modules Modules JBoss
standalone Profil standalone
domain Prof...
bin Scripts de démarrage
bundles Composants OSGi
modules Modules JBoss
standalone Profil standalone
domain Profil domain
J...
Tomcat
WEB-INF/classes,
WEB-INF/lib
System
ClassLoader
Common
Class Loader
Webapp
ClassLoader
$CATALINA_HOME/lib
Classload...
Tomcat
WEB-INF/classes,
WEB-INF/lib
System
ClassLoader
Common
Class Loader
Webapp
ClassLoader
$CATALINA_HOME/lib
Module ?
...
Tomcat
A suivre...
https://github.com/hasalex/tomcat-modules
27 au 29 mars 2013
Démonstration
http://github.com/hasalex/classpath-demo
Cible
Applications complexes
Beaucoup de réutilisation
Développement / déploiement
Artefacts ≠ Modules
Notions différentes
Outillage difficile
En attendant Jigsaw ?
Merci
MarsJUG - Le classpath n'est pas mort, mais presque
MarsJUG - Le classpath n'est pas mort, mais presque
Upcoming SlideShare
Loading in …5
×

MarsJUG - Le classpath n'est pas mort, mais presque

656 views

Published on

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épendances devaient se résoudre d'eux-même. Quatre ans plus tard, le classpath vit toujours et pour quelques années encore.

Dans la première partie de cette session, nous reviendrons 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, nous parlerons de modularité et de son impact sur la gestion des dépendances, à l'exécution des applications. Des solutions existent déjà, comme OSGi et Jigsaw, d'autres émergent, comme JBoss Modules. Nous vous montrerons comment ce dernier fonctionne, dans JBoss AS 7, en autonome, ou même dans Tomcat.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
656
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
8
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

MarsJUG - Le classpath n'est pas mort, mais presque

  1. 1. Alexis Hassler Le classpath n'est pas mort... MarsJUG septembre 2013 mais presque
  2. 2. "Classpath is dead! Mark Reinhold JavaOne 2009
  3. 3. Classpath
  4. 4. Classloader
  5. 5. Mort ?
  6. 6. Successeur
  7. 7. Alexis Hassler Développeur, formateur Java Indépendant Co-leader du
  8. 8. Classpath
  9. 9. Chercher les classes String hello = Bonjour Devoxx; MyStuff var; CLASSPATH
  10. 10. -classpath java -cp hello-lib.jar HelloWorld
  11. 11. Manifest Manifest-Version: 1.0 Class-Path: hello-lib.jar Main-Class: HelloWorld
  12. 12. Connaitre le classpath System.getProperty(java.class.path);
  13. 13. Erreurs java.lang.NoClassDefFoundError java.lang.ClassNotFoundException
  14. 14. Classpath Géré par des classloaders
  15. 15. Classloader
  16. 16. java.lang.ClassLoader loadClass(String name) : Class? getResource(String name) : URL getResources(String name) : EnumerationURL getResourceAsStream(String name) : InputStream getParent() : ClassLoader
  17. 17. Classloader MyStuff.class.getClassLoader() sun.misc.Launcher$AppClassLoader CLASSPATH
  18. 18. Bootstrap Classloader classloader.getClass().getClassLoader() null
  19. 19. Bootstrap Classloader BootstrapClassLoader
  20. 20. ExtensionClasspath sun.misc.Launcher$ExtClassLoader sun.misc.Launcher$AppClassLoader Délégation BootstrapClassLoader Parent first Parent first System ClassLoader Extension ClassLoader
  21. 21. Délégation java -cp hello-lib.jar ... System.getProperty(java.class.path); ClasspathSystem ClassLoader
  22. 22. Délégation java -Djava.ext.dirs=~/.java7/ext ... System.getProperty(java.ext.dirs); Extension Extension ClassLoader
  23. 23. Délégation Ext != Endorsed
  24. 24. Délégation java -Xbootclasspath:hello-rt.jar ... BootstrapClassLoader System.getProperty(sun.boot.class.path);
  25. 25. bootclasspath ● java -Xbootclasspath:hello-rt.jar ... ● java -Xbootclasspath/a:hello-lib.jar ... ● java -Xbootclasspath/p:hello-lib.jar ...
  26. 26. Endorsed java -Djava.endorsed.dirs=~/.java7/endorsed ... Endorsed BootstrapClassLoader
  27. 27. Endorsed APIs standards hors JCP org.omg (CORBA), org.w3c.dom, org.xml.sax (XML) APIs standalone JAXP, JAXB, Scripting, Compiler API,...
  28. 28. 27 au 29 mars 2013 Démonstration http://github.com/hasalex/classpath-demo
  29. 29. classloader-demo Démonstration BootstrapClassLoaderSystem ClassLoader java -cp cl-demo.jar fr.sewatech.classpath.Count
  30. 30. classloader-demo Démonstration BootstrapClassLoader java -Xbootclasspath/p:lib/cl-demo.jar fr.sewatech.classpath.Count
  31. 31. URLClassloader java.net.URLClassLoader sun.misc.Launcher$AppClassLoader sun.misc.Launcher$ExtClassLoader URLURLURL
  32. 32. URLClassloader System ClassLoader Bootstrap ClassLoader URL ClassLoader URL ClassLoader URL ClassLoader Parent first Parent first Parent first
  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. 27 au 29 mars 2013 Démonstration http://github.com/hasalex/classpath-demo
  40. 40. classloader-demo message-main message-common Démonstration message-printer
  41. 41. classloader-demo message-main message-common Démonstration message-printer java -cp cl-demo.jar:msg-main.jar fr.sewatech.classpath.HelloViaMvnRepo
  42. 42. Démonstration java -cp cl-demo.jar:msg-main.jar fr.sewatech.classpath.HelloViaMvnRepo classloader-demo message-main message-common message-printer message-main Classpath MavenRepository ClassLoader
  43. 43. Démonstration classloader-demo message-common message-printer message-main message-main System ClassLoader ParentFirst ClassLoader
  44. 44. Démonstration System ClassLoader LocalFirst ClassLoader classloader-demo message-common message-printer message-main message-main
  45. 45. Mort
  46. 46. Jar HELL http://www.ironmaidenwallpaper.com/
  47. 47. Dépendances Maven, Gradle,...
  48. 48. Dépendances Classpath
  49. 49. Runtime A plat Fichiers jar juste du stockage pas ou peu de métadonnée Classpath
  50. 50. Runtime Hiérarchique applications server
  51. 51. 27 au 29 mars 2013 Démonstration http://github.com/hasalex/classpath-demo
  52. 52. message-main message-common Démonstration message-printer classloader-demo slf4j-api 1.5.11 slf4j-api 1.7.2
  53. 53. Remplaçant
  54. 54. Application Granularité Classpath
  55. 55. Application Monolithique Granularité Application Web / JavaEE
  56. 56. Librairies partagéesApplication Granularité Application Web / JavaEE
  57. 57. Application Modularité Application Web / JavaEE
  58. 58. Modularité Visibilité Import Export Dépendances transitives
  59. 59. 1999 Java embarqué Java SE Java serveur
  60. 60. OSGi Bundle Fichier jar META-INF/MANIFEST.MF Import / export de packages
  61. 61. 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
  62. 62. OSGi OS + Hardware Java Execution Environment Applications (bundles) Module Life Cycle Services
  63. 63. OSGi Apporte de la valeur = applications hautement dynamiques Apporte de la complexité = outils pour gérer la complexité
  64. 64. Jigsaw Projet OpenJDK Intégré au JDK 7 9 (2016) 8 (2012) (2008) . . .
  65. 65. Jigsaw Modularité des applications Modularité du JDK
  66. 66. 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
  67. 67. 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; }
  68. 68. JBoss Modules Sous-projet de JBoss AS 7 Inspiré de Jigsaw Base de JBoss OSGi
  69. 69. JBoss Modules java -jar jboss-modules.jar -mp path/to/modules my.main.module.name Java SE
  70. 70. 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
  71. 71. 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
  72. 72. ?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
  73. 73. 27 au 29 mars 2013 Démonstration http://github.com/hasalex/classpath-demo
  74. 74. JBoss AS 7 bin Scripts de démarrage bundles Composants OSGi modules Modules JBoss standalone Profil standalone domain Profil domain
  75. 75. bin Scripts de démarrage bundles Composants OSGi modules Modules JBoss standalone Profil standalone domain Profil domain JBoss AS 7 message.war
  76. 76. Tomcat WEB-INF/classes, WEB-INF/lib System ClassLoader Common Class Loader Webapp ClassLoader $CATALINA_HOME/lib Classloading
  77. 77. Tomcat WEB-INF/classes, WEB-INF/lib System ClassLoader Common Class Loader Webapp ClassLoader $CATALINA_HOME/lib Module ? Module ClassLoader modules
  78. 78. Tomcat A suivre... https://github.com/hasalex/tomcat-modules
  79. 79. 27 au 29 mars 2013 Démonstration http://github.com/hasalex/classpath-demo
  80. 80. Cible Applications complexes Beaucoup de réutilisation
  81. 81. Développement / déploiement Artefacts ≠ Modules Notions différentes Outillage difficile
  82. 82. En attendant Jigsaw ?
  83. 83. Merci

×