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