1DEVFEST NANTES 16
Jigsawest prêt à tuer le
classpath
@AlexisHassler février 2017
"Classpath is dead!"
Mark ReinholdJavaOne 2009
3
Classpath Classloader
SuccessionJigsaw
4
Alexis Hassler
Développeur
Formateur
Indépendant
Fondateur
Préparateur de
Classpath
https://www.flickr.com/photos/summonedbyfells/15007676965
6
String hello = "Salut à vous tous les zazous";
Chercher les classes
CLASSPATH
Hello var = new Hello();
7
-classpath
java -cp hello-lib.jar HelloWorld
8
Erreurs
java.lang.NoClassDefFoundError
java.lang.ClassNotFoundException
https://www.flickr.com/photos/rocketboom/2816790116
Class Loader
https://www.flickr.com/photos/15574096@N00/12119344725/
10
java.lang.ClassLoader
loadClass(String name) : Class<?>
getResource(String name) : URLgetResourceAsStream(String name) : InputStream
getParent() : ClassLoader
11
Classloader
sun.misc.Launcher$AppClassLoader CLASSPATH
Hello.class.getClassLoader()
12
Classloader
null
Hello.class.getClassLoader()
.getClass().getClassLoader()
13
Bootstrap Classloader
BootstrapClassLoader
14
Délégation
BootstrapClassLoader
Parent first
System ClassLoader
15
Délégation
System ClassLoader
java -cp hello-lib.jar ...
16
bootclasspath
java -Xbootclasspath/p:hello-lib.jar ...
java -Xbootclasspath:hello-rt.jar ...
java -Xbootclasspath/a:hello-lib.jar ...
BootstrapClassLoader
https://github.com/hasalex/classpath-demo
18
DémonstrationBootstrapClassLoader
java -cp example.jar fr.sewatech.classpath.Count
System ClassLoader
java.lang.Integer
example.jar
java.lang.Integer
19
example.jar
Démonstration
java -Xbootclasspath/p:example.jar fr.sewatech.classpath.Count
BootstrapClassLoader
java.lang.Integer
java.lang.Integer
20
URLClassloader
java.net.URLClassLoader
sun.misc.Launcher$AppClassLoader
URLURLURL
21
URLClassloader
System ClassLoader
Bootstrap ClassLoader
URL ClassLoader
URL ClassLoader
URL ClassLoader
Parentfirst
Parentfirst
Parentfirst
22
DIY Classloader
23
Usages
Application Servers JRebel Javassist, CGLib,...
24
Tomcat
System
Bootstrap
Common
Webapp1
Webapp2
Webapp3
Local First
message-launcher
message-main
message-common
message-printer
message-service
26
Démonstration
message-launcher
message-common
message-printer
message-service
message-service
System ClassLoader ParentFirst ClassLoader
27
Démonstration
message-launcher
message-common
message-printer
message-service
message-service
System ClassLoader LocalFirst ClassLoader
https://www.flickr.com/photos/delete08/5971235700/
29http://www.ironmaidenwallpaper.com/
30
Dépendances
Maven, Gradle,...
31
Dépendances
Classpath
https://github.com/hasalex/classpath-demo
33
Démonstration
slf4j-api 1.5.11
slf4j-api 1.7.2
message-launcher
message-main
message-common
message-printer
message-service
34
Granularité
SécuritéApache commons-collections
https://foxglovesecurity.com/
Succession
36
Modularité
Dépendance Exposition
Lecture
37
1999
Java embarquéJava SEJava serveur
38
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
OSGi
OS + Hardware
Java Runtime
Module
Life Cycle Services
40
JBoss Modules
java -jar jboss-modules.jar -mp path/to/modules
my.main.module.name
Base de JBoss OSGi
Java SE
41
JBoss Modules
module.xml
resource dependency slot
dependency slot
dependency slot
name slot
resource
resource
42
Jigsaw
9 (2016)8 (2012)
(2017)
Projet
Intégré au JDK 7 (2008)
43
Jigsaw
Modularité du JDK
44
Jigsaw
Modularité des applications// module-info.java
module message.service {
requires java.xml.bind;
requires message.common;
exports fr.sewatech.message;
}
45
Jigsaw
Compilation
javac --module-path modules \
-d target/classes/ \
$(find src/main/java/ -name "*.java")
46
Jigsaw
Exécution
java --module-path jigsaw-modules \
-m misc.examples/fr.sewatech.example.Main
https://github.com/hasalex/classpath-demo
Jigsaw ++
https://www.flickr.com/photos/intvgene/370973576
49
Classpath mode
java -classpath lib/* fr.sewatech.example.Main
50
Modular JDK
rt.jar tools.jar
51
Modular JDK
https://github.com/hasalex/classpath-demo
53
Dependencies
module message.service {
requires message.printer;
requires slf4j.api;
}
module message.printer {
requires transitive message.common;
}
message.printer
message.service
message.common
54
module message.service {
requires message.printer;
requires slf4j.api;
}
Dependencies
Automatic modules slf4j-api-1.5.2.
slf4j.apimessage.service
55
Dependencies
Classpath
message.common
message.printer
unnamed
message.service
56
Dependencies
module message.service @ 1.0 {
requires message.printer @ 1.0;
requires slf4j.api @ 1.7;
}
Module version
https://github.com/hasalex/classpath-demo
58
Exports
Accessibilitypublicprotectedpackageprivate
inside a module
59
Exports
Accessibilitypublic for other modules
module message.service {
exports fr.sewatech.message;
}
60
Exports
Accessibilitypublic for some modules
module java.base {
exports sun.reflect to
java.logging,
java.sql,
jdk.scripting.nashorn;
}
61
field.setAccessible(true);
Exports
java.lang.reflect.InaccessibleObjectException
Deep reflection
module message.service {
opens java.security;
}
https://github.com/hasalex/classpath-demo
63
Classloader
java.net.URLClassLoader FLTMClassLoader
java.lang.ClassLoader
64
BootClassLoader
bootclasspath
java -Xbootclasspath/p:hello-lib.jar ...
java -Xbootclasspath:hello-rt.jar ...
java -Xbootclasspath/a:hello-lib.jar ...
65
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 ++++
https://www.flickr.com/photos/foot-slogger/901793825/
68
Aller plus haw avec Jigsaw
Service Providers / Loaders
jlink : custom JRE
jdeps : migration
Layers : versioning
...
69
Packaging
Jar files
module-info.class
META-INF/MANIFEST.MF
fr/sewatech/message/Hello.class
...
jar --create
--file=mods/message-service.jar
-C message-service/src .
70
Packaging
Mod files jmod create
--class-path mods/message-service.jar:mods/slf4j-api.jar
message-service.jmodclasses/...
conf/...
native/
...
71
Packaging
Linkingjlink --module-path $JAVA_HOME/jmods:mods
--add-modules message-service.jmod
--output message-appbin
└ java
conf
└ ...
lib
└ ...
modules
72
Service Provider
# META-INF/services/fr.sewatech.message.MessageService
fr.sewatech.message.impl.FullMessageService
Provider (Java 8)
73
Service Provider
Consumer
ServiceLoader<MessageService> loader
= ServiceLoader.load(MessageService.class);
for (MessageService service : loader) {
...
}
74
Service Provider
# module-info.java
module message.service.full {
requires message.service;
exports fr.sewatech.message.impl; // NO !
provides fr.sewatech.message.MessageService
with fr.sewatech.message.impl.FullMessageService;
}
Provider (Java 9)
75
Service Provider
Consumer
# module-info.java
module message.launcher {
requires message.service;
uses fr.sewatech.message.MessageService ;
}
76
Migration
java / javac arguments --add-modules --add-exports --add-opens
jdeps jdeps --jdk-internals ./
77
Migration
Multi-Release JAR FilesJAR File
First.class
META-INF
Second.class
Third.class
versions
9
First.class
Quand ?
https://www.flickr.com/photos/mars_/18189674562/
79
Planning
Java SE 9
80
Planning
Outils ?Maven, Gradle, IDE
Librairies ?SLF4J, Guava,...
Frameworks ?Spring, Hibernate,...
Runtimes ?Java EE, Tomcat,...Hadoop,...
81
Essayer...
https://jdk9.java.net/download/ Exécutable d'installation
https://jdk9.java.net/jigsaw/ ArchiveDernières évolutions de Jigsaw
82
Apprendre +
JavaOne, Devoxxhttp://openjdk.java.net/projects/jigsaw/talks/
Quick-Start Guidehttp://openjdk.java.net/projects/jigsaw/quick-start
The State of the Module Systemhttp://openjdk.java.net/projects/jigsaw/spec/sotms/
83
Apprendre +
Oracle JDK 9 Documentation http://docs.oracle.com/javase/9/
84
module-path is born
classpath is NOT dead
Conclusion
86
https://www.sewatech.fr
@AlexisHassler
http://alexis-hassler.com
https://www.flickr.com/photos/a-hassler/28532230893
Top Related