Alexis Hassler
Jigsaw
est prêt à tuer le
classpath
octobre 2016
"Classpath is dead!"
Mark Reinhold
JavaOne 2009
Classpath
Classloader
Mort 
?
Succession
Jigsaw
Alexis Hassler
Développeur
Formateur
Indépendant
Fondateur
Préparateur de
Classpath
String hello = "Salut à vous tous les zazous";
Chercher les classes
CLASSPATH
Hello var = new Hello();
-classpath
java -cp hello-lib.jar HelloWorld
Erreurs
java.lang.NoClassDefFoundError
java.lang.ClassNotFoundException
Classloader
java.lang.ClassLoader
loadClass(String name) : Class<?>
getResource(String name) : URL
getResourceAsStream(String name) : InputStream
getParent() : ClassLoader
Classloader
sun.misc.Launcher$AppClassLoader
CLASSPATH
Hello.class.getClassLoader()
Classloader
null
Hello.class.getClassLoader()
.getClass().getClassLoader()
Bootstrap Classloader
BootstrapClassLoader
Délégation
BootstrapClassLoader
Parent
first
System ClassLoader
Délégation
java -cp hello-lib.jar ...
System ClassLoader
BootstrapClassLoader
bootclasspath
java -Xbootclasspath/p:hello-lib.jar ...
java -Xbootclasspath:hello-rt.jar ...
java -Xbootclasspath/a:hello-lib.jar ...
https://github.com/hasalex/classpath-demo
Démonstration
BootstrapClassLoader
java -cp example.jar fr.sewatech.classpath.Count
System ClassLoader
java.lang.Integer
example.jar
java.lang.Integer
example.jar
Démonstration
java  -Xbootclasspath/p:example.jar  fr.sewatech.classpath.Count
java.lang.Integer
BootstrapClassLoader
java.lang.Integer
URLClassloader
java.net.URLClassLoader
sun.misc.Launcher$AppClassLoader
URLURLURL
URLClassloader
System ClassLoader
Bootstrap ClassLoader
URL ClassLoader
URL ClassLoader
URL ClassLoader
Parent
first
Parent
first
Parent
first
FLTM Classloader
Fait Le Toi-Même
Usages
Application Servers
JRebel
Javassist, CGLib,...
Tomcat
System
Bootstrap
Common
Webapp1
Webapp2
Webapp3
Local First
message-launcher
message-main
message-common
message-printer
message-service
Démonstration
message-launcher
message-common
message-printer
message-service
message-service
System ClassLoader ParentFirst ClassLoader
Démonstration
message-launcher
message-common
message-printer
message-service
message-service
System ClassLoader LocalFirst ClassLoader
Mort ?
http://www.ironmaidenwallpaper.com/
Dépendances
Maven,
Gradle,
...
Dépendances
Classpath
https://github.com/hasalex/classpath-demo
Démonstration
slf4j-api
1.5.11
slf4j-api
1.7.2
message-launcher
message-main
message-common
message-printer
message-service
Granularité
Sécurité
Apache commons-collections
https://foxglovesecurity.com/
Succession
Modularité
Dépendance
Exposition
Lecture
1999
Java embarqué
Java SE
Java serveur
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
Bundle
OSGi
OS + Hardware
Java Runtime
Module
Life Cycle Services
JBoss Modules
Sous-projet de
Inspiré de Jigsaw (version 2010)
Base de JBoss OSGi
JBoss Modules
java -jar jboss-modules.jar -mp path/to/modules
my.main.module.name
WildFly / JBoss EAP
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.Final.jar
modules
com
fr
org
...
org
hibernate
main
JBoss Modules
module.xml
resource
resource
resource
dependency slot
dependency slot
dependency slot
name slot
Jigsaw
Projet OpenJDK
Intégré au JDK 7 (2008)
9 (2016)
8 (2012)
(2017)
Jigsaw
Modularité du JDK
Corba pour Hello World ?
Swing pour Tomcat ?
Jigsaw
Modularité des applications
module-info.java
module message.service {
requires java.xml.bind;
requires message.common;
exports fr.sewatech.message;
}
Jigsaw
Compilation
javac --module-path modules 
-d target/classes/ 
$(find src/main/java/ -name "*.java")
Jigsaw
Exécution
java --module-path jigsaw-modules 
-m misc.examples/fr.sewatech.example.Main
https://github.com/hasalex/classpath-demo
Jigsaw ++
Classpath mode
java -classpath lib/* fr.sewatech.example.Main
Modular JDK
rt.jar tools.jar
Modular JDK
https://github.com/hasalex/classpath-demo
Dependencies
module message.service {
requires message.printer;
requires slf4j.api;
}
module message.printer {
requires transitive message.common;
}
message.service
message.printer
message.common
module message.service {
requires message.printer;
requires slf4j.api;
}
Dependencies
Automatic modules
message.service
slf4j.api
slf4j-api-1.5.2.
Dependencies
Classpath
message.service
message.printer
message.common
unnamed
Dependencies
module message.service @ 1.0 {
requires message.printer @ 1.0;
requires slf4j.api @ 1.7;
}
Module version
https://github.com/hasalex/classpath-demo
Exports
Java accessibility
public
protected
package private
private
inside a module
Exports
Java accessibility
public for other modules
module message.service {
exports fr.sewatech.message;
}
Exports
Java accessibility
public for some modules
module java.base {
exports sun.reflect to
java.logging,
java.sql,
jdk.scripting.nashorn;
}
Exports
module message.service {
exports private java.security;
}
field.setAccessible(true);
// => java.lang.reflect.InaccessibleObjectException
Refection
https://github.com/hasalex/classpath-demo
Classloader
java.net.URLClassLoader FLTMClassLoader
java.lang.ClassLoader
BootClassLoader
bootclasspath
java -Xbootclasspath/p:hello-lib.jar ...
java -Xbootclasspath:hello-rt.jar ...
java -Xbootclasspath/a:hello-lib.jar ...
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
https://github.com/hasalex/classpath-demo
Jigsaw ++
++
Aller plus haw avec Jigsaw
Service Providers / Loaders
Versioning / Layers
Custom JRE : jlink
Migration : jdeps
...
Quand ?
Planning
Java SE 9
27 juillet 2017
Planning
Outils ?
Maven, Gradle, IDE
Livrairies ?
Runtimes ?
Java EE, Tomcat,...
Hadoop,...
Essayer...
https://jdk9.java.net/download/
Exécutable d'installation
https://jdk9.java.net/jigsaw/
Archive
Dernières évolutions de Jigsaw
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/
module-path is born
classpath is NOT dead
Conclusion
@AlexisHassler
http://alexis-hassler.com
https://www.sewatech.fr

Soft-Shake 2016 : Jigsaw est prêt à tuer le classpath