SlideShare a Scribd company logo
Java 9
Project Jigsaw
Rahman Usta
rahmanusta@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
Konular
Jigsaw 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 hedefleri
Monolitik 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 X
Monolitik Kernel => Micro Kernel
Monolitik Servisler => Micro Servisler
Monolitik JDK => Modüler JDK
Ölçek ve esneklik
Supercomputer
Server
Mac
Embedded Kit
JDK içi kütüphaneler
com.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ülleri
JDK Standart modülleri $JAVA_HOME/jmods dizininde bulunmaktadır.
Modüller arası bağlar #1
Modüller arası bağlar #2
java.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
Demo
Komut 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
Demo
NetBeans 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 module
module-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 Module
Elimizde Java 6 ile paketlenmiş cde-1.0.jar adlı kütüphane var diyelim.
Kısa soru
Eğer gson-2.7.jar dosyası --module-path’e eklenirse, modül adı ne olur?
java -modulepath=lib/gson-2.7.jar
Unnamed Module
jmod
jmod 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 Profiles
Amacı sık tercih edilen Java API’lerini gruplamaktır.
Modüler Runtime Images
Demo
jlink 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+Depen
dency+Analysis+Tool
Meşhur sun.misc.Unsafe
jdeps ile bağımlılık analizi
jdeps 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 API
AsciidocFX-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üncellemeleri
Process 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şelim
ProcessBuilder command = new ProcessBuilder().command("calc");
Process process = command.start();
long pid = process.getPid();
ProcessHandle
Process 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örev
Yeni 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şiklikleri
Stream#iterate
Stream#takeWhile
Stream#dropWhile
Stream API ile iterasyon
Stream.iterate(1, t -> t <= 10, t -> t + 1)
.forEach(System.out::println);
args[0] => başlangı değeri
args[1] => şart
args[2] => yeni değer üreten fonksiyon
Stream API ile infinite stream
Stream.iterate(1, t -> t + 1)
.forEach(System.out::println);
args[0] => başlangı değeri
args[2] => yeni değer üreten fonksiyon
Stream#takeWhile
Bir 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#dropWhile
Bir 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

More Related Content

PDF
Java EE Nedir? (Baku JUG)
PDF
Kurumsal Java & Web Teknolojileri
PDF
Gradle ile Proje Insası
PPS
Jigsaw Teaser
PPTX
The Jigsaw Team
PDF
BUSINESS MODEL JIGSAW GAME: Use a Jigsaw Board to Rapidly Visualize, Prototyp...
DOCX
Brand Management - Royal Enfield
PPTX
Komut satırı JAVA
Java EE Nedir? (Baku JUG)
Kurumsal Java & Web Teknolojileri
Gradle ile Proje Insası
Jigsaw Teaser
The Jigsaw Team
BUSINESS MODEL JIGSAW GAME: Use a Jigsaw Board to Rapidly Visualize, Prototyp...
Brand Management - Royal Enfield
Komut satırı JAVA

Similar to Java 9 Project Jigsaw (20)

PDF
Radore Workshop: Wordpress Nereye Koşuyor?
PPTX
Symfony2 ve Doctrine ile PostgreSQL'i Kullanarak Performanslı Mimari Oluşturma
PDF
Django Introduction
PDF
İleri Seviye T-SQL Programlama - Chapter 11
PDF
ders bilgi
PDF
Android mimari-cekirdek-binding-scheduler
PPTX
Bilge Adam İzmir - Gokhan Sipahi - Robotic Programming with Netduino
PDF
C sharp-indir
PPTX
Nedir Bu Java ?
PPTX
Visual Studio Developer Tools
PDF
Solarwinds SAM ve Patch Manager
PPTX
Oracle Weblogic Server
PPTX
JVM Tuning and Monitoring, JVM Languages, IDE
PDF
Openbravo Gelişmiş Depo Operasyonları - Wiki
PDF
React.js Web Programlama
PDF
Sql egitimi-kadikoy
PPTX
System Center 2012 Ürün Ailesi Yenilikleri ve Uçtan Uca Yönetimi
PDF
Akıllı Otopark Sistemi
ODP
IBM Lotusphere İsdemir Portal
PPTX
Weblogic performance tips&tricks
Radore Workshop: Wordpress Nereye Koşuyor?
Symfony2 ve Doctrine ile PostgreSQL'i Kullanarak Performanslı Mimari Oluşturma
Django Introduction
İleri Seviye T-SQL Programlama - Chapter 11
ders bilgi
Android mimari-cekirdek-binding-scheduler
Bilge Adam İzmir - Gokhan Sipahi - Robotic Programming with Netduino
C sharp-indir
Nedir Bu Java ?
Visual Studio Developer Tools
Solarwinds SAM ve Patch Manager
Oracle Weblogic Server
JVM Tuning and Monitoring, JVM Languages, IDE
Openbravo Gelişmiş Depo Operasyonları - Wiki
React.js Web Programlama
Sql egitimi-kadikoy
System Center 2012 Ürün Ailesi Yenilikleri ve Uçtan Uca Yönetimi
Akıllı Otopark Sistemi
IBM Lotusphere İsdemir Portal
Weblogic performance tips&tricks
Ad

Java 9 Project Jigsaw

  • 1. Java 9 Project Jigsaw Rahman Usta rahmanusta@kodcu.com /rahmanusta/ustarahman
  • 2. 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
  • 3. Konular Jigsaw 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/
  • 4. Jigsaw projesinin hedefleri Monolitik 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
  • 5. Monolitik X Monolitik Kernel => Micro Kernel Monolitik Servisler => Micro Servisler Monolitik JDK => Modüler JDK
  • 8. Eski JDK dizin yapısı
  • 10. 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.
  • 11. 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
  • 12. 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
  • 13. Modüller alanına göre gruplanmış paketler grubudur
  • 14. Java 9 Standart Modülleri JDK Standart modülleri $JAVA_HOME/jmods dizininde bulunmaktadır.
  • 16. Modüller arası bağlar #2 java.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
  • 17. Java 9 JDK Modül Ağı
  • 18. Bir Modül nasıl tanımlanır
  • 19. Demo Komut satırı üzerinde basit bir Merhaba Dünya uygulaması yapalım
  • 23. Demo NetBeans IDE ile basit bir Merhaba Dünya örneği yapalım
  • 25. Kısa soru (1) (2) (3) 1) ----------- 2) ----------- 3) -----------
  • 28. Named module module-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
  • 29. Automatic Module Elimizde Java 6 ile paketlenmiş cde-1.0.jar adlı kütüphane var diyelim.
  • 30. Kısa soru Eğer gson-2.7.jar dosyası --module-path’e eklenirse, modül adı ne olur? java -modulepath=lib/gson-2.7.jar
  • 32. jmod jmod 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)
  • 33. 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
  • 34. Java 9 Compact Profiles Amacı sık tercih edilen Java API’lerini gruplamaktır.
  • 36. Demo jlink aracıyla modüler imajlar oluşturalım
  • 37. 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.
  • 38. 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+Depen dency+Analysis+Tool Meşhur sun.misc.Unsafe
  • 39. jdeps ile bağımlılık analizi jdeps 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
  • 40. Mevcut uygulamanızın Java 9’da çalışması $ jdeps -jdkinternals AsciidocFX-1.4.7.jar AsciidocFX-1.4.7.jar -> JDK removed internal API AsciidocFX-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
  • 41. Process API Güncellemeleri Process 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
  • 42. PID’e erişelim ProcessBuilder command = new ProcessBuilder().command("calc"); Process process = command.start(); long pid = process.getPid();
  • 43. ProcessHandle Process 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();
  • 44. 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();
  • 45. Görev Yeni 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.
  • 47. Stream API ile iterasyon Stream.iterate(1, t -> t <= 10, t -> t + 1) .forEach(System.out::println); args[0] => başlangı değeri args[1] => şart args[2] => yeni değer üreten fonksiyon
  • 48. Stream API ile infinite stream Stream.iterate(1, t -> t + 1) .forEach(System.out::println); args[0] => başlangı değeri args[2] => yeni değer üreten fonksiyon
  • 49. Stream#takeWhile Bir 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); ??
  • 50. Stream#dropWhile Bir 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); ??