lyonjug : comment jigsaw est prêt à tuer le classpath

Post on 17-Jan-2017

76 Views

Category:

Technology

3 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Alexis Hassler

Jigsaw est prêt à tuer le

classpath

octobre 2016

"Classpath is dead!"

Mark ReinholdJavaOne 2009

ClasspathClassloader

Mort ?

Succession

Alexis Hassler

Développeur

Formateur

Indépendant

Fondateur

Préparateur de

Classpath

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

MyStuff var;

Chercher les classes

CLASSPATH

-classpath

java -cp hello-lib.jar HelloWorld

Manifest

Manifest-Version: 1.0

Class-Path: hello-lib.jar

Main-Class: HelloWorld

Connaître le classpath

System.getProperty("java.class.path");

Erreurs

java.lang.NoClassDefFoundError

java.lang.ClassNotFoundException

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

Classloader

Classpath

Géré par des classloaders

java.lang.ClassLoader

loadClass(String name) : Class<?>

getResource(String name) : URLgetResources(String name) : Enumeration<URL>getResourceAsStream(String name) : InputStream

getParent() : ClassLoader

Classloader

sun.misc.Launcher$AppClassLoader

CLASSPATH

MyStuff.class.getClassLoader()

Bootstrap Classloader

null

classloader.getClass().getClassLoader()

Bootstrap Classloader

BootstrapClassLoader

ExtensionClasspath

sun.misc.Launcher$ExtClassLoader

sun.misc.Launcher$AppClassLoader

Délégation

BootstrapClassLoader

Parentfirst

Parent first

System ClassLoader

Extension ClassLoader

Délégation

java -cp hello-lib.jar ...

System.getProperty("java.class.path");

ClasspathSystem ClassLoader

Délégation

java -Djava.ext.dirs=~/.java8/ext ...

System.getProperty("java.ext.dirs");

ExtensionExtension ClassLoader

Délégation

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

BootstrapClassLoader

System.getProperty("sun.boot.class.path");

bootclasspath

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

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

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

Endorsed

!= Extension

Endorsed

java -Djava.endorsed.dirs=~/.java8/endorsed ...

Endorsed

BootstrapClassLoader

Endorsed

APIs standards hors JCPorg.omg (CORBA), org.w3c.dom, org.xml.sax (XML)

APIs standaloneJAXP, JAXB, Scripting, Compiler API,...

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

example.jar

DémonstrationBootstrapClassLoader

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

System ClassLoader

java.lang.Integer

example.jar

DémonstrationBootstrapClassLoader

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

java.lang.Integer

URLClassloader

java.net.URLClassLoader

sun.misc.Launcher$AppClassLoader

sun.misc.Launcher$ExtClassLoader

URLURLURL

URLClassloader

System ClassLoader

Bootstrap ClassLoader

URL ClassLoader

URL ClassLoader

URL ClassLoader

Parentfirst

Parentfirst

Parentfirst

message-launcher

message-main

message-common

message-printer

message-service

Démonstration

java -cp service.jar:launcher.jar fr.sewatech.classpath.Hello

message-launcher

message-main

message-common

message-printer

message-service

message-launcher

message-common

message-printer

message-service

Démonstration

java -cp service.jar:launcher.jar fr.sewatech.classpath.HelloViaUrl

message-serviceClasspath

UR

LC

lassload

er

Démonstration

message-launcher

message-common

message-printer

message-service

message-service

System ClassLoader ParentFirst ClassLoader

FLTM Classloader

Fait Le Toi-Même

Usages

Application Servers

JRebel

Javassist, CGLib,...

Tomcat

System

Bootstrap

Common

Webapp1

Webapp2

Webapp3

Local First

JBoss AS 5

System

Bootstrap

Common

Web App

Ent App

Web Module

EJB Module

Local First

Repo First

Erreurs

ClassCastException

org.project.SomeStuff cannot be cast to

org.project.SomeStuff

Erreurs

URL ClassLoader

URL ClassLoader

MyStuff var = MyStuffFactory.build();

return new MyStuff() ;

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

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

Runtime

ClasspathA plat

Fichiers jarjuste du stockage

pas ou peu de métadonnée

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

OSGi

BundleFichier jar

META-INF/MANIFEST.MF

Import / export de packages

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

OSGi

OS + Hardware

Java Execution Environment

Applications(bundles)

Module

Life Cycle

Services

JBoss Modules

Sous-projet de Wildfy

Inspiré de Jigsaw (version 2010)

Base de JBoss OSGi

JBoss Modules

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

my.main.module.name

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

<?xml version="1.0" encoding="UTF-8"?>

<module xmlns="urn:jboss:module:1.1" name="org.hibernate">

<resources>

<resource-root path="hibernate-core-4.0.0.Final.jar"/>

<resource-root path="hibernate-commons-annotations-4.0.1.Final.jar"/>

<resource-root path="hibernate-entitymanager-4.0.0.Final.jar"/>

</resources>

...

</module>

<?xml version="1.0" encoding="UTF-8"?>

<module xmlns="urn:jboss:module:1.1" name="org.hibernate">

...

<dependencies>

<module name="javax.api"/>

<module name="javax.persistence.api"/>

<module name="javax.transaction.api"/>

<module name="org.apache.commons.collections"/>

<!-- ... -->

</dependencies>

</module>

JBoss Modules

JBoss Modules

<?xml version="1.0" encoding="UTF-8"?>

<module xmlns="urn:jboss:module:1.1"

name="fr.sewatech.message-launcher">

<main-class name="fr.sewatech.classpath.Hello"/>

...

</module>

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

JBoss Modules

Artefacts ≠ ModulesNotions différentes

Build diffcileMauvaise intégration aux outils

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

Demo

Source codehttp://github.com/hasalex/classpath-demo

JDK 99-ea+138-jigsaw-nightly-h5561-20161003

Demo

Mavenmaven-compiler-plugin:3.6-jigsaw-SNAPSHOT

org.ow2.asm:asm:6.0_ALPHA

plexus-compiler-api:2.8.2-SNAPSHOT

plexus-compiler-manager:2.8.2-SNAPSHOT

plexus-compiler-javac:2.8.2-SNAPSHOT

Demo

IDEJetbrains IDEA

Eclipse

Netbeans

Specifcations

JSR 376: Java Platform Module System

JSR 379:

Java SE 9

Specifcations

JEPsJEP 261: Module System

JEP 200: The Modular JDK

JEP 260: Encapsulate Most Internal APIs

JEP 201: Modular Source Code

JEP 220: Modular Run-Time Images

JEP 282: jlink: The Java Linker

Modular JDK

rt.jar tools.jar

Modular JDK

Modular JDK

Standard APIsjava.*, javax.*

Supported APIscom.sun.*,jdk.*

UnsupportedAPIs

sun.*sun.misc.Unsafe, sun.misc.BASE64Decoder,sun.misc.BASE64Encoder

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

Classpath mode

Classpath is NOT dead

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

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

Dependencies

module message.service {

requires message.printer;

requires message.common;

}

message.service

message.printer

message.common

Dependencies

module message.service {

requires message.printer;

}module message.printer {

requires transitive message.common;

}

message.service

message.printer

message.common

Dependencies

Automatic modules

module message.service {

requires slf4j.api;

}

message.service

slf4j.api

slf4j-api-1.5.2.

Dependencies

Classpath

message.service message.printer

message.common

unnamed

Dependencies

OptionalRequired at compile time

module message.service {

requires static message.printer;

}

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;

}

Encapsulation vs RefectionsetAccessible(true)

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

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

Classloader

Java SE

ModulesPlatformClassLoader

AppClassLoader

BootClassLoader

jdk.internal.loader.ClassLoaders$...

Classloader

jdk.internal.loader.BuiltinClassLoader

AppClassLoader

PlatformClassLoader

BootClassLoader

Classloader

Fait Le Toi-Même

java.net.URLClassLoader

FLTMClassLoader

Classloader

java -Djava.endorsed.dirs=~/.java8/endorsed ...

BootClassLoader

Classloader

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

BootClassLoader

System.getProperty("sun.boot.class.path");

Patch

Compile

javac -Xmodule:java.base \

-d ../patch-classes \

src/java/lang/Integer.java

Patch

Run

java --patch-module java.base=../patch-classes \

--module-path jigsaw-modules \

-m misc.examples

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

Layers

No Version

module message.service @ 1.0 {

requires message.printer @ 1.0;

requires slf4j.api @ 1.7;

}

Layers

Highlander rule #1

« There Can BeOnly One »

slf4j.api

Layers

org.slf4j

slf4j.other

org.slf4j

Layers

Boot Layer

App Loader Platform Loader Boot Loader

message.service slf4j.api java.basejava.xml.bind

Java Module System

Java Virtual Machine

Layers

Boot Layer

Java Module System

Java Virtual Machine

Quand ?

Planning

Java SE 9Septembre 2017

Planning

Outils ?Maven, Gradle, IDE

Livrairies ?

Runtimes ?Java EE, Tomcat,...

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/

@AlexisHassler

http://alexis-hassler.com

http://sewatech.fr

top related