Modulariti di Java 9: ​​Menyusun dengan Project Jigsaw, Penrose, dan OSGi

Artikel ini memberikan gambaran umum mengenai cadangan, spesifikasi, dan platform yang bertujuan menjadikan teknologi Java lebih modular di Java 9. Saya akan membincangkan faktor-faktor yang menyumbang kepada keperluan untuk seni bina Java yang lebih modular, menerangkan secara ringkas dan membandingkan penyelesaian yang telah diusulkan, dan memperkenalkan tiga kemas kini modulariti yang direncanakan untuk Java 9, termasuk potensi dampaknya terhadap pembangunan Java.

Mengapa kita memerlukan modulariti Java?

Modulariti adalah konsep umum. Dalam perisian, ini berlaku untuk menulis dan mengimplementasikan program atau sistem pengkomputeran sebagai sejumlah modul unik, dan bukan sebagai reka bentuk monolitik tunggal. Antaramuka standard kemudian digunakan untuk membolehkan modul berkomunikasi. Membahagikan persekitaran konstruk perisian ke dalam modul yang berbeza membantu kita meminimumkan gandingan, mengoptimumkan pengembangan aplikasi, dan mengurangkan kerumitan sistem.

Modulariti membolehkan pengaturcara melakukan pengujian fungsi secara terpisah dan terlibat dalam usaha pengembangan selari semasa pecut atau projek tertentu. Ini meningkatkan kecekapan sepanjang keseluruhan kitaran hidup pembangunan perisian.

Beberapa ciri ciri modul asli adalah:

  • Unit penyebaran autonomi (gandingan longgar)
  • Identiti yang konsisten dan unik (ID modul dan versi)
  • Keperluan dan kebergantungan yang mudah dikenal pasti dan dijumpai (kemudahan kompilasi dan waktu penggunaan standard dan meta-maklumat)
  • Antara muka yang terbuka dan difahami (kontrak komunikasi)
  • Perincian pelaksanaan tersembunyi (enkapsulasi)

Sistem yang dibina untuk memproses modul dengan cekap harus melakukan perkara berikut:

  • Sokong modulariti dan ketergantungan-penemuan pada waktu kompilasi
  • Laksanakan modul dalam lingkungan waktu proses yang menyokong penyebaran dan penempatan semula yang mudah tanpa henti sistem
  • Laksanakan kitaran hidup pelaksanaan yang jelas dan mantap
  • Menyediakan kemudahan untuk pendaftaran dan penemuan modul yang mudah

Penyelesaian berorientasi objek, berorientasikan komponen, dan berorientasikan perkhidmatan semuanya telah berusaha untuk membolehkan modulariti murni. Setiap penyelesaian mempunyai satu set kebiasaan tersendiri yang menghalangnya daripada mencapai kesempurnaan modular. Mari kita pertimbangkan secara ringkas.

Kelas dan objek Java sebagai konstruk modular

Tidakkah sifat berorientasi objek Java memenuhi syarat modularitas? Bagaimanapun, pengaturcaraan berorientasikan objek dengan tekanan Java dan kadang-kadang menegakkan keunikan, enkapsulasi data, dan gandingan longgar. Walaupun titik-titik ini adalah permulaan yang baik, perhatikan syarat modularitas yang tidak dipenuhi oleh kerangka berorientasi objek Java: identiti pada tingkat objek tidak dapat dipercayai; antara muka tidak diberi versi: dan kelas tidak unik pada tahap penyebaran. Gandingan longgar adalah amalan terbaik, tetapi pastinya tidak ditegakkan.

Menggunakan semula kelas di Java sukar apabila pergantungan pihak ketiga begitu mudah disalahgunakan. Alat masa kompilasi seperti Maven berusaha mengatasi kekurangan ini. Konvensyen dan konstruksi bahasa selepas fakta seperti suntikan kebergantungan dan inversi-kawalan membantu pembangun dalam percubaan kami untuk mengawal persekitaran waktu operasi, dan kadang-kadang mereka berjaya, terutamanya jika digunakan dengan disiplin yang ketat. Malangnya, keadaan ini meninggalkan tugas untuk mewujudkan persekitaran modular sehingga konvensyen dan konfigurasi rangka kerja proprietari.

Java juga menambahkan ruang nama paket dan keterlihatan ruang lingkup ke dalam campuran sebagai cara untuk membuat mekanisme waktu kompilasi dan waktu penerapan. Tetapi ciri bahasa ini mudah diketepikan, seperti yang akan saya jelaskan.

Pakej sebagai penyelesaian modular

Paket berupaya menambahkan tahap abstraksi ke lanskap pengaturcaraan Java. Mereka menyediakan kemudahan untuk ruang nama pengkodan yang unik dan konteks konfigurasi. Namun, yang menyedihkan, konvensyen pakej mudah dilanggar, sering membawa kepada persekitaran gandingan waktu kompilasi yang berbahaya.

Keadaan modularitas di Java pada masa ini (selain OSGi, yang akan saya bincangkan sebentar lagi) paling sering dicapai dengan menggunakan ruang nama pakej, konvensi JavaBeans, dan konfigurasi kerangka proprietari seperti yang terdapat di Spring.

Tidakkah fail JAR cukup modular?

Fail JAR dan persekitaran penyebaran di mana mereka beroperasi sangat meningkatkan banyak konvensyen penyebaran warisan yang tersedia. Tetapi fail JAR tidak mempunyai keunikan intrinsik, selain dari nombor versi yang jarang digunakan, yang tersembunyi dalam manifes .jar. Fail JAR dan manifes pilihan tidak digunakan sebagai konvensi modulariti dalam lingkungan waktu proses Java. Oleh itu, nama pakej kelas dalam fail dan penyertaan mereka dalam classpath adalah satu-satunya bahagian struktur JAR yang memberikan modulariti kepada persekitaran waktu proses.

Singkatnya, JAR adalah usaha yang baik untuk modularisasi, tetapi mereka tidak memenuhi semua syarat untuk persekitaran yang benar-benar modular. Kerangka kerja dan platform seperti Spring dan OSGi menggunakan corak dan peningkatan pada spesifikasi JAR untuk menyediakan persekitaran untuk membina sistem yang sangat berkebolehan dan modular. Walau bagaimanapun, lama kelamaan, alat ini akan menyebabkan kesan sampingan JAR neraka spesifikasi JAR yang sangat malang!

Classpath / JAR neraka

Apabila persekitaran Java runtime memungkinkan mekanisme pemuatan JAR yang sewenang-wenangnya rumit, pemaju tahu mereka berada di classpath hell atau JAR hell . Sebilangan konfigurasi boleh menyebabkan keadaan ini.

Pertama, pertimbangkan situasi di mana pembangun aplikasi Java menyediakan versi aplikasi yang dikemas kini dan telah mengemasnya dalam fail JAR dengan nama yang sama persis dengan versi lama. Persekitaran jangka masa Java tidak menyediakan kemudahan pengesahan untuk menentukan fail JAR yang betul. Persekitaran runtime hanya akan memuat kelas dari fail JAR yang ditemuinya terlebih dahulu atau yang memenuhi salah satu daripada banyak peraturan classpath. Ini membawa kepada tingkah laku yang tidak dijangka pada tahap terbaik.

Contoh lain dari JAR neraka timbul di mana dua atau lebih aplikasi atau proses bergantung pada versi perpustakaan pihak ketiga yang berbeza. Dengan menggunakan kemudahan memuatkan kelas standard, hanya satu versi perpustakaan pihak ketiga yang akan tersedia pada waktu berjalan, yang menyebabkan kesilapan dalam sekurang-kurangnya satu aplikasi atau proses.

Sistem modul Java yang lengkap dan cekap harus memudahkan pemisahan kod menjadi modul yang berbeza, mudah difahami, dan digabungkan secara longgar. Ketergantungan harus dinyatakan dengan jelas dan dilaksanakan dengan tegas. Kemudahan harus ada yang membolehkan modul ditingkatkan tanpa memberi kesan negatif pada modul lain. Persekitaran runtime modular harus membolehkan konfigurasi yang khusus untuk domain tertentu atau pasaran menegak, sehingga mengurangkan masa permulaan dan jejak sistem persekitaran.

Penyelesaian modulariti untuk Java

Bersama dengan ciri modulariti yang disebutkan setakat ini, usaha baru-baru ini menambah beberapa lagi. Ciri-ciri berikut dimaksudkan untuk mengoptimumkan prestasi dan memungkinkan memperluas persekitaran waktu operasi:

  • Kod sumber tersegmentasi : Kod sumber dipisahkan menjadi segmen cache yang berbeza, masing-masing mengandungi jenis kod tersusun tertentu. Tujuannya termasuk melangkau kod bukan kaedah semasa menyapu sampah, penambahan tambahan, dan pengurusan memori yang lebih baik.
  • Penguatkuasaan membina masa : Konstruk bahasa untuk menegakkan ruang nama, versi, pergantungan, dan lain-lain.
  • Kemudahan penyebaran : Sokongan untuk menggunakan lingkungan waktu berjalan berskala sesuai dengan kebutuhan khusus, seperti lingkungan perangkat mudah alih.

Sejumlah spesifikasi dan kerangka kerja modular telah berusaha untuk memfasilitasi ciri-ciri ini, dan beberapa baru-baru ini naik ke puncak dalam cadangan untuk Java 9. Gambaran keseluruhan cadangan modulariti Java ada di bawah.

JSR (Permintaan Spesifikasi Java) 277

Saat ini tidak aktif adalah Permintaan Spesifikasi Java (JSR) 277, Sistem Modul Java; diperkenalkan oleh Sun pada bulan Jun 2005. Spesifikasi ini merangkumi sebahagian besar bidang yang sama dengan OSGi. Seperti OSGi, JSR 277 juga mendefinisikan penemuan, pemuatan, dan konsistensi modul, dengan sokongan jarang untuk pengubahsuaian runtime dan / atau pemeriksaan integriti.

Kelemahan untuk JSR 277 merangkumi:

  • Tidak memuat dan memunggah modul / kumpulan secara dinamik
  • Tiada pemeriksaan jangka masa untuk keunikan ruang kelas

OSGi (Open Service Gateway Initiative)

Diperkenalkan oleh OSGI Alliance pada bulan November 1998, platform OSGI adalah jawapan modulariti yang paling banyak digunakan untuk pertanyaan standard formal untuk Java. Saat ini pada rilis 6, spesifikasi OSGi diterima dan digunakan secara meluas, terutama akhir-akhir ini.

Pada hakikatnya, OSGi adalah sistem modular dan platform perkhidmatan untuk bahasa pengaturcaraan Java yang menerapkan model komponen yang lengkap dan dinamis dalam bentuk modul, perkhidmatan, bundel yang dapat digunakan, dan sebagainya.

Lapisan utama seni bina OSGI adalah seperti berikut:

  • Persekitaran pelaksanaan : Lingkungan Java (misalnya, Java EE atau Java SE) di mana bundle akan dijalankan.
  • Modul : Di mana kerangka OSGi memproses aspek modular dari kumpulan. Metadata kumpulan diproses di sini.
  • Kitaran hidup : Memulakan, memulakan, dan menghentikan kumpulan berlaku di sini.
  • Daftar perkhidmatan : Di mana kumpulan menyenaraikan perkhidmatan mereka untuk ditemui kumpulan lain.

Salah satu kelemahan terbesar OSGi adalah kekurangan mekanisme formal untuk pemasangan pakej asli.

JSR 291

JSR 291 adalah kerangka komponen dinamis untuk Java SE yang didasarkan pada OSGi, kini dalam tahap akhir pengembangan. Usaha ini difokuskan pada pengambilan OSGi ke arus perdana Java, seperti yang dilakukan untuk lingkungan mudah alih Java oleh JSR 232.

JSR 294

JSR 294 mendefinisikan sistem meta-modul dan mewakilkan perwujudan sebenar modul yang dapat dipasang (versi, pergantungan, sekatan, dll.) Kepada penyedia luaran. Spesifikasi ini memperkenalkan peluasan bahasa, seperti "superpackages" dan modul yang berkaitan dengan hierarki, untuk memudahkan modulariti. Unit enkapsulasi yang ketat dan kompilasi yang berbeza juga merupakan sebahagian daripada fokus spesifikasi. JSR 294 kini tidak aktif.

Jigsaw Projek

Project Jigsaw adalah calon yang paling mungkin untuk modularitas di Java 9. Jigsaw berusaha menggunakan konstruk bahasa dan konfigurasi persekitaran untuk menentukan sistem modul yang dapat diskalakan untuk Java SE. Matlamat utama Jigsaw merangkumi:

  • Menjadikannya sangat mudah untuk skala waktu run Java SE dan JDK ke peranti kecil.
  • Meningkatkan keselamatan Java SE dan JDK dengan melarang akses ke API JDK dalaman dan dengan menguatkuasakan dan memperbaiki SecurityManager.checkPackageAccesskaedah tersebut.
  • Meningkatkan prestasi aplikasi melalui pengoptimuman kod yang ada dan memfasilitasi teknik pengoptimuman program ke depan.
  • Menyederhanakan pengembangan aplikasi di Java SE dengan memungkinkan perpustakaan dan aplikasi dibangun dari modul yang disumbangkan oleh pemaju dan dari JDK modular
  • Memerlukan dan melaksanakan sekatan versi terhad

JEP (Proposal Peningkatan Java) 200

Java Enhancement Proposal 200 yang dibuat pada bulan Julai 2014, bertujuan untuk menentukan struktur modular untuk JDK. JEP 200 menggunakan kerangka Jigsaw untuk memfasilitasi pemisahan JDK, menurut Java 8 Compact Profiles, ke dalam set modul yang dapat digabungkan pada waktu kompilasi, waktu membangun, dan waktu penggunaan. Kombinasi modul ini kemudian dapat digunakan sebagai lingkungan waktu berjalan yang dikurangkan yang terdiri dari modul yang sesuai dengan Jigsaw.

JEP 201

JEP 201 berusaha membina Jigsaw untuk menyusun semula kod sumber JDK menjadi modul. Modul-modul ini kemudiannya dapat disusun sebagai unit yang berbeza dengan sistem binaan yang dipertingkatkan yang menguatkan batasan modul. JEP 201 mencadangkan skema penyusunan semula kod sumber di seluruh JDK yang menekankan batasan modul di peringkat teratas pokok kod sumber.

Penrose

Penrose akan menguruskan operasi antara Jigsaw dan OSGi. Secara khusus, ini akan memfasilitasi kemampuan untuk memodifikasi kernel mikro OSGi agar bundel berjalan di kernel yang diubah untuk menggunakan modul Jigsaw. Ia bergantung pada penggunaan JSON untuk menerangkan modul.

Rancangan untuk Java 9

Java 9 adalah pelepasan utama yang unik untuk Java. Yang menjadikannya unik adalah pengenalan komponen dan segmen modular di seluruh JDK . Ciri-ciri utama yang menyokong modularisasi adalah:

  • Kod sumber modular : Di Java 9, JRE dan JDK akan disusun semula menjadi modul yang boleh beroperasi. Ini akan membolehkan penciptaan waktu berjalan yang boleh diskalakan yang dapat dijalankan pada peranti kecil.
  • Cache kod bersegmen : Walaupun bukan kemudahan modular, cache kod segmen baru Java 9 akan mengikuti semangat modularisasi dan menikmati beberapa manfaat yang sama. Cache kod baru akan membuat keputusan yang bijak untuk menyusun segmen kod yang sering diakses ke kod asli dan menyimpannya untuk pencarian yang dioptimumkan dan pelaksanaan masa depan. Tumpukan juga akan dibahagikan kepada 3 unit berbeza: kod bukan kaedah yang akan disimpan secara kekal di dalam cache; kod yang mempunyai kitaran hayat yang berpotensi panjang (dikenali sebagai "kod tidak berprofil"); dan kod yang bersifat sementara (dikenali sebagai "kod berprofil").
  • Penguatkuasaan build -time : Sistem build akan dipertingkatkan, melalui JEP 201, untuk menyusun dan menguatkuasakan batas modul.
  • Kemudahan penyebaran : Alat akan disediakan dalam projek Jigsaw yang akan menyokong batasan, kekangan, dan ketergantungan modul pada waktu penggunaan.

Pelepasan akses awal Java 9

Walaupun tarikh pelepasan tepat Java 9 masih menjadi misteri, anda boleh memuat turun siaran akses awal di Java.net.

Kesimpulannya

Artikel ini telah menjadi gambaran keseluruhan modulariti dalam platform Java, termasuk prospek modularitas di Java 9. Saya menjelaskan bagaimana isu-isu lama seperti classpath hell menyumbang kepada keperluan untuk seni bina Java yang lebih modular dan membincangkan beberapa modulariti baru yang paling baru ciri yang dicadangkan untuk Java. Saya kemudian menerangkan dan mengontekstual setiap cadangan atau platform modulariti Java, termasuk OSGi dan Project Jigsaw.

Keperluan untuk seni bina Java yang lebih modular jelas. Percubaan semasa gagal, walaupun OSGi hampir hampir. Untuk keluaran Java 9, Project Jigsaw dan OSGi akan menjadi pemain utama di ruang modular untuk Java, dengan Penrose mungkin menyediakan gam di antara mereka.

Kisah ini, "Modularity in Java 9: ​​Stacking up with Project Jigsaw, Penrose, dan OSGi" pada awalnya diterbitkan oleh JavaWorld.