115
Alexis Hassler Jigsaw est prêt à tuer le classpath octobre 2016

LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Embed Size (px)

Citation preview

Page 1: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Alexis Hassler

Jigsaw est prêt à tuer le

classpath

octobre 2016

Page 2: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

"Classpath is dead!"

Mark ReinholdJavaOne 2009

Page 3: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

ClasspathClassloader

Mort ?

Succession

Page 4: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Alexis Hassler

Développeur

Formateur

Indépendant

Fondateur

Préparateur de

Page 5: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Classpath

Page 6: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

String hello = "Salut à vous tous les zazous";

MyStuff var;

Chercher les classes

CLASSPATH

Page 7: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

-classpath

java -cp hello-lib.jar HelloWorld

Page 8: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Manifest

Manifest-Version: 1.0

Class-Path: hello-lib.jar

Main-Class: HelloWorld

Page 9: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Connaître le classpath

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

Page 10: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Erreurs

java.lang.NoClassDefFoundError

java.lang.ClassNotFoundException

Page 11: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

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

Page 12: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Classloader

Page 13: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Classpath

Géré par des classloaders

Page 14: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

java.lang.ClassLoader

loadClass(String name) : Class<?>

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

getParent() : ClassLoader

Page 15: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Classloader

sun.misc.Launcher$AppClassLoader

CLASSPATH

MyStuff.class.getClassLoader()

Page 16: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Bootstrap Classloader

null

classloader.getClass().getClassLoader()

Page 17: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Bootstrap Classloader

BootstrapClassLoader

Page 18: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

ExtensionClasspath

sun.misc.Launcher$ExtClassLoader

sun.misc.Launcher$AppClassLoader

Délégation

BootstrapClassLoader

Parentfirst

Parent first

System ClassLoader

Extension ClassLoader

Page 19: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Délégation

java -cp hello-lib.jar ...

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

ClasspathSystem ClassLoader

Page 20: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Délégation

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

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

ExtensionExtension ClassLoader

Page 21: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Délégation

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

BootstrapClassLoader

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

Page 22: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

bootclasspath

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

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

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

Page 23: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Endorsed

!= Extension

Page 24: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Endorsed

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

Endorsed

BootstrapClassLoader

Page 25: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Endorsed

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

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

Page 26: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

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

Page 27: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

example.jar

DémonstrationBootstrapClassLoader

java -cp example.jar fr.sewatech.classpath.Count

System ClassLoader

java.lang.Integer

Page 28: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

example.jar

DémonstrationBootstrapClassLoader

java -Xbootclasspath/p:example.jar fr.sewatech.classpath.Count

java.lang.Integer

Page 29: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

URLClassloader

java.net.URLClassLoader

sun.misc.Launcher$AppClassLoader

sun.misc.Launcher$ExtClassLoader

URLURLURL

Page 30: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

URLClassloader

System ClassLoader

Bootstrap ClassLoader

URL ClassLoader

URL ClassLoader

URL ClassLoader

Parentfirst

Parentfirst

Parentfirst

Page 31: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

message-launcher

message-main

message-common

message-printer

message-service

Page 32: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Démonstration

java -cp service.jar:launcher.jar fr.sewatech.classpath.Hello

message-launcher

message-main

message-common

message-printer

message-service

Page 33: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

message-launcher

message-common

message-printer

message-service

Démonstration

java -cp service.jar:launcher.jar fr.sewatech.classpath.HelloViaUrl

message-serviceClasspath

UR

LC

lassload

er

Page 34: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Démonstration

message-launcher

message-common

message-printer

message-service

message-service

System ClassLoader ParentFirst ClassLoader

Page 35: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

FLTM Classloader

Fait Le Toi-Même

Page 36: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Usages

Application Servers

JRebel

Javassist, CGLib,...

Page 37: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Tomcat

System

Bootstrap

Common

Webapp1

Webapp2

Webapp3

Local First

Page 38: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

JBoss AS 5

System

Bootstrap

Common

Web App

Ent App

Web Module

EJB Module

Local First

Repo First

Page 39: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Erreurs

ClassCastException

org.project.SomeStuff cannot be cast to

org.project.SomeStuff

Page 40: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Erreurs

URL ClassLoader

URL ClassLoader

MyStuff var = MyStuffFactory.build();

return new MyStuff() ;

Page 41: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

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

Page 42: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Démonstration

message-launcher

message-common

message-printer

message-service

message-service

System ClassLoader LocalFirst ClassLoader

Page 43: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Mort ?

Page 44: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

http://www.ironmaidenwallpaper.com/

Page 45: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Dépendances

Maven, Gradle,...

Page 46: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Dépendances

Classpath

Page 47: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Runtime

ClasspathA plat

Fichiers jarjuste du stockage

pas ou peu de métadonnée

Page 48: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

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

Page 49: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Démonstration

slf4j-api 1.5.11

slf4j-api 1.7.2

message-launcher

message-main

message-common

message-printer

message-service

Page 50: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Granularité

SécuritéApache commons-collections

https://foxglovesecurity.com/

Page 51: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Succession

Page 52: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Modularité

Dépendance

Exposition

Lecture

Page 53: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

1999

Java embarquéJava SEJava serveur

Page 54: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

OSGi

BundleFichier jar

META-INF/MANIFEST.MF

Import / export de packages

Page 55: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

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

Page 56: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

OSGi

OS + Hardware

Java Execution Environment

Applications(bundles)

Module

Life Cycle

Services

Page 57: LyonJUG : Comment Jigsaw est prêt à tuer le classpath
Page 58: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

JBoss Modules

Sous-projet de Wildfy

Inspiré de Jigsaw (version 2010)

Base de JBoss OSGi

Page 59: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

JBoss Modules

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

my.main.module.name

Java SE

Page 60: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

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

Page 61: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

JBoss Modules

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

...

</module>

Page 62: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

<?xml version="1.0" encoding="UTF-8"?>

<module xmlns="urn:jboss:module:1.1" name="org.hibernate">

...

<dependencies>

<module name="javax.api"/>

<module name="javax.persistence.api"/>

<module name="javax.transaction.api"/>

<module name="org.apache.commons.collections"/>

<!-- ... -->

</dependencies>

</module>

JBoss Modules

Page 63: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

JBoss Modules

<?xml version="1.0" encoding="UTF-8"?>

<module xmlns="urn:jboss:module:1.1"

name="fr.sewatech.message-launcher">

<main-class name="fr.sewatech.classpath.Hello"/>

...

</module>

Page 64: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

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

Page 65: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

JBoss Modules

Artefacts ≠ ModulesNotions différentes

Build diffcileMauvaise intégration aux outils

Page 66: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Jigsaw

Projet OpenJDK

Intégré au JDK 7 (2008)

9 (2016)

8 (2012)

(2017)

Page 67: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Jigsaw

Modularité du JDK

Corba pour Hello World ?

Swing pour Tomcat ?

Page 68: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Jigsaw

Modularité des applicationsmodule-info.java

module message.service {

requires java.xml.bind;

requires message.common;

exports fr.sewatech.message;

}

Page 69: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Jigsaw

Compilation

javac --module-path modules \

-d target/classes/ \

$(find src/main/java/ -name "*.java")

Page 70: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Jigsaw

Exécution

java --module-path jigsaw-modules \

-m misc.examples/fr.sewatech.example.Main

Page 71: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

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

Page 72: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Jigsaw ++

Page 73: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Demo

Source codehttp://github.com/hasalex/classpath-demo

JDK 99-ea+138-jigsaw-nightly-h5561-20161003

Page 74: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Demo

Mavenmaven-compiler-plugin:3.6-jigsaw-SNAPSHOT

org.ow2.asm:asm:6.0_ALPHA

plexus-compiler-api:2.8.2-SNAPSHOT

plexus-compiler-manager:2.8.2-SNAPSHOT

plexus-compiler-javac:2.8.2-SNAPSHOT

Page 75: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Demo

IDEJetbrains IDEA

Eclipse

Netbeans

Page 76: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Specifcations

JSR 376: Java Platform Module System

JSR 379:

Java SE 9

Page 77: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Specifcations

JEPsJEP 261: Module System

JEP 200: The Modular JDK

JEP 260: Encapsulate Most Internal APIs

JEP 201: Modular Source Code

JEP 220: Modular Run-Time Images

JEP 282: jlink: The Java Linker

Page 78: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Modular JDK

rt.jar tools.jar

Page 79: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Modular JDK

Page 80: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Modular JDK

Standard APIsjava.*, javax.*

Supported APIscom.sun.*,jdk.*

UnsupportedAPIs

sun.*sun.misc.Unsafe, sun.misc.BASE64Decoder,sun.misc.BASE64Encoder

Page 81: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

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

Page 82: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Classpath mode

Classpath is NOT dead

java -classpath lib/* fr.sewatech.example.Main

Page 83: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

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

Page 84: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Dependencies

module message.service {

requires message.printer;

requires message.common;

}

message.service

message.printer

message.common

Page 85: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Dependencies

module message.service {

requires message.printer;

}module message.printer {

requires transitive message.common;

}

message.service

message.printer

message.common

Page 86: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Dependencies

Automatic modules

module message.service {

requires slf4j.api;

}

message.service

slf4j.api

slf4j-api-1.5.2.

Page 87: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Dependencies

Classpath

message.service message.printer

message.common

unnamed

Page 88: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Dependencies

OptionalRequired at compile time

module message.service {

requires static message.printer;

}

Page 89: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Dependencies

module message.service @ 1.0 {

requires message.printer @ 1.0;

requires slf4j.api @ 1.7;

}

Module version

Page 90: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

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

Page 91: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Exports

Java accessibilitypublic

protected

package private

private

inside a module

Page 92: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Exports

Java accessibilitypublic for other modules

module message.service {

exports fr.sewatech.message;

}

Page 93: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Exports

Java accessibilitypublic for some modules

module java.base {

exports sun.reflect to

java.logging,

java.sql,

jdk.scripting.nashorn;

}

Page 94: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Exports

module message.service {

exports private java.security;

}

Encapsulation vs RefectionsetAccessible(true)

field.setAccessible(true);// => java.lang.reflect.InaccessibleObjectException

Page 95: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

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

Page 96: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Classloader

Java SE

ModulesPlatformClassLoader

AppClassLoader

BootClassLoader

jdk.internal.loader.ClassLoaders$...

Page 97: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Classloader

jdk.internal.loader.BuiltinClassLoader

AppClassLoader

PlatformClassLoader

BootClassLoader

Page 98: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Classloader

Fait Le Toi-Même

java.net.URLClassLoader

FLTMClassLoader

Page 99: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Classloader

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

BootClassLoader

Page 100: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Classloader

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

BootClassLoader

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

Page 101: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Patch

Compile

javac -Xmodule:java.base \

-d ../patch-classes \

src/java/lang/Integer.java

Page 102: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Patch

Run

java --patch-module java.base=../patch-classes \

--module-path jigsaw-modules \

-m misc.examples

Page 103: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

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

Page 104: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Layers

No Version

module message.service @ 1.0 {

requires message.printer @ 1.0;

requires slf4j.api @ 1.7;

}

Page 105: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Layers

Highlander rule #1

« There Can BeOnly One »

Page 106: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

slf4j.api

Layers

org.slf4j

slf4j.other

org.slf4j

Page 107: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Layers

Boot Layer

App Loader Platform Loader Boot Loader

message.service slf4j.api java.basejava.xml.bind

Java Module System

Java Virtual Machine

Page 108: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Layers

Boot Layer

Java Module System

Java Virtual Machine

Page 109: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Quand ?

Page 110: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Planning

Java SE 9Septembre 2017

Page 111: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Planning

Outils ?Maven, Gradle, IDE

Livrairies ?

Runtimes ?Java EE, Tomcat,...

Page 112: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Essayer...

https://jdk9.java.net/download/ Exécutable d'installation

https://jdk9.java.net/jigsaw/ Archive

Dernières évolutions de Jigsaw

Page 113: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

Apprendre +

JavaOnehttp://openjdk.java.net/projects/jigsaw/talks/

Quick-Start Guidehttp://openjdk.java.net/projects/jigsaw/quick-start

The State of the Module Systemhttp://openjdk.java.net/projects/jigsaw/spec/sotms/

Page 114: LyonJUG : Comment Jigsaw est prêt à tuer le classpath
Page 115: LyonJUG : Comment Jigsaw est prêt à tuer le classpath

@AlexisHassler

http://alexis-hassler.com

http://sewatech.fr