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

首先来看下目录结构
Java9 module+SpingBoot+Maven

我这里建了三个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