86
1 DEVFEST NANTES 16 Jigsaw est prêt à tuer le classpath @AlexisHassler février 2017

LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

Embed Size (px)

Citation preview

Page 1: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

1DEVFEST NANTES 16

Jigsawest prêt à tuer le

classpath

@AlexisHassler février 2017

Page 2: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

"Classpath is dead!"

Mark ReinholdJavaOne 2009

Page 3: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

3

Classpath Classloader

SuccessionJigsaw

Page 4: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

4

Alexis Hassler

Développeur

Formateur

Indépendant

Fondateur

Préparateur de

Page 5: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

Classpath

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

Page 6: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

6

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

Chercher les classes

CLASSPATH

Hello var = new Hello();

Page 7: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

7

-classpath

java -cp hello-lib.jar HelloWorld

Page 8: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

8

Erreurs

java.lang.NoClassDefFoundError

java.lang.ClassNotFoundException

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

Page 9: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

Class Loader

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

Page 10: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

10

java.lang.ClassLoader

loadClass(String name) : Class<?>

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

getParent() : ClassLoader

Page 11: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

11

Classloader

sun.misc.Launcher$AppClassLoader CLASSPATH

Hello.class.getClassLoader()

Page 12: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

12

Classloader

null

Hello.class.getClassLoader()

.getClass().getClassLoader()

Page 13: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

13

Bootstrap Classloader

BootstrapClassLoader

Page 14: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

14

Délégation

BootstrapClassLoader

Parent first

System ClassLoader

Page 15: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

15

Délégation

System ClassLoader

java -cp hello-lib.jar ...

Page 16: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

16

bootclasspath

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

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

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

BootstrapClassLoader

Page 17: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

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

Page 18: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

18

DémonstrationBootstrapClassLoader

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

System ClassLoader

java.lang.Integer

example.jar

java.lang.Integer

Page 19: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

19

example.jar

Démonstration

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

BootstrapClassLoader

java.lang.Integer

java.lang.Integer

Page 20: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

20

URLClassloader

java.net.URLClassLoader

sun.misc.Launcher$AppClassLoader

URLURLURL

Page 21: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

21

URLClassloader

System ClassLoader

Bootstrap ClassLoader

URL ClassLoader

URL ClassLoader

URL ClassLoader

Parentfirst

Parentfirst

Parentfirst

Page 22: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

22

DIY Classloader

Page 23: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

23

Usages

Application Servers JRebel Javassist, CGLib,...

Page 24: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

24

Tomcat

System

Bootstrap

Common

Webapp1

Webapp2

Webapp3

Local First

Page 25: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

message-launcher

message-main

message-common

message-printer

message-service

Page 26: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

26

Démonstration

message-launcher

message-common

message-printer

message-service

message-service

System ClassLoader ParentFirst ClassLoader

Page 27: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

27

Démonstration

message-launcher

message-common

message-printer

message-service

message-service

System ClassLoader LocalFirst ClassLoader

Page 28: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

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

Page 29: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

29http://www.ironmaidenwallpaper.com/

Page 30: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

30

Dépendances

Maven, Gradle,...

Page 31: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

31

Dépendances

Classpath

Page 32: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

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

Page 33: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

33

Démonstration

slf4j-api 1.5.11

slf4j-api 1.7.2

message-launcher

message-main

message-common

message-printer

message-service

Page 34: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

34

Granularité

SécuritéApache commons-collections

https://foxglovesecurity.com/

Page 35: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

Succession

Page 36: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

36

Modularité

Dépendance Exposition

Lecture

Page 37: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

37

1999

Java embarquéJava SEJava serveur

Page 38: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

38

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: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

39

OSGi

OS + Hardware

Java Runtime

Module

Life Cycle Services

Page 40: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

40

JBoss Modules

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

my.main.module.name

Base de JBoss OSGi

Java SE

Page 41: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

41

JBoss Modules

module.xml

resource dependency slot

dependency slot

dependency slot

name slot

resource

resource

Page 42: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

42

Jigsaw

9 (2016)8 (2012)

(2017)

Projet

Intégré au JDK 7 (2008)

Page 43: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

43

Jigsaw

Modularité du JDK

Page 44: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

44

Jigsaw

Modularité des applications// module-info.java

module message.service {

requires java.xml.bind;

requires message.common;

exports fr.sewatech.message;

}

Page 45: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

45

Jigsaw

Compilation

javac --module-path modules \

-d target/classes/ \

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

Page 46: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

46

Jigsaw

Exécution

java --module-path jigsaw-modules \

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

Page 47: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

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

Page 48: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

Jigsaw ++

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

Page 49: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

49

Classpath mode

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

Page 50: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

50

Modular JDK

rt.jar tools.jar

Page 51: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

51

Modular JDK

Page 52: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

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

Page 53: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

53

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: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

54

module message.service {

requires message.printer;

requires slf4j.api;

}

Dependencies

Automatic modules slf4j-api-1.5.2.

slf4j.apimessage.service

Page 55: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

55

Dependencies

Classpath

message.common

message.printer

unnamed

message.service

Page 56: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

56

Dependencies

module message.service @ 1.0 {

requires message.printer @ 1.0;

requires slf4j.api @ 1.7;

}

Module version

Page 57: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

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

Page 58: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

58

Exports

Accessibilitypublicprotectedpackageprivate

inside a module

Page 59: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

59

Exports

Accessibilitypublic for other modules

module message.service {

exports fr.sewatech.message;

}

Page 60: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

60

Exports

Accessibilitypublic for some modules

module java.base {

exports sun.reflect to

java.logging,

java.sql,

jdk.scripting.nashorn;

}

Page 61: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

61

field.setAccessible(true);

Exports

java.lang.reflect.InaccessibleObjectException

Deep reflection

module message.service {

opens java.security;

}

Page 62: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

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

Page 63: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

63

Classloader

java.net.URLClassLoader FLTMClassLoader

java.lang.ClassLoader

Page 64: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

64

BootClassLoader

bootclasspath

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

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

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

Page 65: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

65

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: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

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

Page 67: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

Jigsaw ++++

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

Page 68: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

68

Aller plus haw avec Jigsaw

Service Providers / Loaders

jlink : custom JRE

jdeps : migration

Layers : versioning

...

Page 69: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

69

Packaging

Jar files

module-info.class

META-INF/MANIFEST.MF

fr/sewatech/message/Hello.class

...

jar --create

--file=mods/message-service.jar

-C message-service/src .

Page 70: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

70

Packaging

Mod files jmod create

--class-path mods/message-service.jar:mods/slf4j-api.jar

message-service.jmodclasses/...

conf/...

native/

...

Page 71: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

71

Packaging

Linkingjlink --module-path $JAVA_HOME/jmods:mods

--add-modules message-service.jmod

--output message-appbin

└ java

conf

└ ...

lib

└ ...

modules

Page 72: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

72

Service Provider

# META-INF/services/fr.sewatech.message.MessageService

fr.sewatech.message.impl.FullMessageService

Provider (Java 8)

Page 73: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

73

Service Provider

Consumer

ServiceLoader<MessageService> loader

= ServiceLoader.load(MessageService.class);

for (MessageService service : loader) {

...

}

Page 74: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

74

Service Provider

# module-info.java

module message.service.full {

requires message.service;

exports fr.sewatech.message.impl; // NO !

provides fr.sewatech.message.MessageService

with fr.sewatech.message.impl.FullMessageService;

}

Provider (Java 9)

Page 75: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

75

Service Provider

Consumer

# module-info.java

module message.launcher {

requires message.service;

uses fr.sewatech.message.MessageService ;

}

Page 76: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

76

Migration

java / javac arguments --add-modules --add-exports --add-opens

jdeps jdeps --jdk-internals ./

Page 77: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

77

Migration

Multi-Release JAR FilesJAR File

First.class

META-INF

Second.class

Third.class

versions

9

First.class

Page 78: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

Quand ?

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

Page 79: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

79

Planning

Java SE 9

Page 80: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

80

Planning

Outils ?Maven, Gradle, IDE

Librairies ?SLF4J, Guava,...

Frameworks ?Spring, Hibernate,...

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

Page 81: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

81

Essayer...

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

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

Page 82: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

82

Apprendre +

JavaOne, Devoxxhttp://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 83: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

83

Apprendre +

Oracle JDK 9 Documentation http://docs.oracle.com/javase/9/

Page 84: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

84

module-path is born

classpath is NOT dead

Conclusion

Page 85: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath
Page 86: LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath

86

https://www.sewatech.fr

@AlexisHassler

http://alexis-hassler.com

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