Alexis Hassler
Jigsaw
est prêt à tuer le
classpath
octobre 2016
"Classpath is dead!"
Mark Reinhold
JavaOne 2009
Classpath
Classloader
Mort 
?
Succession
Alexis Hassler
Développeur
Formateur
Indépendant
Fondateur
Préparateur de
Classpath
String hello = "Salut à vous tous les zazous";
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
https://github.com/hasalex/classpath-demo
Classloader
Classpath
Géré par des classloaders
java.lang.ClassLoader
loadClass(String name) : Class<?>
getResource(String name) : URL
getResources(String name) : Enumeration<URL>
getResourceAsStream(String name) : InputStream
getParent() : ClassLoader
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
Parent
first
Parent
first
System ClassLoader
Extension ClassLoader
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
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-lib.jar ...
Endorsed
!= Extension
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, Compiler API,...
https://github.com/hasalex/classpath-demo
example.jar
Démonstration
BootstrapClassLoader
java -cp example.jar fr.sewatech.classpath.Count
System ClassLoader
java.lang.Integer
example.jar
Démonstration
BootstrapClassLoader
java -Xbootclasspath/p:example.jar fr.sewatech.classpath.Count
java.lang.Integer
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
Parent
first
Parent
first
message-launcher
message-main
message-common
message-printer
message-service
Démonstration
java -cp service.jar:launcher.jar fr.sewatech.classpath.Hello
message-launcher
message-main
message-common
message-printer
message-service
message-launcher
message-common
message-printer
message-service
Démonstration
java -cp service.jar:launcher.jar fr.sewatech.classpath.HelloViaUrl
message-serviceClasspath
URLClassloader
Démonstration
message-launcher
message-common
message-printer
message-service
message-service
System ClassLoader ParentFirst ClassLoader
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
org.project.SomeStuff
cannot be cast to
org.project.SomeStuff
Erreurs
URL ClassLoader
URL ClassLoader
MyStuff var = MyStuffFactory.build();
return new MyStuff() ;
≠
https://github.com/hasalex/classpath-demo
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
Runtime
ClasspathA plat
Fichiers jar
juste du stockage
pas ou peu de métadonnée
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
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
Export-Package = fr.sewatech.mystuff.services
Import-Package = org.osgi.framework;version=1.3
OSGi
OSGi
OS + Hardware
Java Execution Environment
Applications
(bundles)
Module
Life Cycle
Services
JBoss Modules
Sous-projet de Wildfy
Inspiré de Jigsaw (version 2010)
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.Final.jar
modules
com
fr
org
...
org
hibernate
main
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>
<?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
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>
https://github.com/hasalex/classpath-demo
JBoss Modules
Artefacts ≠ Modules
Notions différentes
Build diffcile
Mauvaise intégration aux outils
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 ++
Demo
Source code
http://github.com/hasalex/classpath-demo
JDK 9
9-ea+138-jigsaw-nightly-h5561-20161003
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
Demo
IDE
Jetbrains IDEA
Eclipse
Netbeans
Specifcations
JSR 376:
Java Platform Module System
JSR 379:
Java SE 9
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
Modular JDK
rt.jar tools.jar
Modular JDK
Modular JDK
Standard APIs
java.*, javax.*
Supported APIs
com.sun.*,
jdk.*
Unsupported
APIs
sun.*
sun.misc.Unsafe,
sun.misc.BASE64Decoder,
sun.misc.BASE64Encoder
https://github.com/hasalex/classpath-demo
Classpath mode
Classpath is NOT dead
java -classpath lib/* fr.sewatech.example.Main
https://github.com/hasalex/classpath-demo
Dependencies
module message.service {
requires message.printer;
requires message.common;
}
message.service
message.printer
message.common
Dependencies
module message.service {
requires message.printer;
}
module message.printer {
requires transitive message.common;
}
message.service
message.printer
message.common
Dependencies
Automatic modules
module message.service {
requires slf4j.api;
}
message.service
slf4j.api
slf4j-api-1.5.2.
Dependencies
Classpath
message.service
message.printer
message.common
unnamed
Dependencies
Optional
Required at compile time
module message.service {
requires static message.printer;
}
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;
}
Encapsulation vs Refection
setAccessible(true)
field.setAccessible(true);
// => java.lang.reflect.InaccessibleObjectException
https://github.com/hasalex/classpath-demo
Classloader
Java
SE
M
odules
PlatformClassLoader
AppClassLoader
BootClassLoader
jdk.internal.loader.ClassLoaders$...
Classloader
jdk.internal.loader.BuiltinClassLoader
AppClassLoader
PlatformClassLoader
BootClassLoader
Classloader
Fait Le Toi-Même
java.net.URLClassLoader
FLTMClassLoader
Classloader
java -Djava.endorsed.dirs=~/.java8/endorsed ...
BootClassLoader
Classloader
java -Xbootclasspath:hello-rt.jar ...
BootClassLoader
System.getProperty("sun.boot.class.path");
Patch
Compile
javac -Xmodule:java.base 
-d ../patch-classes 
src/java/lang/Integer.java
Patch
Run
java --patch-module java.base=../patch-classes 
--module-path jigsaw-modules 
-m misc.examples
https://github.com/hasalex/classpath-demo
Layers
No Version
module message.service @ 1.0 {
requires message.printer @ 1.0;
requires slf4j.api @ 1.7;
}
Layers
Highlander rule #1
« There Can Be
Only One »
slf4j.api
Layers
org.slf4j
slf4j.other
org.slf4j
Layers
Boot Layer
App Loader Platform Loader Boot Loader
message.service slf4j.api java.basejava.xml.bind
Java Module System
Java Virtual Machine
Layers
Boot Layer
Java Module System
Java Virtual Machine
Quand ?
Planning
Java SE 9
Septembre 2017
Planning
Outils ?
Maven, Gradle, IDE
Livrairies ?
Runtimes ?
Java EE, Tomcat,...
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/
@AlexisHassler
http://alexis-hassler.com
http://sewatech.fr

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