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

Post on 15-Apr-2017

146 views 0 download

Transcript of 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

"Classpath is dead!"

Mark ReinholdJavaOne 2009

3DEVFEST NANTES 16

Classpath Classloader

SuccessionJigsaw

4DEVFEST NANTES 16

Alexis Hassler

Développeur

Formateur

Indépendant

Fondateur

Préparateur de

Classpath

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

6DEVFEST NANTES 16

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

Chercher les classes

CLASSPATH

Hello var = new Hello();

7DEVFEST NANTES 16

-classpath

java -cp hello-lib.jar HelloWorld

8DEVFEST NANTES 16

Erreurs

java.lang.NoClassDefFoundError

java.lang.ClassNotFoundException

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

Class Loader

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

10DEVFEST NANTES 16

java.lang.ClassLoader

loadClass(String name) : Class<?>

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

getParent() : ClassLoader

11DEVFEST NANTES 16

Classloader

sun.misc.Launcher$AppClassLoader CLASSPATH

Hello.class.getClassLoader()

12DEVFEST NANTES 16

Classloader

null

Hello.class.getClassLoader()

.getClass().getClassLoader()

13DEVFEST NANTES 16

Bootstrap Classloader

BootstrapClassLoader

14DEVFEST NANTES 16

Délégation

BootstrapClassLoader

Parent frst

System ClassLoader

15DEVFEST NANTES 16

Délégation

System ClassLoader

java -cp hello-lib.jar ...

16DEVFEST NANTES 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

18DEVFEST NANTES 16

DémonstrationBootstrapClassLoader

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

System ClassLoader

java.lang.Integer

example.jar

java.lang.Integer

19DEVFEST NANTES 16

example.jar

Démonstration

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

BootstrapClassLoader

java.lang.Integer

java.lang.Integer

20DEVFEST NANTES 16

URLClassloader

java.net.URLClassLoader

sun.misc.Launcher$AppClassLoader

URLURLURL

21DEVFEST NANTES 16

URLClassloader

System ClassLoader

Bootstrap ClassLoader

URL ClassLoader

URL ClassLoader

URL ClassLoader

Parentfrst

Parentfrst

Parentfrst

22DEVFEST NANTES 16

DIY Classloader

23DEVFEST NANTES 16

Usages

Application Servers JRebel Javassist, CGLib,...

24DEVFEST NANTES 16

Tomcat

System

Bootstrap

Common

Webapp1

Webapp2

Webapp3

Local First

message-launcher

message-main

message-common

message-printer

message-service

26DEVFEST NANTES 16

Démonstration

message-launcher

message-common

message-printer

message-service

message-service

System ClassLoader ParentFirst ClassLoader

27DEVFEST NANTES 16

Démonstration

message-launcher

message-common

message-printer

message-service

message-service

System ClassLoader LocalFirst ClassLoader

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

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

30DEVFEST NANTES 16

Dépendances

Maven, Gradle,...

31DEVFEST NANTES 16

Dépendances

Classpath

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

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

34DEVFEST NANTES 16

Granularité

SécuritéApache commons-collections

https://foxglovesecurity.com/

Succession

36DEVFEST NANTES 16

Modularité

Dépendance Exposition

Lecture

37DEVFEST NANTES 16

1999

Java embarquéJava SEJava serveur

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

39DEVFEST NANTES 16

OSGi

OS + Hardware

Java Runtime

Module

Life Cycle Services

40DEVFEST NANTES 16

JBoss Modules

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

my.main.module.name

Base de JBoss OSGi

Java SE

41DEVFEST NANTES 16

JBoss Modules

module.xml

resource dependency slot

dependency slot

dependency slot

name slot

resource

resource

42DEVFEST NANTES 16

Jigsaw

9 (2016)8 (2012)

(2017)

Projet

Intégré au JDK 7 (2008)

43DEVFEST NANTES 16

Jigsaw

Modularité du JDK

44DEVFEST NANTES 16

Jigsaw

Modularité des applications// module-info.java

module message.service {

requires java.xml.bind;

requires message.common;

exports fr.sewatech.message;

}

45DEVFEST NANTES 16

Jigsaw

Compilation

javac --module-path modules \

-d target/classes/ \

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

46DEVFEST NANTES 16

Jigsaw

Exécution

java --module-path jigsaw-modules \

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

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

Jigsaw ++

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

49DEVFEST NANTES 16

Classpath mode

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

50DEVFEST NANTES 16

Modular JDK

rt.jar tools.jar

51DEVFEST NANTES 16

Modular JDK

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

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

54DEVFEST NANTES 16

module message.service {

requires message.printer;

requires slf4j.api;

}

Dependencies

Automatic modules slf4j-api-1.5.2.

slf4j.api

message.service

55DEVFEST NANTES 16

Dependencies

Classpath

message.common

message.printer

unnamed

message.service

56DEVFEST NANTES 16

Dependencies

module message.service @ 1.0 {

requires message.printer @ 1.0;

requires slf4j.api @ 1.7;

}

Module version

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

58DEVFEST NANTES 16

Exports

Accessibilitypublicprotectedpackageprivate

inside a module

59DEVFEST NANTES 16

Exports

Accessibilitypublic for other modules

module message.service {

exports fr.sewatech.message;

}

60DEVFEST NANTES 16

Exports

Accessibilitypublic for some modules

module java.base {

exports sun.reflect to

java.logging,

java.sql,

jdk.scripting.nashorn;

}

61DEVFEST NANTES 16

field.setAccessible(true);

Exports

java.lang.reflect.InaccessibleObjectException

Refection

module message.service {

exports private java.security;

}

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

63DEVFEST NANTES 16

Classloader

java.net.URLClassLoader FLTMClassLoader

java.lang.ClassLoader

64DEVFEST NANTES 16

BootClassLoader

bootclasspath

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

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

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

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

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

Jigsaw ++++

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

68DEVFEST NANTES 16

Aller plus haw avec Jigsaw

Service Providers / Loaders

Layers : versioning

jlink : custom JRE

jdeps : migration

...

Quand ?

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

70DEVFEST NANTES 16

Planning

Java SE 9

71DEVFEST NANTES 16

Planning

Outils ?Maven, Gradle, IDE

Livrairies ?SLF4J, Guava,...

Frameworks ?Spring, Hibernate,...

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

72DEVFEST NANTES 16

Essayer...

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

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

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/

74DEVFEST NANTES 16

module-path is born

classpath is NOT dead

Conclusion

76DEVFEST NANTES 16

https://www.sewatech.fr

@AlexisHassler

http://alexis-hassler.com

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