ElsassJUG - Le classpath n'est pas mort

Preview:

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

?

@AlexisHassler

http://alexis-hassler.com

alexis.hassler@sewatech.fr

http://sewatech.fr