CHEN Ge CSIS, HKU March 9, 2000. Jigsaw W3C’s Java Web Server.
Java 9 Project Jigsaw
-
Upload
rahman-usta -
Category
Engineering
-
view
177 -
download
0
Transcript of 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
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