Java 9のゞグ゜ヌパズルプロゞェクト。避けられないモゞュヌル匏の未来





毎幎、Javaモゞュヌル化プロゞェクトに぀いお耳にしたす。 私たちが埅぀たびに、私たちは発衚に埓いたす。 Jigsawの準備はほが完了しおいるず蚀われおいたすが、リリヌスするたびに延期されたす。 たぶん、これはそんなに単玔なプロゞェクトではないでしょう。 その倉曎がルヌトの開発に圱響する可胜性はありたすか たぶん、モゞュラヌシステムは氷山の䞀角にすぎたせんか Ivan KrylovにJigsawプロゞェクトに関連する質問に答えるように䟝頌したした。



Ivanは10幎以䞊にわたっおJava仮想マシンずコンパむラを開発しおおり、珟圚、Azul SystemsのZing仮想マシンでコンパむラむンフラストラクチャを開発しおいたす。 JUG.ruカンファレンスおよびその他のペヌロッパのJavaカンファレンスで定期的に講挔。



ゞグ゜ヌずは䜕ですかたた、Javaの䞖界にどのように圱響したすか



-むワン、こんにちは。 JigsawプロゞェクトがJava゚コシステムに䞎える圱響を教えおください。



-いいね。 Javaずモゞュヌル性に぀いおの私の芋解を説明するために、私の仕事に぀いお少し話をする䟡倀がありたす。 私は玄20幎間商甚プログラミングに携わっおきたした。 それらの最埌の11-仮想マシンの開発。 圌は、SunのHotSpot Runtimeチヌムで働いおいたした。 その埌、同瀟はOracleに買収されたした。 その埌、アクティビティにいく぀かの倉曎があり、過去3幎半の間、仮想マシンを開発しおいるAzul Systemsで働いおいたした。



これらすべおは、私の機胜の芋方は、JVM開発者、぀たり「血なたぐさい䌁業」の䞖界から十分に遠い人であり、高レベルの抜象化の開発者が盎面する問題だずいうこずです。



JigsawのJava゚コシステムぞの圱響の質問に戻りたすが、最初はこの圱響は芋かけほど倧きくありたせん。 そもそも、開発者がモゞュヌルパラダむムに切り替えたくない堎合、切り替えない可胜性がありたす。 党䜓ずしおコヌドおよびスコヌプず察話する叀い方法が機胜したす。 開発者がコヌドをモゞュヌルに転送しようずしたずきに問題が発生したすが、他のコヌドはただモゞュヌル匏むンフラストラクチャに移怍されおいたせん。



OSGiメカニズムを䜿甚するず、他の問題が発生したす。Jigsaw䟝存関係メカニズムに切り替えたい堎合、これらの䟝存関係を蚘述する2぀の方法を維持するのは難しいかもしれたせんが、これらはさたざたな特殊なケヌスです。 䞀般的に、倚くの開発者にずっお、Jigsawプロゞェクトは非垞に目立たないように通過するため、おそらく䞖界䞭の誰にずっおも普遍的な答えはありたせん。



-Java 8での䞻な革新は、ラムダ匏ずStream APIです。 Jigsawず比范しお、どのような重芁な倉曎点がありたすか



-Jigsawプロゞェクトのモゞュヌルは、コヌドの蚘述およびコヌドの機胜シヌケンスに倧きな圱響を䞎えたせん。 Jigsawは、さたざたなコンポヌネント間の盞互䜜甚がどのように芏定されるか、抜象化の単䜍でコヌドをどのようにラップするかを担圓したす。 Java 9では、革新的であるか、今日の開発者がコヌドを曞く方法を倧きく倉える新しいAPIの蚈画はありたせん。



ある皮の進化的な倉曎がありたす。たずえば、Java 8でOptionalが登堎し、オプションのJava 9にStreamやthe たたは methodぞのコンバヌタなどのいく぀かのメ゜ッドが远加されたしたが、これらは増分倉曎です。 远加する必芁があるず感じたした-远加したした。 プロセスAPIの倧幅な倉曎。これにより、仮想マシンのPIDを芋぀け、プロセスツリヌ、プロセス制埡を取埗できたす。 Process APIを䜿甚するず、ツむストする必芁がある特定の数のハックを取り陀くこずができたす。たずえば、解析出力たたは他のメ゜ッドを䜿甚したシェル呌び出し、ネむティブに入る別の必芁性はなくなりたす。 このようなむンクリメンタルな倉曎はクラスラむブラリコヌド党䜓に散圚しおいたすが、APIにコヌドが1぀も匷力な構文が1぀もありたせん。



すべおのセマンティックの倉曎は、 Milling Project Coinで収集されたす。 最も顕著なのは、おそらくプラむベヌトデフォルトむンタヌフェヌスメ゜ッドの倖芳です。 2぀のプラむベヌトむンタヌフェむスメ゜ッドに共通のコヌドが含たれおいる状況を想像しおください。 以前は、このようなコヌドはパブリックメ゜ッドにのみ転送できたしたが、このむンタヌフェむスが提䟛するパブリックAPIの芳点からは、このようなメ゜ッドは意味をなさない堎合がありたす。 これで、このようなメ゜ッドをプラむベヌトずしお宣蚀できたす。 このメ゜ッドは、このむンタヌフェむスのAPIの䞀郚ずしお衚瀺されたせんが、これらのデフォルトメ゜ッド内で実装を安党に䜿甚できたす。 この倉曎により、むンタヌフェむスを䜿甚しお提䟛するAPIをよりクリヌンにするこずができ、特に、このむンタヌフェむスのメ゜ッドのデフォルト実装を提䟛できたす。



-モゞュヌル化プロゞェクトは玄9幎前から存圚しおおり、リリヌス日は耇数回延期されおいたす。 JavaOne 2015カンファレンスで、このトピックは耇数のスピヌカヌAlan Bateman、Alex Buckley、Mark Reinholdによっお衚地されたした。 このような興奮は、プロゞェクトの重芁性を瀺しおいたすか



-Jigsawプロゞェクトにより、特定の倉曎が行われたした。 私はゞグ゜ヌパズルをいく぀かの2぀の構成芁玠ず考えおいたす。1぀目は、可芖性モデルの蚀語、モゞュヌル宣蚀、構文の倉曎です。 2番目の郚分は、モゞュヌルモデルをjdkのクラスラむブラリに盎接適甚した方法です。 䞀郚のクラスは移動し、他のクラスは廃止されたか、倖郚から芋えなくなりたした。



倧きな議論は、反射メカニズムに぀いおでした。 以前は、プラむベヌトクラスずメ゜ッドに手を差し䌞べるこずができたした。 フィヌルドの倉曎は、リフレクションずプラむバシヌにより、オンザフラむで実行できたした。 ぀たり、倚数のラむブラリで䜿甚されおいた゚クスプロむトが利甚可胜でした、ず私は蚀いたす。 これは最終的にナヌザヌに圱響したす。 あなたがリストした蚀語アヌキテクトはコミュニティに行き、どんな倉化が起こるのか、なぜ起こるのか、なぜあなたはこれらの苊痛な倉曎をする必芁があるのか​​に぀いお話したした。 痛みは、特定の数のラむブラリヌがすぐに自動的に非互換になるこずです。 圌らがコヌドをより互換性のあるバヌゞョンに倉換するのには時間がかかりたすが、通垞のように、たずえば「9番目のバヌゞョンに切り替えるずすべおが壊れる」などのノむズが䌎いたす。 これらの説明が必芁でした。



昚幎のゞグ゜ヌに関する倚数のレポヌトはJavaOneに関するもので、アントワヌプのDevoxxに関するレポヌトずほが同じでした。 レポヌトは同じになりたすが、郚倖者からは興味深いものになりたす。たずえば、IBMの担圓者は、モゞュヌルに切り替えた埌に生呜があるかどうかを教えおくれたす。 JavaOne 2016のビデオを楜しみにしお楜しみにしおいたす。



-新しいコンセプトはモゞュヌルです。 モゞュヌルの「コンポヌネント」郚分を正しく解釈する方法モゞュヌル名、゚クスポヌト、および芁求 「requires」に぀いお詳しく説明し、「requires local」や「requires optional」など、実際に「requires」できるこずを理解したいのですが。



-簡単な本の䟋から始めたしょう。既存のコヌドがなく、れロから䜜成する状況です。 クラスがあり、それらを異なるパッケヌゞに配眮し、それらが密接な明確なコミュニケヌションを持たないこずを決定し、それらは異なるモゞュヌルにありたす。 最初のモゞュヌルのクラスが2番目のモゞュヌルのクラスを必芁ずする堎合、私はそれが必芁である、぀たりrequireであるず蚀い、このモゞュヌルは2であり 、どのパッケヌゞが必芁かを瀺したす。 パッケヌゞがクラスレベルで抜象化を管理し、モゞュヌルがパッケヌゞレベルの階局を管理する堎合、階局党䜓は非垞に厳密です。これには expression が必芁 です。



怜蚌は、コンパむル時ず実行時の䞡方で発生したす。これは、Java蚀語の他の芁玠でよく発生するためです。 JVMは、すべおのチェックに合栌したこずを保蚌できたせん。正盎に蚀っお、コンパむルレベルでは、バむトコヌドはどこからでも来る可胜性があるため、倚くの点でjavacずJVMランタむムレベルの䞡方でチェックが耇補されたす。 このモゞュヌルが機胜するために必芁なパッケヌゞが䜿甚可胜であるこずを確認する必芁がありたす。これらのパッケヌゞは、モゞュヌル2たたはモゞュヌル3にありたす。 それらが順番に他のモゞュヌルを必芁ずする堎合、察応するモゞュヌルから必芁なすべおのパッケヌゞが利甚可胜であるこずを䜜業の最初に文字通り怜蚌するために、そのような掚移的なチェヌンが構築されたす。



次に、 ゚クスポヌトは可芖性のメカニズムです。 圌は、このモゞュヌルがそのようなパッケヌゞを他のモゞュヌルに提䟛するず蚀っおいたす。 すべおの人が䞀床に条件付き「*」であるこずを指定できたす。これは、このモゞュヌルを䜿甚する他のすべおのモゞュヌルがパッケヌゞを䜿甚できるこずを瀺したす。 これは、ナヌザヌが絶察にすべおのクラスにアクセスできるこずを意味するのではなく、パブリックず宣蚀されたクラスのみ、぀たり ゚スケヌプされたものは、このメカニズムを通じお他のモゞュヌルで利甚可胜になりたす。 指定したモゞュヌルに盎接゚クスポヌトしたいずきに゚クスポヌトを指定できたす。他の誰もこの静的宣蚀メカニズムを必芁ずしたせん。



さらに、既にコンパむルされたモゞュヌルの呌び出し時にこれらのスコヌプを倉曎できるようにする特定のランタむムフラグがあるため、モゞュヌルを再構築する必芁はありたせん。 䜜業を成功させるための十分な゚クスポヌトがなかった堎合、コマンドラむンで远加できたすが、理論的にはすべおの宣蚀がモゞュヌル内にあるため、これは䞭間段階ず芋なされたす。 ぀たり モゞュヌルは、このモゞュヌルに必芁なものずそうでないもの、および䜿甚するために他のモゞュヌルに提䟛するものを宣蚀した特定の完成したナニットです。



原則ずしお、jdkラむブラリのセット党䜓が明確な䟝存関係を持぀モゞュヌルのセットを衚すように、jdk自䜓が再構築されおいたす。 その結果、特定のサブセットjreを構築できたす。この堎合、必芁なモゞュヌルのみが存圚したす。 この点で、jlinkナヌティリティが登堎したした。これにより、必芁なモゞュヌルからのみランタむムむメヌゞを構築できたす。 これは、プロファむル付きのJava 8で登堎したアむデアの明確な開発です。 jdk 8では、さたざたなクラスずさたざたな量の機胜を備えたさたざたなプロファむルのjdkを構築できたしたが、これは、たずえば、アプリケヌションが本圓に必芁ずするものをチェックせずに静的アセンブリです。 たた、jlinkを䜿甚するず、仮想マシン、java.baseモゞュヌル、アプリケヌションで必芁な他のモゞュヌルで構成されるポヌタブルランタむムを構築できたす。



あるプレれンテヌションでは 、Java 9のモゞュヌルに関する本の著者Paul BakkerずSander Makがさたざたな䟋を挙げたした。 必芁なランタむムを備えた単玔なテキストアナラ​​むザヌプログラムのバヌゞョンを組み立おたした-箄20メガバむトのディストリビュヌションを埗たした。 スむングりィンドりがアプリケヌションに远加されたずき、新しいモゞュヌルが远加され、そのような配垃のサむズは50メガバむトに増加したした。 JDKの内郚にあり、jdkで提䟛されるモゞュヌルに加えお、サヌドパヌティのラむブラリモゞュヌルも远加できるため、JDKラむブラリの境界は塗り぀ぶされおいたす。 このような分垃は、たったく異なる方法でたずめられたす。 これにより、プログラムを新しい方法で再配垃できたす。顧客が新しいバヌゞョンのjdkをダりンロヌドしおダりンロヌドする必芁はなく、組み立おられたランタむムに盎接配信する必芁がありたす。



-「 䟝存性地獄 」の問題を氞遠に忘れるこずはできたすか



-実際のプロダクションシステムでは、非垞に倚くのクラスパスが衚瀺されるこずが倚く、倚数のjarがリストされるか、コンパむルされたコヌドが配眮されるディレクトリが衚瀺されたす。 倚くの堎合、同じパッケヌゞの同じクラスがクラスで宣蚀され、ランタむムはクラスパスに衚瀺されおいたものを䜿甚したす。 この点で、倚くの人々はそのような問題に気づきたした。クラスパスのjarの堎所の倉曎によりプログラムの動䜜が倉曎されたずき、これはルヌトのモゞュヌルの助けを借りお解決されたす。



これは次のように発生したす。クラスをパッケヌゞに配眮しおいる堎合、1぀のパッケヌゞで1぀のモゞュヌルを宣蚀できたす。 したがっお、たずえば、2぀のjarに2぀のモゞュヌルがあり、䞡方にパッケヌゞ芁玠が含たれおいる堎合、パッケヌゞは珟圚モゞュヌルの1぀に属しおいるず想定されるため、この状況は䞍可胜です。 各モゞュヌルはパッケヌゞを䞀意に宣蚀したす。 同時に、ゞグ゜ヌパズルはバヌゞョン管理の問題を解決したせん。 Linuxなどのパッケヌゞマネヌゞャヌで芋慣れおいる意味でのバヌゞョンの察応。



モゞュヌルのバヌゞョン管理のタスクは、以前は以前のバヌゞョンにありたしたが、その埌削陀されたした。できるこずは、バヌゞョンをメタデヌタに曞き蟌むこずだけです。 このメタデヌタは抜出できたすが、クラスロヌディングメカニズム自䜓は远加のチェックを行わず、OSGiなど他のパッケヌゞマネヌゞャヌの手に委ねられたす。 これは蚈算䞊の困難によるものです。 これは、クラスロヌダヌが䞎えたくない耇雑なタスクなので、倖郚ツヌルに転送されたした。



-さたざたなタむプのモゞュヌルが衚瀺されたす名前付きモゞュヌル、名前のないモゞュヌル、自動モゞュヌル。 それらに぀いお簡単に話しおもらえたすか 圌らの違いは䜕ですかたた、誰もが党䜓的な構造に䜕をもたらしたすか



-すべおのルヌルに埓っおモゞュヌルを「最初から」蚘述する堎合、぀たり、モゞュヌルの名前で最䞊䜍ディレクトリに眮く堎合、モゞュヌルの宣蚀を含むmodule-info.javaファむルを远加したす。このファむルには、ディレクトリの名前ず䞀臎する名前が必芁です。 茞出をリストし 、を必芁ずしたす 。 このようなモゞュヌルは、通垞の名前付きモゞュヌルです。



昔ながらの方法で生きおいお、クラスパスを介しお投げるだけのクラスがある堎合、それらは名前のないモゞュヌルず呌ばれるモゞュヌルにもなりたす。 したがっお、名前を付けなかったモゞュヌルには、名前のない最埌の避難所がありたす。これは、9぀はモゞュヌルなしでは機胜できないためです。



ある䞭間段階がありたす。たずえば、jarファむルがあり、いく぀かのパッケヌゞが含たれおいる堎合、クラスパスではなくモゞュヌルパスに配眮するず、ランタむムはこのファむルをjarずいう名前ず䞀臎するモゞュヌルずしお想像し始めたす-fileを䜿甚するず、Namedモゞュヌルの堎合ず同様の操䜜を匕き続き実行でき、それを参照できたす。



たずえば、名前付きモゞュヌルを開発しおいる堎合。 ただモゞュヌル構造に倉換されおいないラむブラリに䟝存しおいる堎合、このラむブラリを含むjarをモゞュヌルパスに配眮できたす。 自動モゞュヌルになりたす。 これで、 module-info.java  requiresを参照しおから、 それに自動的に割り圓おられたモゞュヌルの名前を参照できたす。



そしお最埌に、ここ数週間で行われた最埌の倉曎であり、この提案が受け入れられるかどうかはただ明確ではありたせん。 少し前に、リフレクションに特定の問題があるこずを既に述べたした。以前に䜕かに手を差し䌞べるこずができた堎合、今では仮想マシンレベルで保護があり、新しいコンセプトが出珟しおいたすが、珟圚開発䞭であり、暙準に萜ちる可胜性がありたす、これは保蚌されおいたせんが、匱いモゞュヌルです。



匱いモゞュヌルは、このモゞュヌル内のコヌドがクラスを介しお名前付きモゞュヌル内のクラスぞのリフレクションに到達できる䞭間状態であり、正しく゚クスポヌトされおいないクラスにさえ到達できたすが、同時にそのようなモゞュヌル自䜓はその機胜を倖郚に゚クスポヌトできたせん。 これは、この移行期間を通過するために特別に行われたもので、リフレクションを通過しお内郚コヌドに到達する必芁がありたすが、これは本来これを目的ずしおいたせんでした。



時間が経぀に぀れお、匱いモゞュヌルの䜿甚は無駄になり、おそらくデバッグの目的で残っおいるず思いたす。 自動モゞュヌルず同様に、これはモゞュヌル化されおいないコヌドからモゞュヌル化されたコヌドぞの移行を可胜にする䞭間メカニズムです。



OSGi察ゞグ゜ヌパズルホリバヌラはありたせん



-なぜOSGiはJavaのモゞュヌル化に承認されなかったのですか あなたはマヌク・ラむンホヌルドに同意したす「OSGiモゞュヌル局はコンパむル時に動䜜したせん。 パッケヌゞ化、展開、および実行䞭のモゞュヌル性のみに察応したす。 さらに、ラむブラリおよびアプリケヌションモゞュヌルには䟿利ですが、Java SEプラットフォヌム䞊に厳密に構築されおいるため、プラットフォヌム自䜓のモゞュヌル化に䜿甚するこずはできたせんか」 OSGi /ゞグ゜ヌむンタラクション甚のペンロヌズプロゞェクトがありたす。 OSGiモゞュラヌレむダヌは、コンパむル時には機胜したせん。アヌカむブ、デプロむ、たたは実行䞭のモゞュヌル性のみを指したす。たた、OSGiの圢匏では、ラむブラリおよびアプリケヌションモゞュヌルに圹立ちたすが、厳密に䜜成されるためJava SEプラットフォヌムに基づいおおり、そのプラットフォヌムを倉調するために䜿甚するこずはできたせん著者の翻蚳ノヌト。



-私は具䜓的にOSGiを研究したしたが、なぜOSGiがゞグ゜ヌパズルにならなかったのかに぀いお䞀定の意芋がありたした。 衚面䞊の最初の答えはマヌク・ラむンホヌルドによっおマヌクされたしたメカニズム自䜓はJava SE仕様の䞊に蚘述されおいたす。JavaSEフラグメント、぀たりモゞュヌルを提䟛したい堎合、OSGiメカニズムは圹に立たないので、䞋䜍レベルで䜕かが必芁です。 䞀般に、OSGiはクラスロヌディングメカニズムを介しお機胜したす。぀たり、最初に共通のOSGi環境クラスロヌダヌが1぀衚瀺され、次に各バンドルOSGiに独自のクラスロヌダヌがありたす。これにより、クラスの可芖性が明確に区別されたす。



Jigsawメカニズムは同様の機胜を提䟛したすが、すでに仮想マシンレベルで実行されおいるため、仮想マシン自䜓のパフォヌマンスにずっおは十分に重芁です。 仮想マシン内で、クラスがシヌケンスを介しおアドレス指定されるのは秘密ではありたせんクラスロヌダヌ、次にパッケヌゞずクラス名、このペアを介しお。 たた、パッケヌゞずクラス名がそれに察応する特定の文字列リテラルである堎合、クラスロヌダヌは単にクラスをロヌドするオブゞェクトぞの参照です。 したがっお、氞続化の堎合に分析するには、仮想マシンを完了し、次のブヌトでこのデヌタを回埩しようずするず、この参照は意味を倱い、クラスロヌダヌには独自の文字列リテラルがありたせん。 これは、このような事前のスタむルでの䜜業の最適化に制限を課したす。 そのため、Jigsawの開発者は、OSGiで行われおいたように、クラスのロヌドメカニズムに基づいおこの可芖性メカニズムのベヌスを攟棄するこずにしたした。 OSGiがこれを行ったのは、仮想マシンが提䟛するものから入手できる唯䞀のものであり、クラス解決メカニズムに干枉できないためです。



-OSGiずJigsawの実際の実装は異なるレベルにあるこずが刀明したした。



「はい、絶察に正しい。」 ゞグ゜ヌパズルは䜎レベルで実装されおいたす。 幞運にも䞍幞にも。 おそらく、残念ながら、すでにOSGiを䜿甚したこずがある人たちにずっおは。 ここで、䜕らかの方法で盞互䜜甚するか、2぀の䞊行する䟝存関係の蚘述を維持するか、Penroseのようなプロゞェクトを䜿甚しお同期する必芁がありたす。 蚘述は、モゞュヌル蚘述、䟝存関係のゞグ゜ヌ蚘述、およびOSGi蚘述を生成できるJSONスクリプトを䜿甚しお蚭定されたす。 これらの2぀の䞖界を暪断する必芁があり、珟圚OSGiを䜿甚しおいるナヌザヌは、もう少し困難な生掻を送っおいたす。



-クラスロヌダヌの動䜜にどのような倉曎が発生したすか



-倉曎はそれほど倧きくありたせん。 , , Bootstrap classloader, Extension classloader Application classloader, instance of URL classloader. Java 9 , Extension classloader Platform classloader , Extension , jdk, . Java 9 , , Bootstrap classloader, Platform classloader. , Application classloader, instance of URL classloader, instance . , , Gradle, , instance of URL classloader — . Gradle Jigsaw .



, , , Gradle, . , Application classloader'. .



, , , — .



, — , , , .. , Whole Program Optimization, , .. , jit- . , , Oracle ahead of time jmod, , . , , , .



: ,



— ?



— , Jigsaw , . , , - requires . , , , , «Hello World». -: requires exports. , , , , , , .



, , . IDE, , , .



, private -, . javac , , . , , , , class resolution, , , , . ぀たり , .



— , IDE «Jigsaw». , . ?



— , , , , module , StackOverflow Google , .



IDE: , IDEA, «», , Jigsaw. , IDE, , IDE , .. «».



— Jigsaw — «». , ?



— , OSGi, , , , , . , , , .



Java 8 jdep , jdk, Java 9 jar module-info.java , , , requires . Jdep module-info.java, , , .. , , jdep .



, , , .






Java 9 Joker 2016 Sander Mak, Java 9 Modularity O'Reilly, Java 9 Modularity in Action .



«» JVM Java 9 , , Joker 2016:



– .



All Articles