netbeans 9_NetBeans 9抢先体验
netbeans 9
Java 9即將來臨,NetBeans 9也即將來臨。在本文中,我們將看到NetBeans 9 Early Access為開發人員提供的支持,以幫助他們構建Java 9兼容的應用程序。
Java 9提供了許多(大約90種) 新功能,包括模塊和JShell,Read-Eval-Print-Loop(REPL)等。 您可能會在本文末尾的參考資料中找到更多信息,尤其是有關NetBeans 9支持JDK 9的鏈接 。
在本文中,我們將學習如何:
1.構建OpenJDK 9 EA
OpenJDK是任何JDK增強建議 (JEP)甚至Java規范請求 (JSR)的參考實現。 您可能有很多原因,為什么要從源代碼構建它而不下載預構建的二進制文件之一 ,例如:
- 強制您從源代碼構建開源項目的公司政策
- 您希望獲得最新的搶先使用OpenJDK
- 您想要為您的特殊平臺構建
當然,您可以通過下載預構建的二進制文件來繼續本文。 但是,如果您想學習如何構建JDK 9,請繼續閱讀。 構建自己的JDK映像具有許多優點,例如,您不需要安裝任何東西或進行修改,例如,MacOS上的Windows注冊表或Java Preferences面板會破壞當前的默認JDK(請參見本文 )。 可執行文件將始終在同一位置創建,并且通過更新存儲庫并重新構建源代碼,您始終可以擁有最新版本。
您可以下載最新的OpenJDK 9二進制文件此頁面。 資料可以在Mercurial資料庫中找到。 例如OpenJDK 9倉庫在這里 ; 如果希望參與項目,那么Jigsaw回購項目將包含模塊化實現的主要內容。 在下面,您將獲得有關如何構建OpenJDK 9的一些技巧。
上面的命令構建了OpenJDK的最新版本。 如果您希望構建OpenJDK的早期版本,則需要遵循以下提示:
二進制文件是在build/<platform_dir>/jdk中創建的,例如,如果您在build/macosx-x86_64-normal-server-release/jdk使用Mac。
2.構建和配置NetBeans 9 EA
您可以從http://wiki.netbeans.org/ JDK9Support下載具有JDK 9支持的最新NetBeans或從以下來源進行構建:
二進制文件在nbbuild/netbeans創建。 將其配置為與JDK 8或JDK 9 EA( etc/netbeans.conf )一起運行。 jshell ,要啟用jshell ,您需要使用JDK 9 EA設置NetBeans 9。 因此,編輯etc/netbeans.conf以指向您在步驟1中構建的JDK 9 EA:
netbeans_jdkhome="<path to OpenJDK 9 EA>/build/<platform_dir>/jdk"
請備份此文件,因為下次構建NetBeans時,它將被覆蓋,因此您將不得不再次進行此修改。
通過發出以下命令來啟動netbeans: bin/netbeans或bin\netbeans.exe具體取決于您的平臺。 通過工具 | NetBeans將最新的JDK 9 EA構建注冊為Java平臺 。 Java 平臺| 添加平臺 (參見圖1),然后選擇在步驟1中構建的OpenJDK 9 EA。
圖1 –將JDK 9 EA平臺添加到NetBeans 9 EA
3. NetBeans 9 EA中的JShell支持
如果使用JDK 9實現啟動了NetBeans 9,則可以從菜單工具|菜單|菜單中訪問JShell 。 打開Java Platform Shell 。 JShell的工作原理與命令行相同,并且NetBeans快捷方式也可以使用它(例如sout --> (tab) )。 您可以在參考資料中閱讀有關JShell的更多信息。
圖2 – NetBeans 9 EA中的JShell。
4. NetBeans 9 EA中的模塊支持
NetBeans 9 EA提供了許多好處,可以幫助您進行模塊化項目。 在繼續之前,您必須在“ 工具” |“設置”中設置JDK 9 EA平臺。 Java 平臺| 添加平臺并選擇您在步驟1中構建的OpenJDK 9 EA二進制文件的路徑。
要將現有項目轉換為模塊,您需要執行兩項任務:
圖3 –將Java平臺設置為JDK 9 EA
圖4 –將Java Sources設置為JDK 9
圖5 –添加Java模塊信息
module-info.java必須始終位于NetBeans 9中Java項目的根目錄中。這是NetBeans 9中的一項限制,而不是JDK 9中的一項限制。唯一的例外是,我們可以在一個目錄中包含多個module-info.java文件。一個Java項目就是我們進行單元測試的時候。 您可以在Test Packages添加module-info.java文件。
但是,讓我們通過在NetBeans 9 EA中實現項目Jigsaw的快速入門指南來了解NetBeans 9 EA模塊的支持。
我的第一個使用NetBeans 9的模塊化應用程序
第一個示例是名為com.greetings的模塊,該模塊僅顯示“ Greetings!”。 該模塊包含兩個源文件:模塊聲明( module-info.java )和主類。
按照約定(模塊名稱可以是Java限定的標識符),模塊的源代碼位于模塊名稱的目錄中(在本例中為com.greetings ),即使這不是必需的。
通過執行以下步驟在NetBeans中創建一個新的Java項目:
您應該看到一個名為com.greetings的Java項目,并且在其中包含一個包含main()方法的com.greetings.Main類。 像這樣修改它:
com.greetings.Main
package com.greetings;/** @author javacodegeeks */ public class Main {/** @param args the command line arguments */public static void main(String[] args) {System.out.println("Greetings!");} }要將Java項目轉換為模塊, module-info.java按照前面所述添加module-info.java ,即,右鍵單擊項目名稱并選擇File | File。 新檔案…| Java(類別)| Java模塊信息(文件類型) 。
在項目的根包中創建一個空的module-info.java 。 按照Jigsaw教程重命名,如下所示:
com.greetings.module-info.java
module com.greetings { } 您必須清理并構建項目才能使模塊重命名生效并成功運行。 您應該看到消息“問候!” 在輸出窗口中。
使用NetBeans,您無需關心命令行語法以及javac和java命令的參數。 這些由NetBeans IDE負責。
添加依賴
第二個示例更新模塊聲明以聲明對模塊org.astro的依賴。 模塊org.astro導出API包org.astro 。
按照上一org.astro的步驟創建一個名為org.astro的新Java項目。 這次不要創建Main Class。 創建項目后,右鍵單擊它,然后選擇“ 新建” |“新建”。 Java類…輸入World作為類名稱,輸入org.astro作為包名稱,然后單擊Finish 。 像這樣更新新創建的類:
org.astro.World.java
package org.astro;/** @author javacodegeeks */ public class World {public static String name() {return "world";} }添加module-info.java就像我們對以前那樣com.greetings 。
org.astro.module-info.java
module org.astro { }不要忘記清理和構建模塊重命名才能生效。
現在,我們需要從com.greetings模塊到org.astro模塊添加一個依賴關系,以便使用其方法World.name() 。 但是在此之前, org.astro必須導出包含此方法的軟件包。 這兩個動作都需要在兩個模塊的module-info.java文件中進行。 NetBeans 9為您提供了有關如何執行操作的有用提示。
圖6 –模塊信息命令
圖7 –循環依賴性錯誤
com.greetings.Main.java
package com.greetings; import org.astro.World; /** @author javacodegeeks */ public class Main {/** @param args the command line arguments */public static void main(String[] args) {System.out.format("Greetings %s!%n", World.name());} }當您粘貼新的System.out.format(...)語句時,NetBeans會識別World類,并建議添加import語句。 這是唯一可能的,因為您已經更新了兩個模塊的module-info.java文件,如下所示:
com.greetings.module-info.java
module org.astro {exports org.astro; }org.astro.module-info.java
module com.greetings {requires org.astro; }NetBeans 9 EA為您提供了依賴性的可視化表示(模塊圖)。 只需在org.greetings module-info.java編輯器中單擊Graph按鈕,即可看到模塊依賴關系的漂亮圖表,如下圖所示。
圖8 –模塊圖
運行com.greetings模塊以查看輸出: Greetings world! 如預期的那樣。
與項目Jigsaw的原始快速入門指南進行比較,以了解使用NetBeans IDE節省了多少鍵入內容。
包裝模塊
使用NetBeans打包模塊非常容易。 右鍵單擊項目com.greetings然后從彈出菜單中選擇“ 屬性 ”。 在Project Properties對話框(圖9)中,單擊Build下的Packaging類,然后選擇Create JLink distribution和Create Launcher并單擊OK 。 下次清洗和構建NetBeans時,將在com.greetings Java項目的dist文件夾內生成Java運行時映像,其中僅包含運行com.greetings所需的JDK模塊(即,僅java.base模塊)。 無需記住jlink命令的語法。
圖9 –包裝模塊
Java模塊化項目
正如我們一開始提到的,NetBeans 9每個Java項目僅允許一個模塊。 但是,使用Java模塊化項目可以在這個特殊的Java項目中定義許多模塊。 我們將使用Java模塊化項目重新實現先前的模塊。 這是一個基于ant的項目,其中包含多個模塊并立即對其進行編譯。
圖10 –新的Java模塊化項目
圖11 – Java模塊化項目
您會看到Java Modular Project具有許多優點,例如您不需要將其他項目顯式添加到Module路徑。 當您更新module-info.java時,這是自動完成的。
服務
松耦合是指其中每個組件對其他獨立組件的定義了解很少或不了解的系統。 這使各個組件可以獨立更改,而不會影響其他組件。
但是,讓我們描述一個示例,以深入了解《 快速入門指南》的詳細內容。
假設您有一個提供服務的提供者。 例如,這可以是AlertService (提供各種系統或應用程序警報), CoordinatesProvider (提供各種坐標系統,例如緯度/經度,GEOREF,UTM等), AlgorithmProvider (提供針對問題的各種算法解決方案)等為了實現松散耦合,您可以為調用程序類提供一個接口,以隱藏其背后的實際實現。 調用者(或服務使用者)類不需要了解任何實際的實現。 他們只需要知道如何訪問相關方法即可。 然后,在運行時以某種方式將實現提供給調用方類。 這樣,只要Provider接口不更改,實際的實現就可以在任何時候更改而無需調用者類知道。
有多種方法可以實現松散耦合。 這通常是由服務提供商完成的。 服務定位器設計模式提供了對服務的全局訪問點,而無需將調用者(服務使用者)耦合到實現該服務的具體類上。 例如, Spring使用依賴注入 ( 控制反轉的一種形式),NetBeans的RCP 模塊化API使用Lookups和ServiceProviders等。Jigsaw使用Java 6中的ServiceLoader 。服務使用者和服務提供者類可以駐留在不同的模塊中。
從拼圖快速入門指南 ,模塊com.socket提供服務NetworkSocketProvider為NetworkSocket秒。 在兩個不同的模塊中提供了此服務的兩種實現: org.fastsocket和org.smartsocket 。 我們的服務使用者模塊com.greetings僅需要依賴com.socket服務提供者模塊, com.greetings需要依賴服務實現模塊。
圖12 –服務提供商
讓我們看看如何實現這一目標。 在NetBeans 9 EA中,如我們之前com.socket ,創建一個新的Java Project com.socket ,而不提供Main類。
如《 快速入門指南》中所述,創建兩個類com.socket.NetworkSocket和com.socket.spi.NetworkSocketProvider ,添加新的module-info.java以將項目轉換為Java 9模塊并將這兩個包導出到使用者類:
com.socket.module-info.java
module com.socket {exports com.socket;exports com.socket.spi;uses com.socket.spi.NetworkSocketProvider; }最后一條語句聲明此模塊向使用者提供com.socket.spi.NetworkSocketProvider服務。 不要忘記清理并構建此模塊,以使更改生效。
接下來,讓我們創建org.fastsocket模塊。 與之前一樣,按照《 快速入門指南》中的描述創建兩個類org.fastsocket.FastNetworkSocket和org.fastsocket.FastNetworkSocketProvider ,添加一個新的module-info.java以將項目轉換為Java 9模塊,并為com.socket添加依賴項com.socket模塊:
org.fastsocket.module-info.java
module org.fastsocket {requires com.socket;provides com.socket.spi.NetworkSocketProviderwith org.fastsocket.FastNetworkSocketProvider; }最后一條語句提供com.socket.spi.NetworkSocketProvider服務提供程序的實現。 請注意,這個模塊不出口任何包!
但是,該項目包含編譯錯誤。 你能說出為什么嗎?
我們需要將com.socket添加到modulepath中(如果您不記得該怎么做,請參考本文前面的內容)。 清理并構建以確保沒有錯誤。
您可以重復上述步驟以類似的方式創建org.smartsocket ,但是,快速入門指南并沒有這樣做,因此,您可以根據需要創建自己的實現。
最后,創建消費者com.greetings Java項目(使用另一個目錄不亂用的com.greetings模塊我們在第一章4.1和4.2創建)與com.greetings.Main類,從的內容復制快速入門指南 ,添加一個新的module-info.java ,將項目轉換為Java 9模塊,并向com.socket添加一個依賴com.socket :
com.greetings.module-info.java
module com.greetings {requires com.socket; }確保您添加了模塊com.socket并完成。 清理并構建,然后運行com.greetings ,您將看到一個錯誤:
運行時異常
Exception in thread "main" java.lang.RuntimeException: No service providers found!at com.socket/com.socket.NetworkSocket.open(NetworkSocket.java:19)at com.greetings/com.greetings.Main.main(Main.java:8)為什么? 我們確實做了《 快速入門指南》中提到的內容。 NetBeans Java項目要求您在模塊路徑中添加org.fastsocket (然后將其自動添加到module-info.java ),然后該異常消失:
org.fastsocket.FastNetworkSocket
class org.fastsocket.FastNetworkSocket作為練習,您可以使用Java模塊化項目重復上述操作。 在這里,你不需要添加服務提供者實現模塊(如org.fastsocket )到模塊路徑com.greetings 。
但是它是如何工作的呢? 拼圖使用ServiceLoader來定位各種服務提供者實現:
服務加載器
ServiceLoader<NetworkSocketProvider> sl= ServiceLoader.load(NetworkSocketProvider.class); Iterator<NetworkSocketProvider> iter = sl.iterator();sl.iterator()將遍歷org.fastsocket.FastNetworkSocketProvider和com.smartsocket.SmartNetworkSocketProvider (如果已實現)。
在后臺, ServiceLoader創建一個提供程序配置文件,該文件存儲在服務提供程序的JAR文件的META-INF/services目錄中。 配置文件的名稱是服務提供者的完全限定的類名稱,其中名稱的每個組成部分均以句點( . )分隔,而嵌套的類則以美元符號( $ )分隔。 換句話說, ServiceLoader在模塊的build/classes/META-INF/services/文件夾(或dist/provider.jar )內創建一個文本文件package.Provider ,其中包含實現類的標準名稱,例如package.ProviderImpl 。
在我們的示例中, com.socket/build/classes/META-INF/services/包含文本文件com.socket.spi.NetworkSocketProvider ,其中包含實現類org.fastsocket.FastNetworkSocketProvider (和com.smartsocket.SmartNetworkSocketProvider標準名稱com.smartsocket.SmartNetworkSocketProvider如果已實現)。
至少,如果使用Java 6 ServiceLoader ,這應該是“幕后”實現! 不幸的是,Java 9修改了ServiceLoader的實現。
Java 6 ServiceLoader具有許多限制:
- 它不是動態的(您無法在運行時安裝/卸載插件/服務)
- 它會在啟動時加載所有服務(因此需要更長的啟動時間和更多的內存使用量)
- 無法配置; 有一個標準的構造函數,它不支持工廠方法
- 它不允許進行排名/排序,即我們無法選擇要首先加載的服務(服務的排序是在發現時進行的)
此外,Java 9對Java 6 ServiceLoader進行了如下修改:
- 沒有相關服務; 新的基于模塊的服務定位器沒有相對行為
- 服務訂購(如發現)丟失
- 模塊路徑上的所有服務接口和實現均被展平為單個全局名稱空間
- 服務加載沒有可擴展性/可定制性; 服務層提供者必須預先提供可用服務的固定映射
- 多站點聲明; 每個使用服務的模塊還必須在模塊描述符中聲明正在使用該服務; 沒有全局的全層服務注冊表
換句話說,如果您搜索com.socket/build/classes/META-INF/services/或com.socket/dist/com.socket.jar/META-INF/services/您將一無所獲。
NetBeans RCP改為提供ServiceProvider ,它沒有上面提到的ServiceLoader的缺點。 它是動態的,因此您可以在應用程序運行時插入/拔出模塊,它不會在啟動時加載所有服務,并允許您設置優先級(使用@ServiceProvider批注的position屬性)。 不幸的是,它不適用于拼圖。
5. NetBeans的進一步改進
要使程序包可用于其他模塊,必須編輯module-info.java并添加一個exports語句,將程序包名稱作為參數傳遞。 這將導致包圖標更改為具有打開鎖的圖標,而不是已鎖定的圖標。
一個不錯的快捷方式是能夠右鍵單擊一個包,然后選擇一個動作Export Package ,如下圖所示,該操作將相應地自動修改module-info.java ,而無需鍵入export命令。
圖13 – NetBeans的改進; 添加導出包菜單項
NetBeans RCP 模塊API (NetBeans胖客戶端平臺隨附的API)中已經存在此功能。
在由許多模塊組成的項目中,通常很難找到依賴項存在于哪個模塊中。 一個很好的補充就是能夠在整個模塊(和/或庫模塊)中搜索我們要查找的類。 NetBeans RCP 模塊API (NetBeans胖客戶端平臺隨附的API)中已經存在類似的功能。
當由于NetBeans找不到依賴項而遇到錯誤時,單擊提示blob將打開一個對話框,開發人員可以在其中鍵入所需的類,如下圖所示,然后選擇適當的模塊。 當開發人員請求將模塊依賴項添加到模塊路徑時(例如,通過右鍵單擊Libraries ),可以訪問相同的對話框。
圖14 – NetBeans的改進; 搜索模塊的依賴關系
最后,可以將一個新模塊添加到Java Modular Project中,但是無法刪除模塊,盡管至少要編寫這些行。 這是一個固定的EA錯誤。
NetBeans 9 EA仍在大量開發中,尚未通過官方測試(也稱為NetCat),因此在此階段會遇到一些錯誤或奇怪行為是正常的。
六,結論
在本文中,我們了解了NetBeans 9 EA如何支持JDK 9 EA并簡化了開發人員的工作。 作為開發人員,您無需記住如何使用模塊路徑來構建和執行Java模塊的細節,或者如何jlink命令的細節。 NetBeans 9隱藏細節。 JShell也很好地集成了。 當然,某些改進可以使開發人員的生活更加輕松,但是這些改進將在將來的NetBeans版本中或作為插件出現。
我們看到了可以用來創建模塊化Java應用程序的兩種項目。 我們看到了可以在module-info.java內部使用的五個可用命令中的四個: exports, requires, uses和provides 。 opens允許其他模塊使用反射來訪問您打開的包中的類型。
可以“打開”普通模塊中的特定程序包,以便僅該程序包可在運行時進行深度反射:
com.greetings.module-info.java
module com.greetings {opens com.greetings; }一些Java框架和工具在運行時嚴重依賴反射來訪問未導出模塊的代碼。 它們提供了諸如依賴項注入,序列化,Java Persistence API的實現,代碼自動化,調試等功能。例如Spring和Hibernate。 這些框架和庫不知道您的應用程序模塊,但是它們需要訪問模塊的類型和私有成員,這打破了JDK 9中強封裝的前提。還可以打開整個模塊進行反射,例如:
com.greetings.module-info.java
open module com.greetings {requires com.socket; }與opens與exports進行比較, exports語句使您只能在編譯時和運行時訪問指定程序包的公共API,而opens語句使您可以在運行時使用反射來訪問指定程序包中所有類型的公共和私有成員。
與拼圖游戲配合使用時,玫瑰花還不是全部。 專家社區尚未接受拼圖,并且對他們遇到的許多嚴重缺陷有很多擔憂。
7.參考
翻譯自: https://www.javacodegeeks.com/2017/07/netbeans-9-early-access.html
netbeans 9
總結
以上是生活随笔為你收集整理的netbeans 9_NetBeans 9抢先体验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ddos被抓(ddos抓捕)
- 下一篇: 通知摆酒信息(摆酒备案)