Mittwoch, 12. Oktober 2016

Java 9 am Horizont

Java 9

New Version Scheme: MAJOR.MINOR.SECURITY
--> keine "1.8u102" mehr, sondern "8.102.5"

keine rt.jar und tools.jar

jrt-fs.jar -> nötig um Klassen in neuen Java Modulen zu finden. Gibt es in Java 8 + 9

jdeps -jdkinternals [-apionly] my.jar --> prüft ob interne apis verwendet werden, ist in 9 nicht mehr erlaubt
sun.misc.*, sun.reflect* --> removed or moved to sun.misc.Unsafe

G1 is default GC
Unified GC Logging und alte Flags wurden gemapped auf neue Flags
GC mit alten depricateden Flags von Java8 läuft in 9 nicht mehr

VM Flag
java.ext.dirs in java8 deprecated, in 9 dropped

Security/Crypt Changes: see Oracle JRE and JDK Cryptographic Roadmap

Code Check for JDK9
openjdk.java.net/ JDK-9 Outreach

jdeps


Abhängigkeiten zu Modulen:

./jdeps -s ../lib/ant-javafx.jar

Abhängigkeiten zu Klassen

./jdeps -v ../lib/ant-javafx.jar

Abhängigkeiten zu Packages

./jdeps -verbose:package ../lib/ant-javafx.jar

Abhängigkeiten zu internen Klassen (smelly!)

./jdeps -jdkinternals ../lib/ant-javafx.jar

Welche Pakete gehören zu welchen Profilen? ( wie kompakt kann die JRE sein, um diesen Code auszuführen )
./jdeps -P ../lib/ant-javafx.jar

Wie groß ist ein Profil?
./jdeps --check java.compact1
./jdeps --check java.compact2
./jdeps --check java.compact3


./jdeps --generate-module-info . ../jrt-fs.jar
cat jrt.fs/module-info.java
    module jrt.fs {
        exports jdk.internal.jimage;
        exports jdk.internal.jimage.decompressor;
        exports jdk.internal.jrtfs;
        provides java.nio.file.spi.FileSystemProvider with jdk.internal.jrtfs.JrtFileSystemProvider;
    }

Jigsaw

Code aufräumen, strukturieren, hat 8 Jahre gedauert

Problem java.lang.Object --> toString --> java.lang.String --> java.util.regex --..-->
-> Wo macht man den Schnitt ?

Java Modules bringt:
Skalierbarkeit
Sicherheit
Performance

Naming nach reverse.domain.name pattern empfohlen, packages eine Ebene unter module
Versionen SOLLTEN nicht in modul-namen enthalten sein
module-info.java kann aber beliebig um weitere Informationen erweitert werden.
Konkret kann eine jar auch mit Versionsinfo erzeugt werden über jar-Kommando

Lösung für Module in unterschiedlichen Versionen im Module-Path: Verschiedene Layer des Module-Loaders

Neben Module noch modular jars ( eine jar + module-info.class )

Es gibt einen Module-Path (Reihe von Verzeichnissen mit Modulen), dort liegen alle Module. Java löst alle Abhängigkeiten eines Moduls im Modulepath auf und erzeugt so den Classpath
Module-Path und Classpath mischen geht

Abhängigkeit weiterreichen ( reexportieren ): requires public <package-name>

Services

    Modul provides <implementierung> über <interface>
Services-Consumer-Modul
    uses <interface>

?? was ist mit zwei Service Implementierungen im module path?
noch in klärung

UnnamedModule: - Alle Klassen eines Classpath sind über das UnnamedModule exportiert, Backwards Compatibility

Live:


Jigsaw runterladen unter
https://jdk9.java.net/jigsaw/
 
1 Module
./javac -d modules/com.greetings src/com.greetings/module-info.java src/com.greetings/com/greetings/Main.java
./java --module-path modules -m com.greetings/com.greetings.Main

2 Modules
./javac -d modules2/org.astro src2/org.astro/module-info.java src2/org.astro/org/astro/World.java
./javac --module-path modules2 -d modules2/com.greetings src2/com.greetings/module-info.java src2/com.greetings/com/greetings/Main.java
./java --module-path modules2 -m com.greetings/com.greetings.Main

Packaging

./jar --create --file=mlib/org.astro@1.0.jar --module-version=1.0 -C modules2/org.astro .
./jar --create --file=mlib/com.greetings.jar --main-class=com.greetings.Main -C modules2/com.greetings .
./java -p mlib -m com.greetings

./jar --print-module-descriptor --file=mlib/org.astro@1.0.jar

jlink

./jlink --module-path /home/danny/dev/java/jdk-9/jmods:mlib --add-modules com.greetings --output greetingsapp

Erzeugt images aus JRE + module. Alle Abhängigkeiten der Module werden aufgelöst und das Image erzeugt

Erzeugt eine Applikation mit Verzeichnissen bin/ conf/ lib/

?? Wie wird die Main-Class für das Start-Script in bin/ ermittelt?
muss man angeben bei der module-erzeugung
bei der jlink erzeugung? .. möglicherweise auch

jlink kann die abhängigkeiten noch compressen ( ca. 33% kleiner bei sample app )

beispiele: openjdk.java.net/projects/jigsaw/quick-start

Ausblick

Gradle 3.0 "will" Java9 komplett unterstützen