LyonJUG : Comment Jigsaw est prêt à tuer le classpath

522 vues

Publié le

Présentation au LyonJUG le 17 octobre 2015.

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. C'est le projet Jigsaw qui devait accomplir cette tâche. Il sera finalement intégré au JDK 9 dont la sortie est prévue pour 2017.

Dans la première partie de cette présentation, on revient sur le fonctionnement des classloaders du JDK et on voit au travers quelques exemples les problèmes étranges qu'ils posent.

Dans la deuxième partie, on présente ce que Jigsaw va apporter et expliquera quels problèmes il va résoudre. On compare Jigsaw aux solutions qui existent déjà, comme OSGi et JBoss Modules.

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

Aucun téléchargement
Vues
Nombre de vues
522
Sur SlideShare
0
Issues des intégrations
0
Intégrations
59
Actions
Partages
0
Téléchargements
8
Commentaires
0
J’aime
3
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

LyonJUG : Comment Jigsaw est prêt à tuer le classpath

  1. 1. Alexis Hassler Jigsaw est prêt à tuer le classpath octobre 2016
  2. 2. "Classpath is dead!" Mark Reinhold JavaOne 2009
  3. 3. Classpath Classloader Mort  ? Succession
  4. 4. Alexis Hassler Développeur Formateur Indépendant Fondateur Préparateur de
  5. 5. Classpath
  6. 6. String hello = "Salut à vous tous les zazous"; 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. https://github.com/hasalex/classpath-demo
  12. 12. Classloader
  13. 13. Classpath Géré par des classloaders
  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 java -Xbootclasspath:hello-rt.jar ... BootstrapClassLoader System.getProperty("sun.boot.class.path");
  22. 22. bootclasspath java -Xbootclasspath:hello-rt.jar ... java -Xbootclasspath/a:hello-lib.jar ... java -Xbootclasspath/p:hello-lib.jar ...
  23. 23. Endorsed != Extension
  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. https://github.com/hasalex/classpath-demo
  27. 27. example.jar Démonstration BootstrapClassLoader java -cp example.jar fr.sewatech.classpath.Count System ClassLoader java.lang.Integer
  28. 28. example.jar Démonstration BootstrapClassLoader java -Xbootclasspath/p:example.jar fr.sewatech.classpath.Count java.lang.Integer
  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. message-launcher message-main message-common message-printer message-service
  32. 32. Démonstration java -cp service.jar:launcher.jar fr.sewatech.classpath.Hello message-launcher message-main message-common message-printer message-service
  33. 33. message-launcher message-common message-printer message-service Démonstration java -cp service.jar:launcher.jar fr.sewatech.classpath.HelloViaUrl message-serviceClasspath URLClassloader
  34. 34. Démonstration message-launcher message-common message-printer message-service message-service 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 org.project.SomeStuff cannot be cast to org.project.SomeStuff
  40. 40. Erreurs URL ClassLoader URL ClassLoader MyStuff var = MyStuffFactory.build(); return new MyStuff() ; ≠
  41. 41. https://github.com/hasalex/classpath-demo
  42. 42. Démonstration message-launcher message-common message-printer message-service message-service System ClassLoader LocalFirst ClassLoader
  43. 43. Mort ?
  44. 44. http://www.ironmaidenwallpaper.com/
  45. 45. Dépendances Maven, Gradle, ...
  46. 46. Dépendances Classpath
  47. 47. Runtime ClasspathA plat Fichiers jar juste du stockage pas ou peu de métadonnée
  48. 48. https://github.com/hasalex/classpath-demo
  49. 49. Démonstration slf4j-api 1.5.11 slf4j-api 1.7.2 message-launcher message-main message-common message-printer message-service
  50. 50. Granularité Sécurité Apache commons-collections https://foxglovesecurity.com/
  51. 51. Succession
  52. 52. Modularité Dépendance Exposition Lecture
  53. 53. 1999 Java embarqué Java SE Java serveur
  54. 54. OSGi Bundle Fichier jar META-INF/MANIFEST.MF Import / export de packages
  55. 55. 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
  56. 56. OSGi OS + Hardware Java Execution Environment Applications (bundles) Module Life Cycle Services
  57. 57. JBoss Modules Sous-projet de Wildfy Inspiré de Jigsaw (version 2010) Base de JBoss OSGi
  58. 58. JBoss Modules java -jar jboss-modules.jar -mp path/to/modules my.main.module.name Java SE
  59. 59. 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
  60. 60. JBoss Modules <?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> ... </module>
  61. 61. <?xml version="1.0" encoding="UTF-8"?> <module xmlns="urn:jboss:module:1.1" name="org.hibernate"> ... <dependencies> <module name="javax.api"/> <module name="javax.persistence.api"/> <module name="javax.transaction.api"/> <module name="org.apache.commons.collections"/> <!-- ... --> </dependencies> </module> JBoss Modules
  62. 62. JBoss Modules <?xml version="1.0" encoding="UTF-8"?> <module xmlns="urn:jboss:module:1.1" name="fr.sewatech.message-launcher"> <main-class name="fr.sewatech.classpath.Hello"/> ... </module>
  63. 63. https://github.com/hasalex/classpath-demo
  64. 64. JBoss Modules Artefacts ≠ Modules Notions différentes Build diffcile Mauvaise intégration aux outils
  65. 65. Jigsaw Projet OpenJDK Intégré au JDK 7 (2008) 9 (2016) 8 (2012) (2017)
  66. 66. Jigsaw Modularité du JDK Corba pour Hello World ? Swing pour Tomcat ?
  67. 67. Jigsaw Modularité des applications module-info.java module message.service { requires java.xml.bind; requires message.common; exports fr.sewatech.message; }
  68. 68. Jigsaw Compilation javac --module-path modules -d target/classes/ $(find src/main/java/ -name "*.java")
  69. 69. Jigsaw Exécution java --module-path jigsaw-modules -m misc.examples/fr.sewatech.example.Main
  70. 70. https://github.com/hasalex/classpath-demo
  71. 71. Jigsaw ++
  72. 72. Demo Source code http://github.com/hasalex/classpath-demo JDK 9 9-ea+138-jigsaw-nightly-h5561-20161003
  73. 73. Demo Maven maven-compiler-plugin:3.6-jigsaw-SNAPSHOT org.ow2.asm:asm:6.0_ALPHA plexus-compiler-api:2.8.2-SNAPSHOT plexus-compiler-manager:2.8.2-SNAPSHOT plexus-compiler-javac:2.8.2-SNAPSHOT
  74. 74. Demo IDE Jetbrains IDEA Eclipse Netbeans
  75. 75. Specifcations JSR 376: Java Platform Module System JSR 379: Java SE 9
  76. 76. Specifcations JEPs JEP 261: Module System JEP 200: The Modular JDK JEP 260: Encapsulate Most Internal APIs JEP 201: Modular Source Code JEP 220: Modular Run-Time Images JEP 282: jlink: The Java Linker
  77. 77. Modular JDK rt.jar tools.jar
  78. 78. Modular JDK
  79. 79. Modular JDK Standard APIs java.*, javax.* Supported APIs com.sun.*, jdk.* Unsupported APIs sun.* sun.misc.Unsafe, sun.misc.BASE64Decoder, sun.misc.BASE64Encoder
  80. 80. https://github.com/hasalex/classpath-demo
  81. 81. Classpath mode Classpath is NOT dead java -classpath lib/* fr.sewatech.example.Main
  82. 82. https://github.com/hasalex/classpath-demo
  83. 83. Dependencies module message.service { requires message.printer; requires message.common; } message.service message.printer message.common
  84. 84. Dependencies module message.service { requires message.printer; } module message.printer { requires transitive message.common; } message.service message.printer message.common
  85. 85. Dependencies Automatic modules module message.service { requires slf4j.api; } message.service slf4j.api slf4j-api-1.5.2.
  86. 86. Dependencies Classpath message.service message.printer message.common unnamed
  87. 87. Dependencies Optional Required at compile time module message.service { requires static message.printer; }
  88. 88. Dependencies module message.service @ 1.0 { requires message.printer @ 1.0; requires slf4j.api @ 1.7; } Module version
  89. 89. https://github.com/hasalex/classpath-demo
  90. 90. Exports Java accessibility public protected package private private inside a module
  91. 91. Exports Java accessibility public for other modules module message.service { exports fr.sewatech.message; }
  92. 92. Exports Java accessibility public for some modules module java.base { exports sun.reflect to java.logging, java.sql, jdk.scripting.nashorn; }
  93. 93. Exports module message.service { exports private java.security; } Encapsulation vs Refection setAccessible(true) field.setAccessible(true); // => java.lang.reflect.InaccessibleObjectException
  94. 94. https://github.com/hasalex/classpath-demo
  95. 95. Classloader Java SE M odules PlatformClassLoader AppClassLoader BootClassLoader jdk.internal.loader.ClassLoaders$...
  96. 96. Classloader jdk.internal.loader.BuiltinClassLoader AppClassLoader PlatformClassLoader BootClassLoader
  97. 97. Classloader Fait Le Toi-Même java.net.URLClassLoader FLTMClassLoader
  98. 98. Classloader java -Djava.endorsed.dirs=~/.java8/endorsed ... BootClassLoader
  99. 99. Classloader java -Xbootclasspath:hello-rt.jar ... BootClassLoader System.getProperty("sun.boot.class.path");
  100. 100. Patch Compile javac -Xmodule:java.base -d ../patch-classes src/java/lang/Integer.java
  101. 101. Patch Run java --patch-module java.base=../patch-classes --module-path jigsaw-modules -m misc.examples
  102. 102. https://github.com/hasalex/classpath-demo
  103. 103. Layers No Version module message.service @ 1.0 { requires message.printer @ 1.0; requires slf4j.api @ 1.7; }
  104. 104. Layers Highlander rule #1 « There Can Be Only One »
  105. 105. slf4j.api Layers org.slf4j slf4j.other org.slf4j
  106. 106. Layers Boot Layer App Loader Platform Loader Boot Loader message.service slf4j.api java.basejava.xml.bind Java Module System Java Virtual Machine
  107. 107. Layers Boot Layer Java Module System Java Virtual Machine
  108. 108. Quand ?
  109. 109. Planning Java SE 9 Septembre 2017
  110. 110. Planning Outils ? Maven, Gradle, IDE Livrairies ? Runtimes ? Java EE, Tomcat,...
  111. 111. Essayer... https://jdk9.java.net/download/ Exécutable d'installation https://jdk9.java.net/jigsaw/ Archive Dernières évolutions de Jigsaw
  112. 112. Apprendre + JavaOne http://openjdk.java.net/projects/jigsaw/talks/ Quick-Start Guide http://openjdk.java.net/projects/jigsaw/quick-start The State of the Module System http://openjdk.java.net/projects/jigsaw/spec/sotms/
  113. 113. @AlexisHassler http://alexis-hassler.com http://sewatech.fr

×