功能项目拼图将Java 9引入
因此,拼圖項(xiàng)目...我們已經(jīng)對(duì)此頗為了解,但尚未看到計(jì)劃如何兌現(xiàn)其承諾的細(xì)節(jié)。 這篇文章將精確地做到這一點(diǎn),并介紹項(xiàng)目的核心概念和功能。
系列
這篇文章是正在進(jìn)行的有關(guān)拼圖項(xiàng)目系列的一部分。 按照推薦的順序(不同于發(fā)布順序),它們是:
- 動(dòng)機(jī)和目標(biāo)
- 核心概念和功能(即將推出)
- 如何破壞您的代碼
- 歷史,結(jié)構(gòu)和當(dāng)前狀態(tài)(即將發(fā)生)
- 動(dòng)手指南(即將在EA版本包含JSR 376的情況下發(fā)布 )
相應(yīng)的標(biāo)記列出了有關(guān)該主題的更多文章。
總覽
第一部分將介紹Jigsaw項(xiàng)目的核心概念,即模塊。 然后,我們將看到它們將具有哪些功能,以及如何計(jì)劃它們與現(xiàn)有代碼和工具進(jìn)行交互。
本文的主要來源是Jigsaw項(xiàng)目和JSR 376的要求 。 盡管這些文檔基于全面的探索階段,因此非常成熟,但它們?nèi)钥赡軙?huì)更改。 接下來的事情是一成不變的。
核心概念
有了Project Jigsaw,Java語言將得到擴(kuò)展以具有模塊概念。
[模塊]是由代碼和數(shù)據(jù)組成的自描述程序組件。 模塊必須能夠包含組織成包的Java類和接口,以及動(dòng)態(tài)加載庫形式的本機(jī)代碼。 模塊的數(shù)據(jù)必須能夠包含靜態(tài)資源文件和用戶可編輯的配置文件。Java平臺(tái)模塊系統(tǒng):要求(草案2)
要了解模塊,您可以將每個(gè)Apache Commons (例如Collections或IO), Google Guava或( cough ) LibFX之類的知名庫都視為模塊。 嗯,取決于作者希望對(duì)它們進(jìn)行拆分的粒度,每個(gè)人實(shí)際上可能都包含幾個(gè)模塊。
對(duì)于應(yīng)用程序也是如此。 它可能是單個(gè)整體模塊,但也可能分成多個(gè)模塊。 我想說一個(gè)項(xiàng)目的規(guī)模和凝聚力將是決定該項(xiàng)目可以組成的模塊數(shù)量的主要決定因素。 當(dāng)然,它的實(shí)際體系結(jié)構(gòu)和實(shí)現(xiàn)是否允許這是另外一個(gè)故事。
計(jì)劃是模塊將成為開發(fā)人員中用來組織代碼的常規(guī)工具。
開發(fā)人員已經(jīng)在語言方面考慮了標(biāo)準(zhǔn)種類的程序組件,例如類和接口。 模塊應(yīng)該只是另一種程序組件,像類和接口一樣,它們應(yīng)該在程序開發(fā)的所有階段都具有含義。
Mark Reinholds –拼圖項(xiàng)目:聚焦全局
然后,可以在開發(fā)的所有階段(即在編譯時(shí),構(gòu)建時(shí),安裝時(shí)或運(yùn)行時(shí))將模塊組合成各種配置。 它們將對(duì)像我們這樣的Java用戶可用(在這種情況下有時(shí)稱為開發(fā)人員模塊 ),但也將用于剖析Java運(yùn)行時(shí)本身(通常稱為平臺(tái)模塊 )。
實(shí)際上,這是有關(guān)如何將JDK模塊化的當(dāng)前計(jì)劃:
特征
那么模塊如何工作? 查看計(jì)劃中的功能將有助于我們對(duì)它們有所了解。
請注意,即使以下各節(jié)將介紹許多功能,也不會(huì)在所有可用詳細(xì)信息中進(jìn)行討論,也不會(huì)完整列出這些功能。 如果您想了解更多信息,可以從方括號(hào)中的鏈接開始,或者立即查看Jigsaw項(xiàng)目和JSR 376的完整要求 。
依賴管理
為了解決JAR / classpath的難題 ,Jigsaw Project實(shí)現(xiàn)的核心功能之一是依賴管理。
聲明與決議
一個(gè)模塊將聲明編譯和運(yùn)行[ 依賴項(xiàng) ]所需的其他模塊。 模塊系統(tǒng)將使用它來可傳遞地標(biāo)識(shí)編譯或運(yùn)行初始一個(gè)[ 分辨率 ]所需的所有模塊。
也有可能不依賴于特定模塊而是依賴于一組接口。 然后,模塊系統(tǒng)將嘗試查找實(shí)現(xiàn)這些接口并因此滿足依賴項(xiàng)[ services , binding ]的模塊。
版本控制
將支持版本控制模塊[ 版本控制 ]。 他們將能夠指示自己的版本(只要完全排序即可使用幾乎任何格式),以及對(duì)其依賴項(xiàng)的約束。 在任何階段都可以覆蓋這兩條信息。 模塊系統(tǒng)將在每個(gè)階段強(qiáng)制配置滿足所有約束。
Project Jigsaw不一定會(huì)在單個(gè)配置中支持模塊的多個(gè)版本 [ 多個(gè)版本 ]。 但是,等等,那這如何解決JAR地獄呢? 好問題。
模塊系統(tǒng)也可能未實(shí)現(xiàn)版本選擇。 因此,當(dāng)我在上面寫道“模塊系統(tǒng)[將]識(shí)別編譯或運(yùn)行所需的所有模塊”時(shí),這是基于每個(gè)模塊只有一個(gè)版本的假設(shè)。 如果有多個(gè),則上游步驟(例如,開發(fā)人員,或者更可能是他使用的構(gòu)建工具)必須進(jìn)行選擇,并且系統(tǒng)將僅驗(yàn)證其滿足所有約束[ 版本選擇 ]。
封裝形式
從同一類路徑加載的所有其他代碼將自動(dòng)提供JAR中的所有公共類和接口。 對(duì)于模塊而言,情況將有所不同,在這些模塊中,系統(tǒng)將在所有階段強(qiáng)制執(zhí)行更強(qiáng)的封裝(無論是否存在安全管理器)。
一個(gè)模塊將聲明特定的包,并且僅導(dǎo)出其中包含的類型。 這意味著只有它們將對(duì)其他模塊可見并且可訪問。 更嚴(yán)格的說,這些類型只會(huì)導(dǎo)出到那些明確依賴包含它們的模塊的模塊中[ export , encapsulation ]。
為了幫助開發(fā)人員(尤其是那些模塊化JDK的開發(fā)人員)保持較小的導(dǎo)出API界面,將存在其他發(fā)布機(jī)制。 這將允許一個(gè)模塊指定要導(dǎo)出的其他軟件包,但只能導(dǎo)出到一組指定的模塊。 因此,盡管使用“常規(guī)”機(jī)制,導(dǎo)出模塊將不知道(也不關(guān)心)誰訪問了軟件包,但該模塊將允許它限制可能的依賴項(xiàng)集合( 合格的出口 )。
模塊也可能會(huì)重新導(dǎo)出其依賴的模塊的API(或其部分)。 這將允許在不破壞依賴關(guān)系的情況下拆分和合并模塊,因?yàn)樵寄K可以繼續(xù)存在。 他們將導(dǎo)出與以前完全相同的軟件包,即使它們可能不包含所有代碼[ 重構(gòu) ]。 在極端情況下,所謂的聚合器模塊可能根本不包含任何代碼,并且只能作為一組模塊的抽象。 實(shí)際上,來自Java 8的緊湊型概要文件就是這樣。
不同的模塊將能夠包含相同名稱的軟件包,甚至允許它們導(dǎo)出它們[ export , non-interference ]。
Oracle將利用這個(gè)機(jī)會(huì)使所有內(nèi)部API不可用 。 這將是采用Java 9的最大障礙,但肯定會(huì)樹立正確的道路。 首先,因?yàn)殛P(guān)鍵代碼現(xiàn)在對(duì)攻擊者隱藏了,所以它將大大提高安全性。 它還將使JDK的可維護(hù)性大大提高,從長遠(yuǎn)來看,這將有回報(bào)。
配置,階段和保真度
如前所述,在開發(fā)的所有階段,模塊都可以組合成各種配置。 對(duì)于平臺(tái)模塊而言,這是正確的,可用于創(chuàng)建與完整JRE或JDK,Java 8中引入的緊湊配置文件相同的映像,或僅包含一組指定模塊(及其傳遞依賴項(xiàng))的任何自定義配置[ JEP 200; 目標(biāo) ]。 同樣,開發(fā)人員可以使用該機(jī)制來組合自己的模塊化應(yīng)用程序的不同變體。
在編譯時(shí),正在編譯的代碼將僅看到由一組配置的模塊[ 編譯時(shí)配置 ]導(dǎo)出的類型。 在構(gòu)建時(shí),一個(gè)新工具(大概稱為JLink )將允許創(chuàng)建二進(jìn)制運(yùn)行時(shí)映像,該映像包含特定模塊及其依賴項(xiàng)[ 構(gòu)建時(shí)配置 ]。 在啟動(dòng)時(shí),可以使圖像看起來像僅包含其模塊的子集[ 啟動(dòng)時(shí)配置 ]。
在每個(gè)階段,都可以用較新的版本替換實(shí)現(xiàn)認(rèn)可標(biāo)準(zhǔn)或獨(dú)立技術(shù)的 模塊 [ 可升級(jí)模塊 ]。 這將替代已棄用的認(rèn)可標(biāo)準(zhǔn)覆蓋機(jī)制和擴(kuò)展機(jī)制 。
除非由于特定原因[ 保真 ]不可能,否則模塊系統(tǒng)的所有方面(例如依賴項(xiàng)管理,封裝等)在所有階段都將以相同的方式工作。
所有模塊特定的信息(例如版本,依賴項(xiàng)和包導(dǎo)出)都將在代碼文件中表示,而與IDE和構(gòu)建工具無關(guān)。
性能
整個(gè)程序優(yōu)化技術(shù)
在具有強(qiáng)封裝性的模塊系統(tǒng)中,自動(dòng)推斷將要使用特定代碼段的所有位置要容易得多。 這使得某些程序分析和優(yōu)化技術(shù)更加可行:
快速查找JDK和應(yīng)用程序類; 早期字節(jié)碼驗(yàn)證; 主動(dòng)內(nèi)聯(lián)例如lambda表達(dá)式和其他標(biāo)準(zhǔn)編譯器優(yōu)化; 構(gòu)造特定于JVM的內(nèi)存映像,該映像可以比類文件更有效地加載; 將方法主體提前編譯為本地代碼; 并刪除未使用的字段,方法和類。
拼圖項(xiàng)目:目標(biāo)與要求(草案3)
這些被標(biāo)記為全程序優(yōu)化技術(shù) ,并且至少有兩種這樣的技術(shù)將在Java 9中實(shí)現(xiàn)。它還將包含一個(gè)工具,該工具可以分析給定的一組模塊,并應(yīng)用這些優(yōu)化來創(chuàng)建性能更高的二進(jìn)制映像。
注解
自動(dòng)發(fā)現(xiàn)帶注釋的類(例如Spring允許)目前需要掃描某些指定包中的所有類。 這通常是在程序啟動(dòng)時(shí)完成的,可能會(huì)大大降低它的速度。
模塊將具有一個(gè)API,允許調(diào)用者使用給定的注釋標(biāo)識(shí)所有類。 一種設(shè)想的方法是創(chuàng)建此類的索引,該類的索引將在模塊編譯時(shí)創(chuàng)建[ 注解檢測 ]。
發(fā)布時(shí)間由droetker0912下, CC-BY-NC-SA 2.0 。
與現(xiàn)有概念和工具的集成
診斷工具(例如堆棧跟蹤)將被升級(jí)以傳達(dá)有關(guān)模塊的信息。 此外,它們將被完全集成到反射API中,該反射API可以以與類[ 反射,調(diào)試和工具 ]相同的方式來操作它們。 這將包括可以在運(yùn)行時(shí)反映和覆蓋的版本信息[ 反射API中的版本字符串 , 可覆蓋的版本信息 ]。
該模塊的設(shè)計(jì)將允許“以最少的麻煩”使用構(gòu)建工具 [ 構(gòu)建工具 ]。 模塊的編譯形式可以在類路徑上使用,也可以作為模塊使用,這樣庫開發(fā)人員就不必為類路徑和基于模塊的應(yīng)用程序創(chuàng)建多個(gè)工件( 多模式工件 )。
還計(jì)劃與其他模塊系統(tǒng)(尤其是OSGi)進(jìn)行互操作 [ 互操作 ]。
即使模塊可以從其他模塊隱藏包,也可以測試其中包含的類和接口[ 白盒測試 ]。
特定于操作系統(tǒng)的包裝
該模塊系統(tǒng)在設(shè)計(jì)時(shí)考慮了軟件包管理器文件格式“ RPM,Debian和Solaris IPS”。 開發(fā)人員不僅可以使用現(xiàn)有工具從一組模塊中創(chuàng)建特定于操作系統(tǒng)的軟件包。 這樣的模塊也將能夠調(diào)用以相同機(jī)制安裝的其他模塊[ 模塊包裝 ]。
開發(fā)人員還將能夠?qū)?gòu)成應(yīng)用程序的一組模塊打包到特定于OS的軟件包中,“最終用戶可以按照目標(biāo)系統(tǒng)的慣常方式來安裝和調(diào)用這些軟件包”。 在上面的基礎(chǔ)上,只需打包目標(biāo)系統(tǒng)上不存在的那些模塊即可[ 應(yīng)用程序打包 ]。
動(dòng)態(tài)配置
運(yùn)行中的應(yīng)用程序可以創(chuàng)建,運(yùn)行和發(fā)布多個(gè)隔離的模塊配置[ 動(dòng)態(tài)配置 ]。 這些配置可以包含開發(fā)人員和平臺(tái)模塊。
這對(duì)于諸如IDE,應(yīng)用程序服務(wù)器或Java EE平臺(tái)的容器體系結(jié)構(gòu)將很有用。
反射
我們已經(jīng)看到Project Jigsaw將帶給Java 9的大多數(shù)功能。它們都圍繞著模塊的新核心語言概念展開。
在日常編程中,最重要的可能是跨不同階段的依賴關(guān)系管理,封裝和配置。 改進(jìn)的性能始終是一個(gè)不錯(cuò)的選擇。 然后,需要投入大量工作來與現(xiàn)有工具和概念進(jìn)行合作,例如反射,診斷,構(gòu)建工具和特定于OS的打包。
等不及要嘗試了? 我也不行! 但是,我們必須等到JSR 376進(jìn)一步問世,然后才能將帶有Project Jigsaw的JDK9或JDK 9的早期訪問版本實(shí)際包含模塊系統(tǒng)。 當(dāng)它最終完成時(shí),您將在這里閱讀有關(guān)它的信息。
翻譯自: https://www.javacodegeeks.com/2015/07/the-features-project-jigsaw-brings-to-java-9.html
總結(jié)
以上是生活随笔為你收集整理的功能项目拼图将Java 9引入的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Fabric8在Kubernetes
- 下一篇: java coin介绍_代码示例中的Ja