85
10:40-11:30 - Salle Miles Davis Le classpath n'est pas mort... mais presque

DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

10:40-11:30 - Salle Miles Davis

Le classpath n'est pas mort...

mais presque

Page 2: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

27 au 29 mars 2013

Le classpath n'est pas mort...

mais presque

@AlexisHasslerDéveloppeur, formateur indépendant

Page 3: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

"Classpath is dead!"

Mark Reinhold JavaOne 2009

Page 4: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Classpath

Page 5: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Classloader

Page 6: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Mort ?

Page 7: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Successeur

Page 8: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Alexis Hassler

Développeur, formateur Java

Indépendant

Co-leader du

Page 9: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Classpath

Page 10: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Chercher les classes

String hello = "Bonjour Devoxx";

MyStuff var;

CLASSPATH

Page 11: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

-classpath

java -cp hello-lib.jar HelloWorld

Page 12: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Manifest

Manifest-Version: 1.0

Class-Path: hello-lib.jar

Main-Class: HelloWorld

Page 13: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Connaitre le classpath

System.getProperty("java.class.path");

Page 14: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Erreurs

java.lang.NoClassDefFoundError

java.lang.ClassNotFoundException

Page 15: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Classpath

Géré par des classloaders

Page 16: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Classloader

Page 17: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

java.lang.ClassLoader

loadClass(String name) : Class<?>

getResource(String name) : URLgetResources(String name) : Enumeration<URL>getResourceAsStream(String name) : InputStream

getParent() : ClassLoader

Page 18: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Classloader

MyStuff.class.getClassLoader()

sun.misc.Launcher$AppClassLoader

CLASSPATH

Page 19: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Bootstrap Classloader

classloader.getClass().getClassLoader()

null

Page 20: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Bootstrap Classloader

BootstrapClassLoader

Page 21: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Extension

Classpath

sun.misc.Launcher$AppClassLoader

sun.misc.Launcher$ExtClassLoader

sun.misc.Launcher$AppClassLoader

Délégation

BootstrapClassLoader

Parent first

Parent first

System ClassLoader

Extension ClassLoader

Page 22: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Délégation

java -cp hello-lib.jar ...

System.getProperty("java.class.path");

Classpath

System ClassLoader

Page 23: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Délégation

java -Djava.ext.dirs=~/.java7/ext ...

Extension

Extension ClassLoader

System.getProperty("java.ext.dirs");

Page 24: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Délégation

Ext != Endorsed

Page 25: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Délégation

BootstrapClassLoader

java -Xbootclasspath:hello-rt.jar ...

System.getProperty("sun.boot.class.path");

Page 26: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

bootclasspath

java -Xbootclasspath:hello-rt.jar ...

java -Xbootclasspath/a:hello-lib.jar ...

java -Xbootclasspath/p:hello-lib.jar ...

Page 27: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Endorsed

Endorsed

java -Djava.endorsed.dirs=~/.java7/endorsed ...

BootstrapClassLoader

Page 28: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Endorsed

APIs standards hors JCPorg.omg (CORBA), org.w3c.dom, org.xml.sax (XML)

APIs standaloneJAXP, JAXB, Scripting, Compiler API,...

Page 29: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

27 au 29 mars 2013

Démonstration

http://github.com/hasalex/classpath-demo

Page 30: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

classloader-demo

Démonstration

BootstrapClassLoaderSystem ClassLoader

java -cp cl-demo.jar fr.sewatech.classpath.Count

Page 31: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

classloader-demo

Démonstration

BootstrapClassLoader

java -Xbootclasspath/p:lib/cl-demo.jar fr.sewatech.classpath.Count

Page 32: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

URLClassloader

java.net.URLClassLoader

sun.misc.Launcher$AppClassLoader

sun.misc.Launcher$ExtClassLoader

URLURLURL

Page 33: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

URLClassloader

System ClassLoader

Bootstrap ClassLoader

URL ClassLoader

URL ClassLoader

URL ClassLoader

Parent first

Parent first

Parent first

Page 34: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

FLTM Classloader

Fait Le Toi-Même

Page 35: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Usages

Application Servers

JRebel

Javassist, CGLib,...

Page 36: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Tomcat

System

Bootstrap

Common

Webapp1

Webapp2

Webapp3

Local First

Page 37: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

JBoss AS 5

System

Bootstrap

Common

Web App

Ent AppWeb AppWeb Module

EJB Module

Local First

Repo First

Page 38: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Erreurs

ClassCastExceptionMyStuff cannot be cast to MyStuff

WTF ?

Page 39: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Erreurs

URL ClassLoader

URL ClassLoader

MyStuff var = MyStuffFactory.build();

return new MyStuff() ;

Page 40: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

27 au 29 mars 2013

Démonstration

http://github.com/hasalex/classpath-demo

Page 41: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

classloader-demo

message-main

message-common

Démonstration

message-printer

Page 42: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

classloader-demo

message-main

message-common

Démonstration

message-printer

Classpath

Mave

nReposito

ry

Cla

ssLoader

message-main

java -cp cl-demo.jar:msg-main.jar fr.sewatech.classpath.HelloViaMvnRepo

Page 43: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Démonstration

classloader-demo

message-common

message-printer

message-main

message-main

System ClassLoader ParentFirst ClassLoader

Page 44: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Démonstration

classloader-demo

message-common

message-printer

message-main

message-main

System ClassLoader LocalFirst ClassLoader

Page 45: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Mort

Page 46: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Jar

HELL

http://www.ironmaidenwallpaper.com/

Page 47: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Dépendances

Maven, Gradle,...

Page 48: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Dépendances

Classpath

Page 49: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Runtime

A plat

Fichiers jarjuste du stockage

pas ou peu de métadonnéeClass

path

Page 50: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Runtime

Hiérarchique applications server

Page 51: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

27 au 29 mars 2013

Démonstration

http://github.com/hasalex/classpath-demo

Page 52: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

message-main

message-common

Démonstration

message-printer

classloader-demo

slf4j-api 1.5.11

slf4j-api 1.7.2

Page 53: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Remplaçant

Page 54: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Application

Granularité

Classpath

Page 55: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Application Monolithique

Granularité

Application Web / JavaEE

Page 56: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Librairies partagéesApplication

Granularité

Application Web / JavaEE

Page 57: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Application

Modularité

Application Web / JavaEE

Page 58: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Modularité

Visibilité

Import

Export

Dépendances transitives

Page 59: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

1999

Java embarqué

Java SE

Java serveur

Page 60: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

OSGi

BundleFichier jar

META-INF/MANIFEST.MF

Import / export de packages

Page 61: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Bundle-Name = Simple Bundle

Bundle-SymbolicName = simple-bundle

Bundle-Description = Simple Bundle.

Export-Package = fr.sewatech.mystuff.services

Import-Package = org.osgi.framework;version=1.3

Bundle-Version = 1.0.1

OSGi

Page 62: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

OSGi

OS + Hardware

Java Execution Environment

Applications(bundles)

Module

Life Cycle

Services

Page 63: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

OSGi

Apporte de la valeur=> applications hautement dynamiques

Apporte de la complexité=> outils pour gérer la complexité

Page 64: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Jigsaw

Projet OpenJDK

Intégré au JDK 7 9 (2015)8 (2012)(2008) ...

Page 65: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Jigsaw

Modularité des applications

Modularité du JDK

Page 66: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Jigsaw

Dépendance à une partie du JDKPlus besoin de Corba pour Hello World

Plus besoin de Swing pour Tomcat

RepositoryTéléchargement automatique des modules

Page 67: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Jigsaw

module-info.java

module message-main @ 1.0 {

exports fr.sewatech.message;

requires fr.sewatech.message-common @ 1.1;

class fr.sewatech.message.Main;

}

Page 68: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque
Page 69: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

JBoss Modules

Sous-projet de JBoss AS 7

Inspiré de Jigsaw

Base de JBoss OSGi

Page 70: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

JBoss Modules

java -jar jboss-modules.jar -mp path/to/modules

my.main.module.name

Java SE

Page 71: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

JBoss Modules

hibernate-infinispan-4.1.6.Final.jar

module.xml

hibernate-core-4.1.6.Final.jarhibernate-entitymanager-4.1.6

.Final.jar

modulescom

fr

org

...

org

hibernate

main

Page 72: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

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>

Page 73: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

<?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>

Page 74: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

27 au 29 mars 2013

Démonstration

http://github.com/hasalex/classpath-demo

Page 75: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

JBoss AS 7

bin Scripts de démarrage

bundles Composants OSGi

modules Modules JBoss

standalone Profil standalone

domain Profil domain

Page 76: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

JBoss AS 7

message.war

bin Scripts de démarrage

bundles Composants OSGi

modules Modules JBoss

standalone Profil standalone

domain Profil domain

Page 77: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Tomcat

WEB-INF/classes, WEB-INF/lib

System ClassLoader

CommonClass Loader

WebappClassLoader

$CATALINA_HOME/lib

Classloading

Page 78: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Tomcat

WEB-INF/classes, WEB-INF/lib

System ClassLoader

CommonClass Loader

WebappClassLoader

$CATALINA_HOME/lib

Module ?

ModuleClassLoader

modules

Page 79: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Tomcat

A suivre...

https://github.com/hasalex/tomcat-modules

Page 80: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

27 au 29 mars 2013

Démonstration

http://github.com/hasalex/classpath-demo

Page 81: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Cible

Applications complexes

Beaucoup de réutilisation

Page 82: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Développement / déploiement

Artefacts ≠ ModulesNotions différentes

Outillage difficile

Page 83: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

En attendant Jigsaw ?

Page 84: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

Merci

Page 85: DevoxxFR 2013 - Le classpath n'est pas mort, mais presque

27 au 29 mars 2013

Questions/

Réponses