Java 9 Project Jigsaw

Post on 13-Feb-2017

173 views 0 download

transcript

Java 9Project Jigsaw

Rahman Ustarahmanusta@kodcu.com

/rahmanusta/ustarahman

Ben kimim?Java* Trainer and Author.

JCP Expert, Istanbul JUG lead and Adopt a JSR member.

Duke's Choice Award 2015 winner (AsciidocFX).

@javadayistanbul organizer

KonularJigsaw Related Changes

● JEP 200 - The Module JDK● JEP 201 - Modular Source Code● JEP 220 - Modular Run-Time Images● JEP 260 - Encapsulate Most Internal APIs● JEP 261 - Module System● JEP 282 - The Java Linker

The Process API Updates

The Stream API Updates http://openjdk.java.net/projects/jdk9/

Jigsaw projesinin hedefleriMonolitik yapıdan kurtulmak

Java çalışma ortamını esnek yapmak

Daha sağlıklı bir modüler mimari kurmak

Platformun performansını artırmak

Kullanılmaması gerekli API’leri

Monolitik XMonolitik Kernel => Micro Kernel

Monolitik Servisler => Micro Servisler

Monolitik JDK => Modüler JDK

Ölçek ve esneklikSupercomputer

Server

Mac

Embedded Kit

JDK içi kütüphanelercom.sun.*

sun.*

jdk.*

Eski JDK dizin yapısı

Modüler JDK dizin yapısı

Modül nedir ?Birbiri ile alakalı Java paketlerinin bir isim ile gruplanmış halidir.

Örneğin: java.sql, javax.sql ve javax.transaction.xa paketleri bir küme haline getirilerek java.sql modülü oluşturulmuştur.

Erişim sınırlayıcılar (< Java 9)Dil bileşenleri (class, method, field) arası erişilebilirliği tanımlarlar

public

private

protected

package

Erişim sınırlayıcılar (>= Java 9)Dil bileşenleri (module, class, method, field) arası erişilebilirliği tanımlarlar

public ama sadece tanımlı modüle

public ama tüm modüllere

public ama sadece kendi modülüne

private

protected

package

Modüller alanına göre gruplanmış paketler grubudur

Java 9 Standart ModülleriJDK Standart modülleri $JAVA_HOME/jmods dizininde bulunmaktadır.

Modüller arası bağlar #1

Modüller arası bağlar #2java.sql ve java.logging JDK modül detayları

java -listmods:java.sql java -listmods:java.logging

java.util.logging paketi dış erişime açılıyorjava.logging modülüne erişiliyor

Java 9 JDK Modül Ağı

Bir Modül nasıl tanımlanır

DemoKomut satırı üzerinde basit bir Merhaba Dünya uygulaması yapalım

Modüller arası erişim #2

Modüller arası erişim #3

Modüller arası erişim #1

DemoNetBeans IDE ile basit bir Merhaba Dünya örneği yapalım

Görev

Kısa soru

(1) (2)

(3)1) -----------2) -----------3) -----------

Modüller arası dolaylı erişim #1

Modüller arası dolaylı erişim #2

Named modulemodule-info.java kullanılarak tanımlanan modül türüne denir.

Modüller -modulepath içinden yüklenir.

Örnek: java -modulepath lib/abc-1.0.jar

Automatic ModuleElimizde Java 6 ile paketlenmiş cde-1.0.jar adlı kütüphane var diyelim.

Kısa soruEğer gson-2.7.jar dosyası --module-path’e eklenirse, modül adı ne olur?

java -modulepath=lib/gson-2.7.jar

Unnamed Module

jmodjmod biçimindeki modüler arşiv dosyaları üzerinde işlemler sunar.

cd $JAVA_HOME

jmod list java.httpclient.jmod (Sınıfları listeler)

jmod describe java.httpclient.jmod (Modüler bağı listeler)

Yeni Parametreler--module-path, -modulepath

Modüllerin hangi dizinde olduğu seçilir

--add-modules, -addmods

Hangi modüllerin kök modül olduğunu seçer

--limit-modules

Gerekli olmayan modüllerin süzülmesi içindir

-listmods

Java 9 Compact ProfilesAmacı sık tercih edilen Java API’lerini gruplamaktır.

Modüler Runtime Images

Demojlink aracıyla modüler imajlar oluşturalım

Modüllere göre Java Runtime boyutlarıjava.se.ee => 84 MB

java.se => 70 MB

java.desktop => 63 MB

java.compact3 => 47 MB

java.compact2 => 42 MB

java.compact1 => 31 MB

* Değerler üretilirken sıkıştırılma uygulanmamıştır.

Mevcut uygulamanızın Java 9’a taşınması

Eğer N bir Java versiyonu ise;

Uygulamanız standart paketleri kullandıysa;● N versiyonda çalışan N + 1 versiyonda da çalışır.

Uygulamanız JDK özel paketleri kullandıysa;● N versiyonda çalışan N + 1 versiyonda çalışmayabilir.● Eğer çalışmazsa;

https://wiki.openjdk.java.net/display/JDK8/Java+Dependency+Analysis+Tool

Meşhur sun.misc.Unsafe

jdeps ile bağımlılık analizijdeps bir modül veya jar içindeki bağımlılık ilişkisini çıktılar

jdeps hello.jar

jdeps -jdkinternals hello.jar

Eğer var ise uygulamanızın kullandığı JDK içi kullanımları listeler

Mevcut uygulamanızın Java 9’da çalışması$ jdeps -jdkinternals AsciidocFX-1.4.7.jar

AsciidocFX-1.4.7.jar -> JDK removed internal APIAsciidocFX-1.4.7.jar -> javafx.graphics com.kodcu.comp.ViewPanel -> com.sun.javafx.*.ContextMenuContent JDK internal API (JDK removed internal API) com.kodcu.comp.ViewPanel -> com.sun.javafx.*.ContextMenuContent$MenuItemContainer JDK internal API (JDK removed internal API) com.kodcu.comp.AppController -> com.sun.javafx.*.StageHelper JDK internal API (javafx.graphics)

Warning: JDK internal APIs are unsupported and private to JDK implementation that are subject to be removed or changed incompatibly and could break your application.Please modify your code to eliminate dependency on any JDK internal APIs.For the most recent update on JDK internal API replacements, please check:https://wiki.openjdk.java.net/display/JDK8/Java+Dependency+Analysis+Tool

Process API GüncellemeleriProcess API, bir işletim sistemi process’ini yönetmeyi sağlar. Artık daha fazla ek bilgi sunuyor!

● Process’e ait PID öğrenme● Process’i hangi işletim sistemi kullanıcısının çalıştırdığı● Process’in çalıştırıldığı komut ve parameteler● Process’in çalışma başladığı ve geçen süre

PID’e erişelimProcessBuilder command = new ProcessBuilder().command("calc");Process process = command.start();long pid = process.getPid();

ProcessHandleProcess API, yeni özelliklerini ProcessHandle üzerinden sunuyor.

ProcessHandle processHandle = …

long pid = processHandle.getPid(); ProcessHandle.Info info = processHandle.info();Optional<String> command = info.command();Optional<String[]> arguments = info.arguments();Optional<Instant> startInstant = info.startInstant();Optional<Duration> totalCpuDuration = info.totalCpuDuration();Optional<String> user = info.user();

ProcessHandle nasıl elde edilir?Process process= …

ProcessHandle handle1= process.toHandle();

ProcessHandle handle2= ProcessHandle.current();

Optional<ProcessHandle> handle3 = ProcessHandle.of(7865);

Stream<ProcessHandle> handle4= ProcessHandle.allProcesses();

GörevYeni Process API kullanarak bir Görev Yöneticisi aracı yazınız.

Görev yöneticisi, listeleme ve istenilen işletim process’ini durdurmaya imkan vermelidir.

Stream API değişiklikleriStream#iterate

Stream#takeWhile

Stream#dropWhile

Stream API ile iterasyonStream.iterate(1, t -> t <= 10, t -> t + 1) .forEach(System.out::println);

args[0] => başlangı değeri args[1] => şartargs[2] => yeni değer üreten fonksiyon

Stream API ile infinite streamStream.iterate(1, t -> t + 1) .forEach(System.out::println);

args[0] => başlangı değeri args[2] => yeni değer üreten fonksiyon

Stream#takeWhileBir stream’de başlangıç noktasından belirlenen noktaya kadar elemanlardan yeni bir stream üretir.

Stream<Integer> oneToTen = Stream.iterate(1, t -> t <= 10, t -> t + 1);

oneToHundred .takeWhile(t -> t <= 4)

.forEach(System.out::println); ??

Stream#dropWhileBir stream’de belirlenen bir noktadan stream son noktasına kadar elemanlardan yeni bir stream üretir.

Stream<Integer> oneToTen = Stream.iterate(1, t -> t <= 10, t -> t + 1);

oneToHundred .dropWhile(t -> t <= 4)

.forEach(System.out::println); ??

Teşekkürler