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