javaone_JavaOne 2015:高级模块化开发
javaone
JavaOne 2015看到了Project Jigsaw團隊關于Java 9中的模塊化的一系列討論 。它們都是非常有趣的,并且充滿了寶貴的信息,我敦促每個Java開發人員都注意它們。
除此之外,我想給社區一種搜索和引用它們的方法,因此我在這里總結一下:
- 準備JDK 9
- 模塊化開發簡介
- 先進的模塊化開發
- 拼圖項目的幕后花絮(即將上映)
我努力鏈接到盡可能多的外部資源,以使各個帖子簡短。 播放圖標將帶您直接進入Oracle每天為每個房間在線播放的長達十小時的視頻流中的相應點。 (很棒的格式,伙計們!)(到目前為止)他們不僅弄亂了聲音,而且似乎還訴諸于低音量的單聲道聲音,因此請確保提高音量。
讓我們以介紹為基礎,并提供一些高級模塊化開發和遷移建議!
總覽
- 內容 :如何將應用程序和庫遷移到模塊系統
- 演講者 :馬克·萊因霍爾德,亞歷克斯·巴克利,艾倫·貝特曼
- 鏈接 : 視頻和幻燈片
引言
馬克·雷因霍爾德(Mark Reinhold)首先強調當前的原型仍在開發中,該提案存在一些粗糙的邊緣和遺漏的部分。 拼圖團隊花費大量時間談論它的原因是為了傳播信息并收集反饋。
因此,請嘗試并提供反饋!
應用程序遷移
版權所有?2015,Oracle和/或其分支機構。
版權所有。
在演講的第一部分中,Alex Buckley介紹了如何將應用程序遷移到模塊系統。 他在假設應用程序的依賴項尚未發布為模塊的情況下對此進行了討論。 (因為如果這樣的話,這將是相當簡單直接的。)
自上而下的遷移
每當將JAR轉換為模塊時,都必須回答兩個問題:
- 該模塊需要什么?
- 模塊輸出什么?
可以在jdeps的幫助下回答第一個問題。 第二個要求模塊的作者有意識地決定哪些包包含其公共API。
然后,必須按照模塊化開發簡介和快速入門指南中的說明將這兩個答案都輸入到module-info.java中。
自動模塊
Buckley現在解決了他的示例的一個內在問題:如何處理尚未發布為模塊的應用程序依賴項? 解決方案是自動模塊 。
版權所有?2015,Oracle和/或其分支機構。
版權所有。
只需將JAR放置在模塊路徑而不是類路徑上,它便成為自動模塊。 這是一個完整的模塊,但不需要更改JAR本身。 它的名稱是從JAR名稱派生的,并導出所有包。 它可以讀取模塊路徑上的所有模塊(通過隱式要求所有模塊) 和類路徑上的所有類。
這為遷移JAR文件提供了最大的兼容性。
系統結構
即使使用了一些自動模塊,它們在模塊路徑上增加了很多優勢,但情況還是比類路徑要好。 那里的所有內容都可以訪問其他所有內容,并且JVM只是消除了開發人員設想的任何系統結構。
編譯并運行示例
該示例已編譯并使用快速入門指南中涵蓋的命令運行。
Buckley還演示了javac標志-modulesourcepath來啟用多模塊編譯 。 它需要一個目錄,并且期望每個模塊包含一個子目錄。 然后,每個模塊目錄都可以包含構建模塊所需的源文件和其他資源。 這對應于JEP 201和
摘要
對于自上而下的遷移,可通過為應用程序的JAR創建module-info.java文件將其轉換為模塊。 通過將依賴項放在模塊路徑而不是類路徑上,可以將它們轉換為自動模塊。
圖書館遷移
艾倫·貝特曼(Alan Bateman)從不同的角度看待同一場景。 他正在展示如何將庫轉換為模塊,而不需要應用程序使用它們來完成。
自下而上的遷移
對于庫,需要回答與應用程序模塊相同的問題:
- 該模塊需要什么?
- 模塊輸出什么?
再次, jdeps被帶出回答第一個。 但是,這里的Bateman還演示了如何使用-genmoduleinfo標志生成module-info.java文件的初稿。 在這種模式下, jdeps從JAR名稱中獲取模塊名稱,需要正確的依賴關系,并簡單地導出所有軟件包。 然后,模塊作者應確定要導出的出口。
然后,Bateman像上面和快速入門指南中所述編譯和打包模塊。
混合類路徑和模塊路徑
該應用程序尚未轉換為模塊,這有兩個含義:
版權所有?2015,Oracle和/或其分支機構。
版權所有。
- 運行它既需要類路徑又需要模塊路徑。
- 該應用程序無法表達其依賴的模塊。
在命令行上混合類和模塊路徑是冗長但直接的。 最重要的是,必須使用標志-addmods來指定模塊系統必須根據其解析模塊路徑的根模塊。 在正在運行的示例中,這將是新轉換的庫模塊。
高級遷移挑戰
在給出的示例中,新創建的庫模塊之一使用反射來訪問應用程序的代碼。 這是有問題的,因為模塊只能從它們所依賴的模塊訪問代碼,而顯然庫不能依賴于使用它們的應用程序。
解決方案是對新類java.lang.Module的addReads 。 它可用于允許調用方法的模塊讀取指定的模塊。 要獲取模塊,請調用Class.getModule()。
放在一起
版權所有?2015,Oracle和/或其分支機構。
版權所有。
將這兩種方法放在一起會產生一個不錯的依賴關系圖和啟動應用程序的超短命令。
然后,Bateman繼續使用jlink將生成的應用程序打包到具有jlink的最小獨立運行時映像中,如模塊化開發簡介中所述 。
摘要
總之,這兩種方法顯示了應用程序和庫維護者如何按照自己的進度獨立地模塊化他們的項目。 但是請注意,可能需要更改一些代碼。
繼續模塊化!
由Joe Parks在CC-BY-NC 2.0下發布 。
問題
絕大多數問題都很有趣,所以我們開始吧。
有人可以覆蓋您的安全軟件包嗎?
拼圖團隊正在制作可選驗證步驟的原型。 在構建時,它將計算模塊的強哈希并將其烘烤到模塊中。 然后它將在啟動時驗證哈希。
是否可以訪問未導出的類型?
不是來自代碼。 如果某些類型必須以這種方式可用(例如,用于依賴項注入框架),則必須將其導出。 故意沒有辦法用反射破壞模塊封裝。
但是可以使用命令行標志-XaddExports,如JEP 261中的 “破壞封裝”一節中所述。
拼圖與OSGi兼容嗎?
不,但是OSGi將在其之上運行。
模塊可以包含DLL,SO嗎?
JNI的工作原理與以前完全相同,模塊可以包含各種資源,包括特定于OS的庫。
為什么在module-info.java中未指定主類?
因為對于編譯器和JVM而言,它不是必不可少的信息。 實際上,它甚至不是程序的必要屬性,因為對于同一項目版本的不同部署,它可能會更改。
如何表達對未模塊化JAR的依賴性?
該庫可以要求其依賴關系,如上所示。 如果尚未將其模塊化,則文檔應提及它們仍必須添加到模塊路徑(與類路徑相對)中。 然后將它們轉換為自動模塊,從而使它們可用于庫。 當然,類路徑仍然是出口,并且庫始終可以放在此處,并且所有內容都像以前一樣工作。
另外,如果項目之間的協作受到限制,Buckley建議使用反思。 然后,該庫將不必要求其依賴關系,而是在運行時開始讀取它,而不管它是放在類還是模塊路徑上。
那么像Maven這樣的工具呢?
拼圖團隊希望與所有工具供應商合作以提供支持,但目前尚無計劃,因為它還為時過早。
Buckley試圖通過將模塊系統結合到工具中作為一個分布式問題來管理期望。 Java 9發行版不應被視為所有事物必須完美協作的起點,而應被視為使一切相互協作的起點。
那(上下文)類加載器呢?
模塊系統幾乎與類裝載機正交,并且應該沒有問題的相互作用。 加載程序被描述為低級機制,而模塊則是更高的抽象。
有關更多詳細信息,請等待Jigsaw項目幕后的概覽。
是否可以將多個模塊打包到一個JAR中?
或者換句話說,是否有可能構建一個包含多個模塊(通常是其所有依賴項)的fat / uber JAR?
目前尚不支持,但是創建映像可能是某些用例的解決方案。 由于這個問題反復出現,Reinhold承諾會考慮一下。
翻譯自: https://www.javacodegeeks.com/2016/01/javaone-2015-advanced-modular-development.html
javaone
總結
以上是生活随笔為你收集整理的javaone_JavaOne 2015:高级模块化开发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux查看java进程命令(linu
- 下一篇: 招聘备案制(选聘备案制)