衆所周知,标準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){ 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把子產品打包成可以在任何小型甚至微型裝置上運作的程式,這些都是子產品化取得的巨大進步了。