1. 程式人生 > >【傳智播客鄭州校區分享】Java9模組化系統

【傳智播客鄭州校區分享】Java9模組化系統

眾所周知,標準jre中rt.jar是一個重量級的檔案,其不僅僅包含了java應用執行所依賴的檔案,而且其自身也非常的龐大,即便是我們僅僅編寫一個入門級的HelloWorld程式,依然要毫無保留的載入這個大塊頭。以jre7(後續版本jrd更大)為例,它就有57.2M,可以想象如此龐大的jre如何執行在小型或微型的裝置上呢?或者說讓我們有選擇的使用一個輕量化的jre而不是jre的全部,那麼要解決這個問題就要對jre中眾多的類或包進行邏輯劃分。

經歷漫長的等待和煎熬orcale終於在java se 9中融入了的模組化系統,這讓全世界java程式設計師激動不已。與包相比,模組中可以包含一個或更多的包,能夠更好的對包進行組織與管理,具有比包更強的封裝性,能夠實現更細化的訪問控制和更大粒度的程式碼重用,真正實現功能模組化配置靈活的搭積木式的程式開發。

我們要用好這個模組化的java se,首先要熟悉下java se大概被分成了那些模組呢?是這樣的,Java9標準模組以java作為字首。以下是部分標準模組名稱:

如:java.base,java.naming,java.activation和java.logging等。而java.base是最基礎最核心的模組,其中封裝了開發者最常用的包,如:java.io,java.lang,java.math,java.net,java.text,java.util等等。

Java9非標準模組以jdk作為字首。 以下是部分非標準模組名稱:jdk.accessibility,jdk.attach,jdk.charsets,jdk.compiler, jdk.httpserver等等。

其他模組就不在這裡贅述了。下面基於命令列演示模組入門的宣告與使用步驟:

1.首先在某個盤下自定義一個目錄moduledemo;

2.在這個名為moduledemo目錄中建立一個名為cn.itcast.modules.mymodule的目錄(這個目錄就是我們的模組資訊存放目錄了,也是我們自定義模組的名稱)

3.在模組目錄cn.itcast.modules.mymodule中建立一個名稱必須為module-info.java的java檔案

4.開啟module-info.java進行編輯,加入如下內容:

module cn.itcast.modules.mymodule{   }

其中:module是定義模組的關鍵字;cn.itcast.modules.mymodule是自定義的模組名稱,該名稱要和模組目錄的名稱cn.itcast.modules.mymodule一致

5.在模組目錄cn.itcast.modules.mymodule中建立名稱為cn的資料夾,在cn資料夾的內部建立itcast資料夾,在itcast資料夾中建立Hello.java檔案。

6.編輯Hello.java檔案,加入如下內容:

package cn.itcast;
public class Hello{
public static void main(String []args){
System.out.println("Hello Module!!!");
}
}

最簡單的模組就開發完畢,下面進行編譯和執行, 在命令列中進入moduledemo目錄,然後輸入:

javac -d byteoutdir --module-source-path . cn.itcast.modules.mymodule/module-info.java cn.itcast.modules.mymodule/cn/itcast/Hello.java

其中:-d:指定位元組碼class的輸出目錄;byteoutdir:自定義的位元組碼檔案的儲存目錄;--module-source-path:指定模組的原始碼路徑;

當沒有任何的錯誤提示說明編譯通過了。輸入如下命令執行編譯後的Hello:

java --module-path byteoutdir -m cn.itcast.modules.mymodule/cn.itcast.Hello

執行後會在控制檯輸出:Hello Module!!!

上面演示了模組最基本的使用方法, 下面再演示一個使用java.sql模組的方法。在現有模組目錄cn.itcast.modules.mymodule中新增一個新的包,包名com在該包下建立一個JDBCDemo.java的檔案,這樣就在cn.itcast.modules.mymodule模組中有cn.itcast和com兩個包

JDBCDemo.java檔案的內容如下:

package com;
import java.sql.Connection;

public class JDBCDemo{

public static void main(String []args){
   /*使用java.sql包中的介面
需要在module-info.java檔案中對java.sql模組進行宣告*/
Connection conn=null;  
}
}

現在可以編譯模組了,輸入:

javac -d byteoutdir --module-source-path . cn.itcast.modules.mymodule/module-info.java cn.itcast.modules.mymodule/cn/itcast/Hello.java cn.itcast.modules.mymodule/com/JDBCDemo.java

發現這次不能通過編譯了,錯誤資訊如下:

程式包java.sql不可見
程式包java.sql已在模組java.sql中宣告,但模組cn.itcast.modules.mymodule未讀取它

這是因為模組系統模組間彼此是隔離的,模組中包的可見性受到了模組隔離性的限制,儘管我們在JDBCDemo.java中匯入了

import java.sql.Connection;

但是這個包是不可見的,需要編輯模組資訊檔案module-info.java,最終的程式碼如下:

module cn.itcast.modules.mymodule{

requires java.sql; //宣告依賴的模組,以便該模組中的類可以使用聲明後的模組
}

有了以上的requires java.sql宣告部分我們在JDBCDemo.java中匯入import java.sql.Connection就有效了。

下一步就可以把我們封裝的模組打包為jar檔案了(限於篇幅不在贅述),這個jar檔案是可以被重用的,最重要 的是這個jar檔案還很小巧,我們甚至可以藉助於jlink把模組打包成可以在任何小型甚至微型裝置上執行的程式,這些都是模組化取得的巨大進步了。