Soft-Shake 2016 : Jigsaw est prêt à tuer le classpath

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

Transcript of Soft-Shake 2016 : Jigsaw est prêt à tuer le classpath

Alexis Hassler

Jigsaw est prêt à tuer le

classpath

octobre 2016

"Classpath is dead!"

Mark ReinholdJavaOne 2009

ClasspathClassloader

Mort ?

SuccessionJigsaw

Alexis Hassler

Développeur

Formateur

Indépendant

Fondateur

Préparateur de

Classpath

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

Chercher les classes

CLASSPATH

Hello var = new Hello();

-classpath

java -cp hello-lib.jar HelloWorld

Erreurs

java.lang.NoClassDefFoundError

java.lang.ClassNotFoundException

Classloader

java.lang.ClassLoader

loadClass(String name) : Class<?>

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

getParent() : ClassLoader

Classloader

sun.misc.Launcher$AppClassLoader

CLASSPATH

Hello.class.getClassLoader()

Classloader

null

Hello.class.getClassLoader()

.getClass().getClassLoader()

Bootstrap Classloader

BootstrapClassLoader

Délégation

BootstrapClassLoader

Parent first

System ClassLoader

Délégation

java -cp hello-lib.jar ...

System ClassLoader

BootstrapClassLoader

bootclasspath

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

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

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

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

DémonstrationBootstrapClassLoader

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

System ClassLoader

java.lang.Integer

example.jar

java.lang.Integer

example.jar

Démonstration

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

java.lang.Integer

BootstrapClassLoader

java.lang.Integer

URLClassloader

java.net.URLClassLoader

sun.misc.Launcher$AppClassLoader

URLURLURL

URLClassloader

System ClassLoader

Bootstrap ClassLoader

URL ClassLoader

URL ClassLoader

URL ClassLoader

Parentfirst

Parentfirst

Parentfirst

FLTM Classloader

Fait Le Toi-Même

Usages

Application Servers

JRebel

Javassist, CGLib,...

Tomcat

System

Bootstrap

Common

Webapp1

Webapp2

Webapp3

Local First

message-launcher

message-main

message-common

message-printer

message-service

Démonstration

message-launcher

message-common

message-printer

message-service

message-service

System ClassLoader ParentFirst ClassLoader

Démonstration

message-launcher

message-common

message-printer

message-service

message-service

System ClassLoader LocalFirst ClassLoader

Mort ?

http://www.ironmaidenwallpaper.com/

Dépendances

Maven, Gradle,...

Dépendances

Classpath

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

Démonstration

slf4j-api 1.5.11

slf4j-api 1.7.2

message-launcher

message-main

message-common

message-printer

message-service

Granularité

SécuritéApache commons-collections

https://foxglovesecurity.com/

Succession

Modularité

Dépendance

Exposition

Lecture

1999

Java embarquéJava SEJava serveur

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

Bundle

OSGi

OS + Hardware

Java Runtime

Module

Life Cycle Services

JBoss Modules

Sous-projet de

Inspiré de Jigsaw (version 2010)

Base de JBoss OSGi

JBoss Modules

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

my.main.module.name

WildFly / JBoss EAP

Java SE

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

JBoss Modules

module.xml

resource

resource

resource

dependency slot

dependency slot

dependency slot

name slot

Jigsaw

Projet OpenJDK

Intégré au JDK 7 (2008)

9 (2016)

8 (2012)

(2017)

Jigsaw

Modularité du JDK

Corba pour Hello World ?

Swing pour Tomcat ?

Jigsaw

Modularité des applicationsmodule-info.java

module message.service {

requires java.xml.bind;

requires message.common;

exports fr.sewatech.message;

}

Jigsaw

Compilation

javac --module-path modules \

-d target/classes/ \

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

Jigsaw

Exécution

java --module-path jigsaw-modules \

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

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

Jigsaw ++

Classpath mode

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

Modular JDK

rt.jar tools.jar

Modular JDK

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

Dependencies

module message.service {

requires message.printer;

requires slf4j.api;

}module message.printer {

requires transitive message.common;

}

message.service

message.printer

message.common

module message.service {

requires message.printer;

requires slf4j.api;

}

Dependencies

Automatic modules

message.service

slf4j.api

slf4j-api-1.5.2.

Dependencies

Classpath

message.service message.printer

message.common

unnamed

Dependencies

module message.service @ 1.0 {

requires message.printer @ 1.0;

requires slf4j.api @ 1.7;

}

Module version

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

Exports

Java accessibilitypublic

protected

package private

private

inside a module

Exports

Java accessibilitypublic for other modules

module message.service {

exports fr.sewatech.message;

}

Exports

Java accessibilitypublic for some modules

module java.base {

exports sun.reflect to

java.logging,

java.sql,

jdk.scripting.nashorn;

}

Exports

module message.service {

exports private java.security;

}

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

Refection

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

Classloader

java.net.URLClassLoader FLTMClassLoader

java.lang.ClassLoader

BootClassLoader

bootclasspath

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

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

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

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

Aller plus haw avec Jigsaw

Service Providers / Loaders

Versioning / Layers

Custom JRE : jlink

Migration : jdeps

...

Quand ?

Planning

Java SE 927 juillet 2017

Planning

Outils ?Maven, Gradle, IDE

Livrairies ?

Runtimes ?Java EE, Tomcat,...

Hadoop,...

Essayer...

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

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

Dernières évolutions de Jigsaw

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/

module-path is born

classpath is NOT dead

Conclusion

@AlexisHassler

http://alexis-hassler.com

https://www.sewatech.fr