Alexis Hassler
Le classpath
n'est pas mort...
ElsassJUG
Janvier 2015
mais presque
"Classpath is dead!"
Mark Reinhold
JavaOne 2009
Classpath
Classloader
Mort 
?
Succession
Alexis Hassler
Développeur, formateur Java
Indépendant
Co-leader du
Classpath
String hello = "Bonjour Devoxx";
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
http://github.com/hasalex/classpath-demo
Classpath
Géré par des classloaders
Classloader
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
Ext != Endorsed
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
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,...
http://github.com/hasalex/classpath-demo
classloader-demo
Démonstration
BootstrapClassLoader
java -cp cl-demo.jar fr.sewatech.classpath.Count
System ClassLoader
classloader-demo
Démonstration
BootstrapClassLoader
java -Xbootclasspath/p:cl-demo.jar fr.sewatech.classpath.Count
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
http://github.com/hasalex/classpath-demo
Démonstration
java -cp cl-demo.jar:msg-main.jar fr.sewatech.classpath.Hello
classloader-demo
message-main
message-common
message-printer
message-main
classloader-demo
message-main
message-common
message-printer
message-main
Démonstration
java -cp cl-demo.jar:msg-main.jar fr.sewatech.classpath.HelloViaUrl
message-mainClasspath
URLClassloader
Démonstration
classloader-demo
message-common
message-printer
message-main
message-main
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
MyStuff cannot be cast to MyStuff
W
TF
?
Erreurs
URL ClassLoader
URL ClassLoader
MyStuff var = MyStuffFactory.build();
return new MyStuff() ;
≠
http://github.com/hasalex/classpath-demo
Démonstration
classloader-demo
message-common
message-printer
message-main
message-main
System ClassLoader ParentFirst ClassLoader
Démonstration
classloader-demo
message-common
message-printer
message-main
message-main
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
Runtime
Hiérarchique
applications server
http://github.com/hasalex/classpath-demo
message-main
message-common
Démonstration
message-printer
classloader-demo
slf4j-api
1.5.11
slf4j-api
1.7.2
Succession
Granularité
Classpath
Application
Granularité
Application Web / JavaEE
Application Monolithique
Granularité
Application Web / JavaEE
Librairies partagéesApplication
Modularité
Application Web / JavaEE
Application
Modularité
Visibilité
Import
Export
Dépendances
transitives
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
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="fr.sewatech.conference.classloader-demo">
<main-class name="fr.sewatech.classpath.Hello"/>
<resources>
<resource-root path="classloader-demo-1.0-SNAPSHOT.jar"/>
</resources>
<dependencies>
<module name="fr.sewatech.conference.message-main" />
</dependencies>
</module>
<?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>
<dependencies>
<module name="javax.api"/>
<module name="javax.persistence.api"/>
<module name="javax.transaction.api"/>
<module name="org.apache.commons.collections"/>
<!-- ... -->
</dependencies>
</module>
http://github.com/hasalex/classpath-demo
WildFly
bin Scripts de démarrage
bundles Composants OSGi
modules Modules JBoss
standalone Profil standalone
domain Profil domain
bin Scripts de démarrage
bundles Composants OSGi
modules Modules JBoss
standalone Profil standalone
domain Profil domain
WildFly
message.war
WildFly
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<dependencies>
<module name="fr.sewatech.conference.message-main" />
</dependencies>
</deployment>
</jboss-deployment-structure>
message.war
http://github.com/hasalex/classpath-demo
Tomcat
Classloading
WEB-INF/classes,
WEB-INF/lib
Webapp
ClassLoader
$CATALINA_HOME/lib
System
ClassLoader
Common
Class Loader
Tomcat
Module ?
WEB-INF/classes,
WEB-INF/lib
System
ClassLoader
Common
Class Loader
Webapp
ClassLoader
$CATALINA_HOME/lib
Module
ClassLoader
modules
Tomcat
https://github.com/hasalex/tomcat-modules
http://github.com/hasalex/classpath-demo
Cible
Applications complexes
Beaucoup de réutilisation
Développement / déploiement
Artefacts ≠ Modules
Notions différentes
Outillage diffcile
Jigsaw
Projet OpenJDK
Intégré au JDK 7
9 (2016)
8 (2012)
(2008)
. . .
Jigsaw
Modularité du JDK
Corba pour Hello World ?
Swing pour Tomcat ?
Jigsaw
Modularité des applications
module-info.java
module message-main @ 1.0 {
exports fr.sewatech.message;
requires fr.sewatech.message-common @ 1.1;
class fr.sewatech.message.Main;
}
Jigsaw
JEP 200: The Modular JDK
JEP 201: Modular Source Code
JEP 220: The Modular Run-Time Images
JEP xxx: The JDK Module System
JSR 376:
Java Platform Module System
Jigsaw
rt.jar tools.jar
Jigsaw
Extension
sun.misc.Launcher$ExtClassLoader
sun.misc.Launcher$AppClassLoader
BootstrapClassLoader
Parent
first
Parent
first
System ClassLoader
Extension ClassLoader
J'imagine qu'il est tentant,
si le seul outil que vous avez est un marteau,
de traiter tout problème comme si c'était un clou.
Abraham MaslowPaul Watzlawick
?
@AlexisHassler
http://alexis-hassler.com
alexis.hassler@sewatech.fr
http://sewatech.fr

ElsassJUG - Le classpath n'est pas mort...