Java 9 Project Jigsaw

51
Java 9 Project Jigsaw Rahman Usta [email protected] /rahmanusta /ustarahman

Transcript of Java 9 Project Jigsaw

Page 1: Java 9 Project Jigsaw

Java 9Project Jigsaw

Rahman [email protected]

/rahmanusta/ustarahman

Page 2: Java 9 Project Jigsaw

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

Page 3: Java 9 Project Jigsaw

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/

Page 4: Java 9 Project Jigsaw

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

Page 5: Java 9 Project Jigsaw

Monolitik XMonolitik Kernel => Micro Kernel

Monolitik Servisler => Micro Servisler

Monolitik JDK => Modüler JDK

Page 6: Java 9 Project Jigsaw

Ölçek ve esneklikSupercomputer

Server

Mac

Embedded Kit

Page 7: Java 9 Project Jigsaw

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

sun.*

jdk.*

Page 8: Java 9 Project Jigsaw

Eski JDK dizin yapısı

Page 9: Java 9 Project Jigsaw

Modüler JDK dizin yapısı

Page 10: Java 9 Project Jigsaw

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.

Page 11: Java 9 Project Jigsaw

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

Page 12: Java 9 Project Jigsaw

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

Page 13: Java 9 Project Jigsaw

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

Page 14: Java 9 Project Jigsaw

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

Page 15: Java 9 Project Jigsaw

Modüller arası bağlar #1

Page 16: Java 9 Project Jigsaw

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

Page 17: Java 9 Project Jigsaw

Java 9 JDK Modül Ağı

Page 18: Java 9 Project Jigsaw

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

Page 19: Java 9 Project Jigsaw

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

Page 20: Java 9 Project Jigsaw

Modüller arası erişim #2

Page 21: Java 9 Project Jigsaw

Modüller arası erişim #3

Page 22: Java 9 Project Jigsaw

Modüller arası erişim #1

Page 23: Java 9 Project Jigsaw

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

Page 24: Java 9 Project Jigsaw

Görev

Page 25: Java 9 Project Jigsaw

Kısa soru

(1) (2)

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

Page 26: Java 9 Project Jigsaw

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

Page 27: Java 9 Project Jigsaw

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

Page 28: Java 9 Project Jigsaw

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

Page 29: Java 9 Project Jigsaw

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

Page 30: Java 9 Project Jigsaw

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

Page 31: Java 9 Project Jigsaw

Unnamed Module

Page 32: Java 9 Project Jigsaw

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)

Page 33: Java 9 Project Jigsaw

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

Page 34: Java 9 Project Jigsaw

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

Page 35: Java 9 Project Jigsaw

Modüler Runtime Images

Page 36: Java 9 Project Jigsaw

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

Page 37: Java 9 Project Jigsaw

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.

Page 38: Java 9 Project Jigsaw

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

Page 39: Java 9 Project Jigsaw

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

Page 40: Java 9 Project Jigsaw

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

Page 41: Java 9 Project Jigsaw

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

Page 42: Java 9 Project Jigsaw

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

Page 43: Java 9 Project Jigsaw

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();

Page 44: Java 9 Project Jigsaw

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();

Page 45: Java 9 Project Jigsaw

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.

Page 46: Java 9 Project Jigsaw

Stream API değişiklikleriStream#iterate

Stream#takeWhile

Stream#dropWhile

Page 47: Java 9 Project Jigsaw

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

Page 48: Java 9 Project Jigsaw

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

Page 49: Java 9 Project Jigsaw

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); ??

Page 50: Java 9 Project Jigsaw

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); ??

Page 51: Java 9 Project Jigsaw

Teşekkürler