Java9 module+SpingBoot+Maven

關於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+。

代碼地址SpringBoot+Maven+Java9Module

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章