關於Java9的模塊化文檔真的很少,網上也沒有搜到有推薦使用Java9的Module開發的。
但是從JDK9開始其構造和JDK8有了本質的區別,JDK8的時候其結構是按照package來區分,但是JDK9採用的是Module。這些都不是本文要說的,以後再單獨列篇文章說這塊。
這裏給出一個簡單的Java9 module+SpingBoot+Maven的Demo僅供大家參考,有不足的地方還請指正。
環境
- JAVA9+
- Spring Boot2.0+
- 3.5(貌似3.2+就可以)
我用的是Java9+SpringBoot2.0+Maven3.5
首先來看下目錄結構
我這裏建了三個Module,注意目錄結構的特點,每個子Module的java同級目錄都有一個module-info.java文件。
關於module-info.java的名稱和位置建議大家還是別亂動的好。
SpringFirst是項目的入口,對外的API都在這(目前只給出一個簡單的獲取用戶信息的接口),SpringSecond是Service相關,SpringThird只有一個User的實體類。這裏爲了更好的說明Java9 Module的一些特性特意分成這三塊。
Spring相關的引用我都放到了最外層的pom中,大家可以自己看下代碼,後邊我會給出Git地址。
先來看SpringFirst的pom
<dependencies>
<dependency>
<groupId>com.pk</groupId>
<artifactId>SpringSecond</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.pk</groupId>
<artifactId>SpringThird</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
如果是正常的SpringBoot項目,到這裏就可以了,可以正常使用Spring以及另外兩個子模塊的代碼,但是這裏多了module-info.java就有問題了,項目中所有要使用的東西必須明確在這裏定義。
SpringFirst的module-info.java的代碼
/**
* @author Created by pangkunkun on 2018/10/29.
*/
module SpringFirst {
//這裏需要指定到具體某個包,如SpringApplication這個類在spring.boot下
requires spring.boot;
requires spring.boot.autoconfigure;
requires spring.web;
requires spring.beans;
requires slf4j.api;
requires SpringSecond;
requires SpringThird;
}
看起來很繁瑣,但這就是Java9 Module的一大特點——安全。定義爲public也不是隨處可用(SpringSecond的module-info中會看到)。
定義完這些才能夠讓SpringFirst項目正常運行。
現在來看SpringSecond的module-info.java的信息
import com.pk.second.service.UserService;
import com.pk.second.service.impl.UserServiceImpl;
/**
* @author Created by pangkunkun on 2018/10/31.
*/
module SpringSecond {
requires spring.context;
requires SpringThird;
provides UserService with UserServiceImpl;
exports com.pk.second.service;
}
這裏跟first中有很大的區別,first中僅僅是定義了使用哪些依賴(module)。這裏是對外提供服務的,所以它定義了自己對外的規則。
exports com.pk.second.service;表示這個包是對外開放的,該包下的類可以被其它module使用。
provides UserService with UserServiceImpl;表示對外提供了一個UserService實現類爲UserServiceImpl。
SpringThird自己看下就好。
項目代碼打包後的jar是可以運行的,想要在IDE中運行需要把module-info這塊給註釋掉(要不然會報各種問題 無奈)。
另外還有一點需要說明,JDK必須要9+,如果在本地通過java -jar運行必須要確定本地的java home信息是java9+。