DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

76
1 DEVFEST NANTES 16 DEVFEST NANTES 16 Jigsaw est prêt à tuer le classpath @AlexisHassler - #devfestnantes

Transcript of DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

Page 1: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

1DEVFEST NANTES 16

DEVFEST NANTES 16

Jigsaw est prêt à tuer le

classpath@AlexisHassler - #devfestnantes

Page 2: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

"Classpath is dead!"

Mark ReinholdJavaOne 2009

Page 3: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

3DEVFEST NANTES 16

Classpath Classloader

SuccessionJigsaw

Page 4: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

4DEVFEST NANTES 16

Alexis Hassler

Développeur

Formateur

Indépendant

Fondateur

Préparateur de

Page 5: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

Classpath

https://www.fickr.com/photos/summonedbyfells/15007676965

Page 6: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

6DEVFEST NANTES 16

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

Chercher les classes

CLASSPATH

Hello var = new Hello();

Page 7: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

7DEVFEST NANTES 16

-classpath

java -cp hello-lib.jar HelloWorld

Page 8: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

8DEVFEST NANTES 16

Erreurs

java.lang.NoClassDefFoundError

java.lang.ClassNotFoundException

https://www.fickr.com/photos/rocketboom/2816790116

Page 9: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

Class Loader

https://www.fickr.com/photos/15574096@N00/12119344725/

Page 10: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

10DEVFEST NANTES 16

java.lang.ClassLoader

loadClass(String name) : Class<?>

getResource(String name) : URLgetResourceAsStream(String name) : InputStream

getParent() : ClassLoader

Page 11: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

11DEVFEST NANTES 16

Classloader

sun.misc.Launcher$AppClassLoader CLASSPATH

Hello.class.getClassLoader()

Page 12: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

12DEVFEST NANTES 16

Classloader

null

Hello.class.getClassLoader()

.getClass().getClassLoader()

Page 13: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

13DEVFEST NANTES 16

Bootstrap Classloader

BootstrapClassLoader

Page 14: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

14DEVFEST NANTES 16

Délégation

BootstrapClassLoader

Parent frst

System ClassLoader

Page 15: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

15DEVFEST NANTES 16

Délégation

System ClassLoader

java -cp hello-lib.jar ...

Page 16: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

16DEVFEST NANTES 16

bootclasspath

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

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

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

BootstrapClassLoader

Page 17: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

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

Page 18: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

18DEVFEST NANTES 16

DémonstrationBootstrapClassLoader

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

System ClassLoader

java.lang.Integer

example.jar

java.lang.Integer

Page 19: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

19DEVFEST NANTES 16

example.jar

Démonstration

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

BootstrapClassLoader

java.lang.Integer

java.lang.Integer

Page 20: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

20DEVFEST NANTES 16

URLClassloader

java.net.URLClassLoader

sun.misc.Launcher$AppClassLoader

URLURLURL

Page 21: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

21DEVFEST NANTES 16

URLClassloader

System ClassLoader

Bootstrap ClassLoader

URL ClassLoader

URL ClassLoader

URL ClassLoader

Parentfrst

Parentfrst

Parentfrst

Page 22: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

22DEVFEST NANTES 16

DIY Classloader

Page 23: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

23DEVFEST NANTES 16

Usages

Application Servers JRebel Javassist, CGLib,...

Page 24: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

24DEVFEST NANTES 16

Tomcat

System

Bootstrap

Common

Webapp1

Webapp2

Webapp3

Local First

Page 25: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

message-launcher

message-main

message-common

message-printer

message-service

Page 26: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

26DEVFEST NANTES 16

Démonstration

message-launcher

message-common

message-printer

message-service

message-service

System ClassLoader ParentFirst ClassLoader

Page 27: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

27DEVFEST NANTES 16

Démonstration

message-launcher

message-common

message-printer

message-service

message-service

System ClassLoader LocalFirst ClassLoader

Page 28: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

https://www.fickr.com/photos/delete08/5971235700/

Page 29: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

29DEVFEST NANTES 16 http://www.ironmaidenwallpaper.com/

Page 30: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

30DEVFEST NANTES 16

Dépendances

Maven, Gradle,...

Page 31: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

31DEVFEST NANTES 16

Dépendances

Classpath

Page 32: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

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

Page 33: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

33DEVFEST NANTES 16

Démonstration

slf4j-api 1.5.11

slf4j-api 1.7.2

message-launcher

message-main

message-common

message-printer

message-service

Page 34: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

34DEVFEST NANTES 16

Granularité

SécuritéApache commons-collections

https://foxglovesecurity.com/

Page 35: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

Succession

Page 36: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

36DEVFEST NANTES 16

Modularité

Dépendance Exposition

Lecture

Page 37: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

37DEVFEST NANTES 16

1999

Java embarquéJava SEJava serveur

Page 38: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

38DEVFEST NANTES 16

Bundle-Name = Hello Service

Bundle-SymbolicName = hello-service

Bundle-Description = Hello Service Bundle

Bundle-Version = 1.0.1

Export-Package = fr.sewatech.classpath

Import-Package = fr.sewatech.classpath.print;version=1.3

OSGi

Bundle

Page 39: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

39DEVFEST NANTES 16

OSGi

OS + Hardware

Java Runtime

Module

Life Cycle Services

Page 40: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

40DEVFEST NANTES 16

JBoss Modules

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

my.main.module.name

Base de JBoss OSGi

Java SE

Page 41: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

41DEVFEST NANTES 16

JBoss Modules

module.xml

resource dependency slot

dependency slot

dependency slot

name slot

resource

resource

Page 42: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

42DEVFEST NANTES 16

Jigsaw

9 (2016)8 (2012)

(2017)

Projet

Intégré au JDK 7 (2008)

Page 43: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

43DEVFEST NANTES 16

Jigsaw

Modularité du JDK

Page 44: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

44DEVFEST NANTES 16

Jigsaw

Modularité des applications// module-info.java

module message.service {

requires java.xml.bind;

requires message.common;

exports fr.sewatech.message;

}

Page 45: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

45DEVFEST NANTES 16

Jigsaw

Compilation

javac --module-path modules \

-d target/classes/ \

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

Page 46: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

46DEVFEST NANTES 16

Jigsaw

Exécution

java --module-path jigsaw-modules \

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

Page 47: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

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

Page 48: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

Jigsaw ++

https://www.fickr.com/photos/intvgene/370973576

Page 49: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

49DEVFEST NANTES 16

Classpath mode

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

Page 50: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

50DEVFEST NANTES 16

Modular JDK

rt.jar tools.jar

Page 51: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

51DEVFEST NANTES 16

Modular JDK

Page 52: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

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

Page 53: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

53DEVFEST NANTES 16

Dependencies

module message.service {

requires message.printer;

requires slf4j.api;

}

module message.printer {

requires transitive message.common;

}

message.printer

message.service

message.common

Page 54: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

54DEVFEST NANTES 16

module message.service {

requires message.printer;

requires slf4j.api;

}

Dependencies

Automatic modules slf4j-api-1.5.2.

slf4j.api

message.service

Page 55: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

55DEVFEST NANTES 16

Dependencies

Classpath

message.common

message.printer

unnamed

message.service

Page 56: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

56DEVFEST NANTES 16

Dependencies

module message.service @ 1.0 {

requires message.printer @ 1.0;

requires slf4j.api @ 1.7;

}

Module version

Page 57: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

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

Page 58: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

58DEVFEST NANTES 16

Exports

Accessibilitypublicprotectedpackageprivate

inside a module

Page 59: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

59DEVFEST NANTES 16

Exports

Accessibilitypublic for other modules

module message.service {

exports fr.sewatech.message;

}

Page 60: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

60DEVFEST NANTES 16

Exports

Accessibilitypublic for some modules

module java.base {

exports sun.reflect to

java.logging,

java.sql,

jdk.scripting.nashorn;

}

Page 61: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

61DEVFEST NANTES 16

field.setAccessible(true);

Exports

java.lang.reflect.InaccessibleObjectException

Refection

module message.service {

exports private java.security;

}

Page 62: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

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

Page 63: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

63DEVFEST NANTES 16

Classloader

java.net.URLClassLoader FLTMClassLoader

java.lang.ClassLoader

Page 64: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

64DEVFEST NANTES 16

BootClassLoader

bootclasspath

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

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

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

Page 65: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

65DEVFEST NANTES 16

Patch

Compile

Run

javac -Xmodule:java.base \

-d ../patch-classes \

src/java/lang/Integer.java

java --patch-module java.base=patch.jar \

--module-path jigsaw-modules \

-m misc.examples

Page 66: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

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

Page 67: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

Jigsaw ++++

https://www.fickr.com/photos/foot-slogger/901793825/

Page 68: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

68DEVFEST NANTES 16

Aller plus haw avec Jigsaw

Service Providers / Loaders

Layers : versioning

jlink : custom JRE

jdeps : migration

...

Page 69: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

Quand ?

https://www.fickr.com/photos/mars_/18189674562/

Page 70: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

70DEVFEST NANTES 16

Planning

Java SE 9

Page 71: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

71DEVFEST NANTES 16

Planning

Outils ?Maven, Gradle, IDE

Livrairies ?SLF4J, Guava,...

Frameworks ?Spring, Hibernate,...

Runtimes ?Java EE, Tomcat,...Hadoop,...

Page 72: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

72DEVFEST NANTES 16

Essayer...

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

https://jdk9.java.net/jigsaw/ ArchiveDernières évolutions de Jigsaw

Page 73: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

73DEVFEST NANTES 16

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 74: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

74DEVFEST NANTES 16

module-path is born

classpath is NOT dead

Conclusion

Page 75: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java
Page 76: DevFest Nantes 2016 - Jigsaw est prêt à tuer le classpath Java

76DEVFEST NANTES 16

https://www.sewatech.fr

@AlexisHassler

http://alexis-hassler.com

https://www.fickr.com/photos/a-hassler/28532230893