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

Preview:

Citation preview

1DEVFEST NANTES 16

Jigsawest prêt à tuer le

classpath

@AlexisHassler février 2017

"Classpath is dead!"

Mark ReinholdJavaOne 2009

3

Classpath Classloader

SuccessionJigsaw

4

Alexis Hassler

Développeur

Formateur

Indépendant

Fondateur

Préparateur de

Classpath

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

6

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

Chercher les classes

CLASSPATH

Hello var = new Hello();

7

-classpath

java -cp hello-lib.jar HelloWorld

8

Erreurs

java.lang.NoClassDefFoundError

java.lang.ClassNotFoundException

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

Class Loader

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

10

java.lang.ClassLoader

loadClass(String name) : Class<?>

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

getParent() : ClassLoader

11

Classloader

sun.misc.Launcher$AppClassLoader CLASSPATH

Hello.class.getClassLoader()

12

Classloader

null

Hello.class.getClassLoader()

.getClass().getClassLoader()

13

Bootstrap Classloader

BootstrapClassLoader

14

Délégation

BootstrapClassLoader

Parent first

System ClassLoader

15

Délégation

System ClassLoader

java -cp hello-lib.jar ...

16

bootclasspath

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

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

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

BootstrapClassLoader

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

18

DémonstrationBootstrapClassLoader

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

System ClassLoader

java.lang.Integer

example.jar

java.lang.Integer

19

example.jar

Démonstration

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

BootstrapClassLoader

java.lang.Integer

java.lang.Integer

20

URLClassloader

java.net.URLClassLoader

sun.misc.Launcher$AppClassLoader

URLURLURL

21

URLClassloader

System ClassLoader

Bootstrap ClassLoader

URL ClassLoader

URL ClassLoader

URL ClassLoader

Parentfirst

Parentfirst

Parentfirst

22

DIY Classloader

23

Usages

Application Servers JRebel Javassist, CGLib,...

24

Tomcat

System

Bootstrap

Common

Webapp1

Webapp2

Webapp3

Local First

message-launcher

message-main

message-common

message-printer

message-service

26

Démonstration

message-launcher

message-common

message-printer

message-service

message-service

System ClassLoader ParentFirst ClassLoader

27

Démonstration

message-launcher

message-common

message-printer

message-service

message-service

System ClassLoader LocalFirst ClassLoader

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

29http://www.ironmaidenwallpaper.com/

30

Dépendances

Maven, Gradle,...

31

Dépendances

Classpath

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

33

Démonstration

slf4j-api 1.5.11

slf4j-api 1.7.2

message-launcher

message-main

message-common

message-printer

message-service

34

Granularité

SécuritéApache commons-collections

https://foxglovesecurity.com/

Succession

36

Modularité

Dépendance Exposition

Lecture

37

1999

Java embarquéJava SEJava serveur

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

39

OSGi

OS + Hardware

Java Runtime

Module

Life Cycle Services

40

JBoss Modules

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

my.main.module.name

Base de JBoss OSGi

Java SE

41

JBoss Modules

module.xml

resource dependency slot

dependency slot

dependency slot

name slot

resource

resource

42

Jigsaw

9 (2016)8 (2012)

(2017)

Projet

Intégré au JDK 7 (2008)

43

Jigsaw

Modularité du JDK

44

Jigsaw

Modularité des applications// module-info.java

module message.service {

requires java.xml.bind;

requires message.common;

exports fr.sewatech.message;

}

45

Jigsaw

Compilation

javac --module-path modules \

-d target/classes/ \

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

46

Jigsaw

Exécution

java --module-path jigsaw-modules \

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

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

Jigsaw ++

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

49

Classpath mode

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

50

Modular JDK

rt.jar tools.jar

51

Modular JDK

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

53

Dependencies

module message.service {

requires message.printer;

requires slf4j.api;

}

module message.printer {

requires transitive message.common;

}

message.printer

message.service

message.common

54

module message.service {

requires message.printer;

requires slf4j.api;

}

Dependencies

Automatic modules slf4j-api-1.5.2.

slf4j.apimessage.service

55

Dependencies

Classpath

message.common

message.printer

unnamed

message.service

56

Dependencies

module message.service @ 1.0 {

requires message.printer @ 1.0;

requires slf4j.api @ 1.7;

}

Module version

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

58

Exports

Accessibilitypublicprotectedpackageprivate

inside a module

59

Exports

Accessibilitypublic for other modules

module message.service {

exports fr.sewatech.message;

}

60

Exports

Accessibilitypublic for some modules

module java.base {

exports sun.reflect to

java.logging,

java.sql,

jdk.scripting.nashorn;

}

61

field.setAccessible(true);

Exports

java.lang.reflect.InaccessibleObjectException

Deep reflection

module message.service {

opens java.security;

}

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

63

Classloader

java.net.URLClassLoader FLTMClassLoader

java.lang.ClassLoader

64

BootClassLoader

bootclasspath

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

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

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

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

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

Jigsaw ++++

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

68

Aller plus haw avec Jigsaw

Service Providers / Loaders

jlink : custom JRE

jdeps : migration

Layers : versioning

...

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 .

70

Packaging

Mod files jmod create

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

message-service.jmodclasses/...

conf/...

native/

...

71

Packaging

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

--add-modules message-service.jmod

--output message-appbin

└ java

conf

└ ...

lib

└ ...

modules

72

Service Provider

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

fr.sewatech.message.impl.FullMessageService

Provider (Java 8)

73

Service Provider

Consumer

ServiceLoader<MessageService> loader

= ServiceLoader.load(MessageService.class);

for (MessageService service : loader) {

...

}

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)

75

Service Provider

Consumer

# module-info.java

module message.launcher {

requires message.service;

uses fr.sewatech.message.MessageService ;

}

76

Migration

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

jdeps jdeps --jdk-internals ./

77

Migration

Multi-Release JAR FilesJAR File

First.class

META-INF

Second.class

Third.class

versions

9

First.class

Quand ?

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

79

Planning

Java SE 9

80

Planning

Outils ?Maven, Gradle, IDE

Librairies ?SLF4J, Guava,...

Frameworks ?Spring, Hibernate,...

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

81

Essayer...

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

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

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/

83

Apprendre +

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

84

module-path is born

classpath is NOT dead

Conclusion

86

https://www.sewatech.fr

@AlexisHassler

http://alexis-hassler.com

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

Recommended