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