Upload
alexis-hassler
View
194
Download
3
Embed Size (px)
Citation preview
Alexis Hassler
Le classpath n'est pas mort...
ElsassJUGJanvier 2015
mais presque
"Classpath is dead!"
Mark Reinhold JavaOne 2009
ClasspathClassloader
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) : 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
ExtensionCl
asspath
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");
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 JCPorg.omg (CORBA), org.w3c.dom, org.xml.sax (XML)
APIs standaloneJAXP, JAXB, Scripting, Compiler API,...
http://github.com/hasalex/classpath-demo
classloader-demo
DémonstrationBootstrapClassLoader
java -cp cl-demo.jar fr.sewatech.classpath.Count
System ClassLoader
classloader-demo
DémonstrationBootstrapClassLoader
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
Parentfirst
Parentfirst
Parentfirst
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-mainClasspa
th
URLClasslo
ader
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
WTF ?
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
Classpath
A plat
Fichiers jarjuste 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épendancestransitives
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
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
WebappClassLoader
$CATALINA_HOME/lib
SystemClassLoader
CommonClass Loader
Tomcat
Module ?
WEB-INF/classes, WEB-INF/lib
SystemClassLoader
CommonClass Loader
WebappClassLoader
$CATALINA_HOME/lib
ModuleClassLoader
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 ≠ ModulesNotions différentes
Outillage diffcile
Jigsaw
Projet OpenJDK
Intégré au JDK 7
9 (2016)
8 (2012)
(2008)
. . .
Jigsaw
Modularité du JDKCorba pour Hello World ?
Swing pour Tomcat ?
Jigsaw
Modularité des applicationsmodule-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 JDKJEP 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
Parentfirst
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
?