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 gedauertProblem 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 greetingsappErzeugt 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