1DEVFEST NANTES 16
DEVFEST NANTES 16
Jigsaw
est prêt à tuer le
classpath
@AlexisHassler - #devfestnantes
"Classpath is dead!"
Mark Reinhold
JavaOne 2009
3DEVFEST NANTES 16
Classpath Classloader
Succession
Jigsaw
4DEVFEST NANTES 16
Alexis Hassler
Développeur
Formateur
Indépendant
Fondateur
Préparateur de
Classpath
https://www.fickr.com/photos/summonedbyfells/15007676965
6DEVFEST NANTES 16
String hello = "Salut à vous tous les zazous";
Chercher les classes
CLASSPATH
Hello var = new Hello();
7DEVFEST NANTES 16
-classpath
java -cp hello-lib.jar HelloWorld
8DEVFEST NANTES 16
Erreurs
java.lang.NoClassDefFoundError
java.lang.ClassNotFoundException
https://www.fickr.com/photos/ro...
Class Loader
https://www.fickr.com/photos/15574096@N00/12119344725/
10DEVFEST NANTES 16
java.lang.ClassLoader
loadClass(String name) : Class<?>
getResource(String name) : URL
getResourceAsSt...
11DEVFEST NANTES 16
Classloader
sun.misc.Launcher$AppClassLoader
CLASSPATH
Hello.class.getClassLoader()
12DEVFEST NANTES 16
Classloader
null
Hello.class.getClassLoader()
.getClass().getClassLoader()
13DEVFEST NANTES 16
Bootstrap Classloader
BootstrapClassLoader
14DEVFEST NANTES 16
Délégation
BootstrapClassLoader
Parent
frst
System ClassLoader
15DEVFEST NANTES 16
Délégation
System ClassLoader
java -cp hello-lib.jar ...
16DEVFEST NANTES 16
bootclasspath
java -Xbootclasspath/p:hello-lib.jar ...
java -Xbootclasspath:hello-rt.jar ...
java -Xbo...
https://github.com/hasalex/classpath-demo
18DEVFEST NANTES 16
Démonstration
BootstrapClassLoader
java -cp example.jar fr.sewatech.classpath.Count
System ClassLoader...
19DEVFEST NANTES 16
example.jar
Démonstration
java  -Xbootclasspath/p:example.jar  fr.sewatech.classpath.Count
BootstrapCl...
20DEVFEST NANTES 16
URLClassloader
java.net.URLClassLoader
sun.misc.Launcher$AppClassLoader
URLURLURL
21DEVFEST NANTES 16
URLClassloader
System ClassLoader
Bootstrap ClassLoader
URL ClassLoader
URL ClassLoader
URL ClassLoade...
22DEVFEST NANTES 16
DIY Classloader
23DEVFEST NANTES 16
Usages
Application Servers
JRebel
Javassist, CGLib,...
24DEVFEST NANTES 16
Tomcat
System
Bootstrap
Common
Webapp1
Webapp2
Webapp3
Local First
message-launcher
message-main
message-common
message-printer
message-service
26DEVFEST NANTES 16
Démonstration
message-launcher
message-common
message-printer
message-service
message-service
System C...
27DEVFEST NANTES 16
Démonstration
message-launcher
message-common
message-printer
message-service
message-service
System C...
https://www.fickr.com/photos/delete08/5971235700/
29DEVFEST NANTES 16 http://www.ironmaidenwallpaper.com/
30DEVFEST NANTES 16
Dépendances
Maven,
Gradle,
...
31DEVFEST NANTES 16
Dépendances
Classpath
https://github.com/hasalex/classpath-demo
33DEVFEST NANTES 16
Démonstration
slf4j-api
1.5.11
slf4j-api
1.7.2
message-launcher
message-main
message-common
message-pr...
34DEVFEST NANTES 16
Granularité
Sécurité
Apache commons-collections
https://foxglovesecurity.com/
Succession
36DEVFEST NANTES 16
Modularité
Dépendance
Exposition
Lecture
37DEVFEST NANTES 16
1999
Java embarqué
Java SE
Java serveur
38DEVFEST NANTES 16
Bundle-Name = Hello Service
Bundle-SymbolicName = hello-service
Bundle-Description = Hello Service Bun...
39DEVFEST NANTES 16
OSGi
OS + Hardware
Java Runtime
Module
Life Cycle Services
40DEVFEST NANTES 16
JBoss Modules
java -jar jboss-modules.jar -mp path/to/modules
my.main.module.name
Base de JBoss OSGi
J...
41DEVFEST NANTES 16
JBoss Modules
module.xml
resource dependency slot
dependency slot
dependency slot
name slot
resource
r...
42DEVFEST NANTES 16
Jigsaw
9 (2016)
8 (2012)
(2017)
Projet
Intégré au JDK 7 (2008)
43DEVFEST NANTES 16
Jigsaw
Modularité du JDK
44DEVFEST NANTES 16
Jigsaw
Modularité des applications
// module-info.java
module message.service {
requires java.xml.bind...
45DEVFEST NANTES 16
Jigsaw
Compilation
javac --module-path modules 
-d target/classes/ 
$(find src/main/java/ -name "*.jav...
46DEVFEST NANTES 16
Jigsaw
Exécution
java --module-path jigsaw-modules 
-m misc.examples/fr.sewatech.example.Main
https://github.com/hasalex/classpath-demo
Jigsaw ++
https://www.fickr.com/photos/intvgene/370973576
49DEVFEST NANTES 16
Classpath mode
java -classpath lib/* fr.sewatech.example.Main
50DEVFEST NANTES 16
Modular JDK
rt.jar tools.jar
51DEVFEST NANTES 16
Modular JDK
https://github.com/hasalex/classpath-demo
53DEVFEST NANTES 16
Dependencies
module message.service {
requires message.printer;
requires slf4j.api;
}
module message.p...
54DEVFEST NANTES 16
module message.service {
requires message.printer;
requires slf4j.api;
}
Dependencies
Automatic module...
55DEVFEST NANTES 16
Dependencies
Classpath
message.common
message.printer
unnamed
message.service
56DEVFEST NANTES 16
Dependencies
module message.service @ 1.0 {
requires message.printer @ 1.0;
requires slf4j.api @ 1.7;
...
https://github.com/hasalex/classpath-demo
58DEVFEST NANTES 16
Exports
Accessibility
public
protected
package
private
inside a module
59DEVFEST NANTES 16
Exports
Accessibility
public for other modules
module message.service {
exports fr.sewatech.message;
}
60DEVFEST NANTES 16
Exports
Accessibility
public for some modules
module java.base {
exports sun.reflect to
java.logging,
...
61DEVFEST NANTES 16
field.setAccessible(true);
Exports
java.lang.reflect.InaccessibleObjectException
Refection
module mess...
https://github.com/hasalex/classpath-demo
63DEVFEST NANTES 16
Classloader
java.net.URLClassLoader FLTMClassLoader
java.lang.ClassLoader
64DEVFEST NANTES 16
BootClassLoader
bootclasspath
java -Xbootclasspath/p:hello-lib.jar ...
java -Xbootclasspath:hello-rt.j...
65DEVFEST NANTES 16
Patch
Compile
Run
javac -Xmodule:java.base 
-d ../patch-classes 
src/java/lang/Integer.java
java --pat...
https://github.com/hasalex/classpath-demo
Jigsaw ++
++
https://www.fickr.com/photos/foot-slogger/901793825/
68DEVFEST NANTES 16
Aller plus haw avec Jigsaw
Service Providers / Loaders
Layers : versioning
jlink : custom JRE
jdeps : ...
Quand ?
https://www.fickr.com/photos/mars_/18189674562/
70DEVFEST NANTES 16
Planning
Java SE 9
71DEVFEST NANTES 16
Planning
Outils ?
Maven, Gradle, IDE
Livrairies ?
SLF4J, Guava,...
Frameworks ?
Spring, Hibernate,...
...
72DEVFEST NANTES 16
Essayer...
https://jdk9.java.net/download/
Exécutable d'installation
https://jdk9.java.net/jigsaw/
Arc...
73DEVFEST NANTES 16
Apprendre +
JavaOne
http://openjdk.java.net/projects/jigsaw/talks/
Quick-Start Guide
http://openjdk.ja...
74DEVFEST NANTES 16
module-path is born
classpath is NOT dead
Conclusion
76DEVFEST NANTES 16
https://www.sewatech.fr
@AlexisHassler
http://alexis-hassler.com
https://www.fickr.com/photos/a-hassle...
DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java
Prochain SlideShare
Chargement dans…5
×

DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

195 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. 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, je vous revenir sur le fonctionnement des classloaders du JDK et voir au travers quelques exemples les problèmes étranges qu'ils posent.

Dans la deuxième partie, je présenterai ce que Jigsaw va apporter et j'expliquerai quels problèmes il va résourdre. Je le comparerai aux solutions qui existent déjà, comme OSGi et JBoss Modules.

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

  • Soyez le premier à aimer ceci

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

Aucune remarque pour cette diapositive

DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

  1. 1. 1DEVFEST NANTES 16 DEVFEST NANTES 16 Jigsaw est prêt à tuer le classpath @AlexisHassler - #devfestnantes
  2. 2. "Classpath is dead!" Mark Reinhold JavaOne 2009
  3. 3. 3DEVFEST NANTES 16 Classpath Classloader Succession Jigsaw
  4. 4. 4DEVFEST NANTES 16 Alexis Hassler Développeur Formateur Indépendant Fondateur Préparateur de
  5. 5. Classpath https://www.fickr.com/photos/summonedbyfells/15007676965
  6. 6. 6DEVFEST NANTES 16 String hello = "Salut à vous tous les zazous"; Chercher les classes CLASSPATH Hello var = new Hello();
  7. 7. 7DEVFEST NANTES 16 -classpath java -cp hello-lib.jar HelloWorld
  8. 8. 8DEVFEST NANTES 16 Erreurs java.lang.NoClassDefFoundError java.lang.ClassNotFoundException https://www.fickr.com/photos/rocketboom/2816790116
  9. 9. Class Loader https://www.fickr.com/photos/15574096@N00/12119344725/
  10. 10. 10DEVFEST NANTES 16 java.lang.ClassLoader loadClass(String name) : Class<?> getResource(String name) : URL getResourceAsStream(String name) : InputStream getParent() : ClassLoader
  11. 11. 11DEVFEST NANTES 16 Classloader sun.misc.Launcher$AppClassLoader CLASSPATH Hello.class.getClassLoader()
  12. 12. 12DEVFEST NANTES 16 Classloader null Hello.class.getClassLoader() .getClass().getClassLoader()
  13. 13. 13DEVFEST NANTES 16 Bootstrap Classloader BootstrapClassLoader
  14. 14. 14DEVFEST NANTES 16 Délégation BootstrapClassLoader Parent frst System ClassLoader
  15. 15. 15DEVFEST NANTES 16 Délégation System ClassLoader java -cp hello-lib.jar ...
  16. 16. 16DEVFEST NANTES 16 bootclasspath java -Xbootclasspath/p:hello-lib.jar ... java -Xbootclasspath:hello-rt.jar ... java -Xbootclasspath/a:hello-lib.jar ... BootstrapClassLoader
  17. 17. https://github.com/hasalex/classpath-demo
  18. 18. 18DEVFEST NANTES 16 Démonstration BootstrapClassLoader java -cp example.jar fr.sewatech.classpath.Count System ClassLoader java.lang.Integer example.jar java.lang.Integer
  19. 19. 19DEVFEST NANTES 16 example.jar Démonstration java  -Xbootclasspath/p:example.jar  fr.sewatech.classpath.Count BootstrapClassLoader java.lang.Integer java.lang.Integer
  20. 20. 20DEVFEST NANTES 16 URLClassloader java.net.URLClassLoader sun.misc.Launcher$AppClassLoader URLURLURL
  21. 21. 21DEVFEST NANTES 16 URLClassloader System ClassLoader Bootstrap ClassLoader URL ClassLoader URL ClassLoader URL ClassLoader Parent frst Parent frst Parent frst
  22. 22. 22DEVFEST NANTES 16 DIY Classloader
  23. 23. 23DEVFEST NANTES 16 Usages Application Servers JRebel Javassist, CGLib,...
  24. 24. 24DEVFEST NANTES 16 Tomcat System Bootstrap Common Webapp1 Webapp2 Webapp3 Local First
  25. 25. message-launcher message-main message-common message-printer message-service
  26. 26. 26DEVFEST NANTES 16 Démonstration message-launcher message-common message-printer message-service message-service System ClassLoader ParentFirst ClassLoader
  27. 27. 27DEVFEST NANTES 16 Démonstration message-launcher message-common message-printer message-service message-service System ClassLoader LocalFirst ClassLoader
  28. 28. https://www.fickr.com/photos/delete08/5971235700/
  29. 29. 29DEVFEST NANTES 16 http://www.ironmaidenwallpaper.com/
  30. 30. 30DEVFEST NANTES 16 Dépendances Maven, Gradle, ...
  31. 31. 31DEVFEST NANTES 16 Dépendances Classpath
  32. 32. https://github.com/hasalex/classpath-demo
  33. 33. 33DEVFEST NANTES 16 Démonstration slf4j-api 1.5.11 slf4j-api 1.7.2 message-launcher message-main message-common message-printer message-service
  34. 34. 34DEVFEST NANTES 16 Granularité Sécurité Apache commons-collections https://foxglovesecurity.com/
  35. 35. Succession
  36. 36. 36DEVFEST NANTES 16 Modularité Dépendance Exposition Lecture
  37. 37. 37DEVFEST NANTES 16 1999 Java embarqué Java SE Java serveur
  38. 38. 38DEVFEST NANTES 16 Bundle-Name = Hello Service Bundle-SymbolicName = hello-service Bundle-Description = Hello Service Bundle Bundle-Version = 1.0.1 Export-Package = fr.sewatech.classpath Import-Package = fr.sewatech.classpath.print;version=1.3 OSGi Bundle
  39. 39. 39DEVFEST NANTES 16 OSGi OS + Hardware Java Runtime Module Life Cycle Services
  40. 40. 40DEVFEST NANTES 16 JBoss Modules java -jar jboss-modules.jar -mp path/to/modules my.main.module.name Base de JBoss OSGi Java SE
  41. 41. 41DEVFEST NANTES 16 JBoss Modules module.xml resource dependency slot dependency slot dependency slot name slot resource resource
  42. 42. 42DEVFEST NANTES 16 Jigsaw 9 (2016) 8 (2012) (2017) Projet Intégré au JDK 7 (2008)
  43. 43. 43DEVFEST NANTES 16 Jigsaw Modularité du JDK
  44. 44. 44DEVFEST NANTES 16 Jigsaw Modularité des applications // module-info.java module message.service { requires java.xml.bind; requires message.common; exports fr.sewatech.message; }
  45. 45. 45DEVFEST NANTES 16 Jigsaw Compilation javac --module-path modules -d target/classes/ $(find src/main/java/ -name "*.java")
  46. 46. 46DEVFEST NANTES 16 Jigsaw Exécution java --module-path jigsaw-modules -m misc.examples/fr.sewatech.example.Main
  47. 47. https://github.com/hasalex/classpath-demo
  48. 48. Jigsaw ++ https://www.fickr.com/photos/intvgene/370973576
  49. 49. 49DEVFEST NANTES 16 Classpath mode java -classpath lib/* fr.sewatech.example.Main
  50. 50. 50DEVFEST NANTES 16 Modular JDK rt.jar tools.jar
  51. 51. 51DEVFEST NANTES 16 Modular JDK
  52. 52. https://github.com/hasalex/classpath-demo
  53. 53. 53DEVFEST NANTES 16 Dependencies module message.service { requires message.printer; requires slf4j.api; } module message.printer { requires transitive message.common; } message.printer message.service message.common
  54. 54. 54DEVFEST NANTES 16 module message.service { requires message.printer; requires slf4j.api; } Dependencies Automatic modules slf4j-api-1.5.2. slf4j.api message.service
  55. 55. 55DEVFEST NANTES 16 Dependencies Classpath message.common message.printer unnamed message.service
  56. 56. 56DEVFEST NANTES 16 Dependencies module message.service @ 1.0 { requires message.printer @ 1.0; requires slf4j.api @ 1.7; } Module version
  57. 57. https://github.com/hasalex/classpath-demo
  58. 58. 58DEVFEST NANTES 16 Exports Accessibility public protected package private inside a module
  59. 59. 59DEVFEST NANTES 16 Exports Accessibility public for other modules module message.service { exports fr.sewatech.message; }
  60. 60. 60DEVFEST NANTES 16 Exports Accessibility public for some modules module java.base { exports sun.reflect to java.logging, java.sql, jdk.scripting.nashorn; }
  61. 61. 61DEVFEST NANTES 16 field.setAccessible(true); Exports java.lang.reflect.InaccessibleObjectException Refection module message.service { exports private java.security; }
  62. 62. https://github.com/hasalex/classpath-demo
  63. 63. 63DEVFEST NANTES 16 Classloader java.net.URLClassLoader FLTMClassLoader java.lang.ClassLoader
  64. 64. 64DEVFEST NANTES 16 BootClassLoader bootclasspath java -Xbootclasspath/p:hello-lib.jar ... java -Xbootclasspath:hello-rt.jar ... java -Xbootclasspath/a:hello-lib.jar ...
  65. 65. 65DEVFEST NANTES 16 Patch Compile Run javac -Xmodule:java.base -d ../patch-classes src/java/lang/Integer.java java --patch-module java.base=patch.jar --module-path jigsaw-modules -m misc.examples
  66. 66. https://github.com/hasalex/classpath-demo
  67. 67. Jigsaw ++ ++ https://www.fickr.com/photos/foot-slogger/901793825/
  68. 68. 68DEVFEST NANTES 16 Aller plus haw avec Jigsaw Service Providers / Loaders Layers : versioning jlink : custom JRE jdeps : migration ...
  69. 69. Quand ? https://www.fickr.com/photos/mars_/18189674562/
  70. 70. 70DEVFEST NANTES 16 Planning Java SE 9
  71. 71. 71DEVFEST NANTES 16 Planning Outils ? Maven, Gradle, IDE Livrairies ? SLF4J, Guava,... Frameworks ? Spring, Hibernate,... Runtimes ? Java EE, Tomcat,... Hadoop,...
  72. 72. 72DEVFEST NANTES 16 Essayer... https://jdk9.java.net/download/ Exécutable d'installation https://jdk9.java.net/jigsaw/ Archive Dernières évolutions de Jigsaw
  73. 73. 73DEVFEST NANTES 16 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/
  74. 74. 74DEVFEST NANTES 16 module-path is born classpath is NOT dead Conclusion
  75. 75. 76DEVFEST NANTES 16 https://www.sewatech.fr @AlexisHassler http://alexis-hassler.com https://www.fickr.com/photos/a-hassler/28532230893

×