1. 程式人生 > >Java9模塊化系統

Java9模塊化系統

java模塊化

眾所周知,標準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把模塊打包成可以在任何小型甚至微型設備上運行的程序,這些都是模塊化取得的巨大進步了。

Java9模塊化系統