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

Preview:

DESCRIPTION

 

Citation preview

10:40-11:30 - Salle Miles Davis

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

"Classpath is dead!"

Mark Reinhold JavaOne 2009

Classpath

Classloader

Mort ?

Successeur

Alexis Hassler

Développeur, formateur Java

Indépendant

Co-leader du

Classpath

Chercher les classes

String hello = "Bonjour Devoxx";

MyStuff var;

CLASSPATH

-classpath

java -cp hello-lib.jar HelloWorld

Manifest

Manifest-Version: 1.0

Class-Path: hello-lib.jar

Main-Class: HelloWorld

Connaitre le classpath

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

Erreurs

java.lang.NoClassDefFoundError

java.lang.ClassNotFoundException

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

MyStuff.class.getClassLoader()

sun.misc.Launcher$AppClassLoader

CLASSPATH

Bootstrap Classloader

classloader.getClass().getClassLoader()

null

Bootstrap Classloader

BootstrapClassLoader

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

Délégation

java -cp hello-lib.jar ...

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

Classpath

System ClassLoader

Délégation

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

Extension

Extension ClassLoader

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

Délégation

Ext != Endorsed

Délégation

BootstrapClassLoader

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

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

Endorsed

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

BootstrapClassLoader

Endorsed

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

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

27 au 29 mars 2013

Démonstration

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

classloader-demo

Démonstration

BootstrapClassLoaderSystem ClassLoader

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

classloader-demo

Démonstration

BootstrapClassLoader

java -Xbootclasspath/p:lib/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

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 AppWeb AppWeb Module

EJB Module

Local First

Repo First

Erreurs

ClassCastExceptionMyStuff cannot be cast to MyStuff

WTF ?

Erreurs

URL ClassLoader

URL ClassLoader

MyStuff var = MyStuffFactory.build();

return new MyStuff() ;

27 au 29 mars 2013

Démonstration

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

classloader-demo

message-main

message-common

Démonstration

message-printer

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

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

Jar

HELL

http://www.ironmaidenwallpaper.com/

Dépendances

Maven, Gradle,...

Dépendances

Classpath

Runtime

A plat

Fichiers jarjuste du stockage

pas ou peu de métadonnéeClass

path

Runtime

Hiérarchique applications server

27 au 29 mars 2013

Démonstration

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

Remplaçant

Application

Granularité

Classpath

Application Monolithique

Granularité

Application Web / JavaEE

Librairies partagéesApplication

Granularité

Application Web / JavaEE

Application

Modularité

Application Web / JavaEE

Modularité

Visibilité

Import

Export

Dépendances transitives

1999

Java embarqué

Java SE

Java serveur

OSGi

BundleFichier jar

META-INF/MANIFEST.MF

Import / export de packages

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

OSGi

OS + Hardware

Java Execution Environment

Applications(bundles)

Module

Life Cycle

Services

OSGi

Apporte de la valeur=> applications hautement dynamiques

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

Jigsaw

Projet OpenJDK

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

Jigsaw

Modularité des applications

Modularité du JDK

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

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;

}

JBoss Modules

Sous-projet de JBoss AS 7

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.jarhibernate-entitymanager-4.1.6

.Final.jar

modulescom

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>

27 au 29 mars 2013

Démonstration

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

JBoss AS 7

bin Scripts de démarrage

bundles Composants OSGi

modules Modules JBoss

standalone Profil standalone

domain Profil domain

JBoss AS 7

message.war

bin Scripts de démarrage

bundles Composants OSGi

modules Modules JBoss

standalone Profil standalone

domain Profil domain

Tomcat

WEB-INF/classes, WEB-INF/lib

System ClassLoader

CommonClass Loader

WebappClassLoader

$CATALINA_HOME/lib

Classloading

Tomcat

WEB-INF/classes, WEB-INF/lib

System ClassLoader

CommonClass Loader

WebappClassLoader

$CATALINA_HOME/lib

Module ?

ModuleClassLoader

modules

Tomcat

A suivre...

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

27 au 29 mars 2013

Démonstration

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

Cible

Applications complexes

Beaucoup de réutilisation

Développement / déploiement

Artefacts ≠ ModulesNotions différentes

Outillage difficile

En attendant Jigsaw ?

Merci

27 au 29 mars 2013

Questions/

Réponses