Upload
alexis-hassler
View
501
Download
0
Embed Size (px)
Citation preview
Alexis Hassler
Jigsaw est prêt à tuer le
classpath
octobre 2016
"Classpath is dead!"
Mark ReinholdJavaOne 2009
ClasspathClassloader
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) : URLgetResources(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
Parentfirst
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");
ExtensionExtension 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 JCPorg.omg (CORBA), org.w3c.dom, org.xml.sax (XML)
APIs standaloneJAXP, JAXB, Scripting, Compiler API,...
https://github.com/hasalex/classpath-demo
example.jar
DémonstrationBootstrapClassLoader
java -cp example.jar fr.sewatech.classpath.Count
System ClassLoader
java.lang.Integer
example.jar
DémonstrationBootstrapClassLoader
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
Parentfirst
Parentfirst
Parentfirst
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
UR
LC
lassload
er
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 jarjuste 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 SEJava serveur
OSGi
BundleFichier 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 ≠ ModulesNotions différentes
Build diffcileMauvaise 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 applicationsmodule-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 codehttp://github.com/hasalex/classpath-demo
JDK 99-ea+138-jigsaw-nightly-h5561-20161003
Demo
Mavenmaven-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
IDEJetbrains IDEA
Eclipse
Netbeans
Specifcations
JSR 376: Java Platform Module System
JSR 379:
Java SE 9
Specifcations
JEPsJEP 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 APIsjava.*, javax.*
Supported APIscom.sun.*,jdk.*
UnsupportedAPIs
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
OptionalRequired 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 accessibilitypublic
protected
package private
private
inside a module
Exports
Java accessibilitypublic for other modules
module message.service {
exports fr.sewatech.message;
}
Exports
Java accessibilitypublic 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 RefectionsetAccessible(true)
field.setAccessible(true);// => java.lang.reflect.InaccessibleObjectException
https://github.com/hasalex/classpath-demo
Classloader
Java SE
ModulesPlatformClassLoader
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 BeOnly 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 9Septembre 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 +
JavaOnehttp://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/
@AlexisHassler
http://alexis-hassler.com
http://sewatech.fr