拼图项目的动机和目标
幾周前,我寫了一篇關(guān)于Jigsaw項(xiàng)目如何破壞現(xiàn)有代碼的文章 。 那么,我們能得到什么回報(bào)呢? 讓我們看一下項(xiàng)目解決的痛點(diǎn)及其在Java 9中解決問題的目標(biāo)。
系列
這篇文章是正在進(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)該主題的更多文章。
總覽
在查看項(xiàng)目目標(biāo)之前,我們將首先介紹激發(fā)創(chuàng)建拼圖項(xiàng)目的痛點(diǎn)。
主要資源包括JSR 376和Java 9和Beyond ,由Mark Reinhold(Oracle Java平臺(tái)組首席架構(gòu)師)在EclipseCon 2015上發(fā)表。
痛點(diǎn)
Jigsaw項(xiàng)目旨在解決幾個(gè)難題。
JAR /類路徑地獄
很多人都寫過有關(guān)類路徑地獄和JAR地獄的文章 ,因此無需重復(fù)。
當(dāng)運(yùn)行庫(kù)解決依賴關(guān)系的方式與開發(fā)人員認(rèn)為的不同時(shí),就會(huì)出現(xiàn)此問題。 例如,這可能導(dǎo)致運(yùn)行版本錯(cuò)誤的庫(kù)。 尋找造成這種情況的原因可能非常令人不快(因此,樂觀的說法)。
發(fā)生這種情況的原因是Java運(yùn)行時(shí)加載類的方式。 該機(jī)制很脆弱(例如,取決于順序),可能很復(fù)雜(例如,具有多個(gè)嵌套的類加載器),因此很容易出錯(cuò)。 此外,運(yùn)行時(shí)無法分析需要哪些類,因此只有在運(yùn)行時(shí)才能發(fā)現(xiàn)未實(shí)現(xiàn)的依賴項(xiàng)。
通常也不可能滿足對(duì)同一庫(kù)的不同版本的依賴。
跨封裝的弱封裝
Java的可見性修飾符非常適合在同一包中的類之間實(shí)現(xiàn)封裝。 但是跨程序包邊界只有一種可見性: public 。
由于類加載器將所有已加載的程序包折疊成一個(gè)大泥球,因此所有其他類都可以看到所有公共類。 因此,無法創(chuàng)建在整個(gè)JAR中可見但不在其外部可見的功能。
這使得正確地模塊化系統(tǒng)非常困難。 如果模塊的不同部分需要某些功能(例如,系統(tǒng)的庫(kù)或子項(xiàng)目),但在模塊外部不可見,則實(shí)現(xiàn)此功能的唯一方法是將它們?nèi)糠湃胍粋€(gè)包中(因此,能見度可以使用)。 這有效地刪除了代碼以前可能擁有的任何結(jié)構(gòu)。
手動(dòng)安全
跨軟件包邊界的弱封裝的直接后果是,與安全相關(guān)的功能將暴露給在同一環(huán)境中運(yùn)行的所有代碼。 這意味著惡意代碼可以訪問關(guān)鍵功能,從而可能使其繞過安全措施。
從Java 1.1開始,這是由黑客阻止的:在與安全性相關(guān)的代碼中的每個(gè)代碼路徑上均調(diào)用java.lang.SecurityManager.checkPackageAccess并檢查是否允許訪問。 或更準(zhǔn)確地說:應(yīng)該在每個(gè)這樣的路徑上調(diào)用它。 忘記這些調(diào)用會(huì)導(dǎo)致一些漏洞,這些漏洞過去困擾著Java。
啟動(dòng)表現(xiàn)
Java運(yùn)行時(shí)加載當(dāng)前所需的類并及時(shí)編譯常用的類需要一段時(shí)間。
原因之一是,類加載對(duì)類路徑上的所有JAR執(zhí)行線性掃描。 同樣,識(shí)別所有出現(xiàn)的特定批注要求檢查類路徑上的所有類。
剛性Java運(yùn)行時(shí)
在Java 8之前,無法安裝JRE的子集。 所有Java安裝都支持例如XML,SQL和Swing,許多用例根本不需要。
盡管這與中型計(jì)算設(shè)備(例如臺(tái)式機(jī)或筆記本電腦)無關(guān)緊要,但對(duì)于最小的設(shè)備(例如路由器,電視盒,汽車以及所有其他使用Java的角落和縫隙),顯然很重要。 在當(dāng)前的容器化趨勢(shì)下,它也可能與服務(wù)器相關(guān),減少圖像的占用空間將降低成本。
Java 8帶來了緊湊的概要文件 ,這些概要文件定義了Java SE的三個(gè)子集。 他們減輕了問題,但沒有解決。 緊湊的概要文件是固定的,因此無法滿足部分JRE當(dāng)前和將來的所有需求。
發(fā)布時(shí)間由里卡多Cuppini下, CC-BY-NC-ND 2.0 。
拼圖項(xiàng)目的目標(biāo)
拼圖項(xiàng)目旨在通過引入一種語(yǔ)言級(jí)機(jī)制來模塊化大型系統(tǒng)來解決上述問題。 此機(jī)制將在JDK本身上使用,開發(fā)人員也可以在自己的項(xiàng)目上使用。 (下一篇文章中有關(guān)計(jì)劃功能的更多詳細(xì)信息。)
重要的是要注意,并非所有目標(biāo)對(duì)于JDK和我們的開發(fā)人員都同樣重要。 許多代碼與JDK更為相關(guān),并且大多數(shù)代碼不會(huì)對(duì)日常編碼產(chǎn)生巨大影響(與lambda表達(dá)式或默認(rèn)方法不同 )。 他們?nèi)詫⒏淖兇笮晚?xiàng)目的開發(fā)和部署方式。
可靠的配置
各個(gè)模塊將聲明其對(duì)其他模塊的依賴性。 運(yùn)行時(shí)將能夠在編譯時(shí),構(gòu)建時(shí)和啟動(dòng)時(shí)分析這些依賴關(guān)系,因此可以因缺少或沖突的依賴關(guān)系而快速失敗。
強(qiáng)封裝
Project Jigsaw的主要目標(biāo)之一是使模塊僅導(dǎo)出特定的軟件包。 所有其他軟件包均為該模塊專用。
模塊專用的類應(yīng)該與專用字段專用于類的方式完全相同。 換句話說,模塊邊界不僅應(yīng)確定類和接口的可見性,還應(yīng)確定其可訪問性。
馬克·雷因霍爾德(Mark Reinhold)–拼圖項(xiàng)目:將全局視為焦點(diǎn)
模塊對(duì)庫(kù)或其他模塊的依賴關(guān)系也可以保持私有。 因此,兩個(gè)模塊可以使用同一庫(kù)的不同版本,每個(gè)模塊都將其自身依賴于該代碼。 然后,運(yùn)行時(shí)將版本分開,從而防止沖突。
改進(jìn)的安全性和可維護(hù)性
模塊內(nèi)部API的強(qiáng)大封裝可以大大提高安全性和可維護(hù)性。
這將對(duì)安全性有所幫助,因?yàn)殛P(guān)鍵代碼現(xiàn)在已從不需要使用它的代碼中有效地隱藏了。 由于模塊的公共API可以更容易地保持較小的尺寸,因此使維護(hù)更加容易。
隨意使用Java SE Platform實(shí)現(xiàn)內(nèi)部的API既有安全風(fēng)險(xiǎn),又有維護(hù)負(fù)擔(dān)。 提議的規(guī)范提供的強(qiáng)大封裝將允許實(shí)現(xiàn)Java SE平臺(tái)的組件阻止對(duì)其內(nèi)部API的訪問。
JSR 376
性能提升
通過明確使用代碼的范圍,可以更有效地利用現(xiàn)有的優(yōu)化技術(shù)。
當(dāng)已知某個(gè)類只能引用其他一些特定組件中的類,而不引用運(yùn)行時(shí)加載的任何類時(shí),許多提前進(jìn)行的全程序優(yōu)化技術(shù)可能更有效。
JSR 376
也可以為有關(guān)現(xiàn)有注釋的代碼編制索引,以便無需進(jìn)行完整的類路徑掃描就可以找到此類。
可擴(kuò)展平臺(tái)
通過將JDK模塊化,用戶可以選擇自己需要的功能,并創(chuàng)建僅由所需模塊組成的自己的JRE。 這將保持Java作為小型設(shè)備和容器的關(guān)鍵角色的地位。
擬議的規(guī)范將允許Java SE平臺(tái)及其實(shí)現(xiàn)分解為一組組件,開發(fā)人員可以將它們組裝成僅包含應(yīng)用程序?qū)嶋H所需功能的自定義配置。
JSR 376
反射
我們已經(jīng)看到Java在加載類的方式,在龐大且不斷增長(zhǎng)的,剛性的運(yùn)行時(shí)中封裝方面存在一些問題。 Jigsaw項(xiàng)目旨在通過引入一種模塊化機(jī)制來解決此問題,該機(jī)制將應(yīng)用于JDK,并且也將對(duì)用戶可用。
它保證了可靠的配置和強(qiáng)大的封裝,可以使JAR / classpath成為過去。 它可以用來提高安全性,可維護(hù)性和性能。 最后重要的一點(diǎn)是,這將允許用戶創(chuàng)建特定于他們自己的Java運(yùn)行時(shí)。
本系列的下一篇文章將討論P(yáng)roject Jigsaw將帶給Java 9的功能。敬請(qǐng)期待!
翻譯自: https://www.javacodegeeks.com/2015/06/motivation-and-goals-of-project-jigsaw.html
總結(jié)
以上是生活随笔為你收集整理的拼图项目的动机和目标的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎样用无线网卡连电脑上网(电脑怎样连接无
- 下一篇: 异常作弊– Java 8 Lambdas