Java9 新特性 模块化
项目结构
父类pom 配置
<name>chaloubuq02</name>
<url>http://maven.apache.org</url>
<modules>
<module>m1</module>
<module>m2</module>
</modules>
m1模块配置
<parent>
<groupId>org.example</groupId>
<artifactId>chaloubuq02</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>m1</artifactId>
<packaging>jar</packaging>
<name>m1</name>
<url>http://maven.apache.org</url>
m2模块配置
<parent>
<groupId>org.example</groupId>
<artifactId>chaloubuq02</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>m2</artifactId>
<packaging>jar</packaging>
<name>m2</name>
<url>http://maven.apache.org</url>
m2模块依赖m1模块
<dependencies>
<dependency>
<groupId>org.example</groupId>
<artifactId>m1</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
项目具体结构
我们可以用 java --list-modules 查看当前模块
这个时候 我们使用 module-info.java 来定义模块
m1模块的module-info.java
module m1 {
exports com.test;
// 暴露这个包,让m2可以使用
// exports com.test to m2;
// 指定暴露给m2
// 需要用什么包 就导入什么包
// 这样导入 m1可以用,但是m2不能用
requires java.logging;
// 这样导入 m1可以用,m2也可以用
requires transitive java.logging;
// 我们还可以指定模块需要使用的抽象类或是接口实现:
uses com.test.Test;
}
如果m2想要反射m1的类,需要在m1 同意m2反射
open module module.a { //直接添加open关键字开放整个模块的反射权限
exports com.test to module.b;
}
也可以这么写
module module.a {
exports com.test to module.b;
opens com.test; //通过使用opens关键字来为其他模块开放反射权限
//也可以指定目标开放反射 opens com.test to module.b;
}
m2模块的module-info.java
module m2 {
// 导入m1
requires m1;
// 声明此模块提供了Test的实现类
provides com.test.Test with com.study.TestImpl;
}
其他的dependency的引入
同样当maven 引入其他的dependency的时候,也要在module-info.java中声明
比如dependency中有lombok,我们需要在module-info.java中声明
module com.test {
requires lombok; //lombok模块
requires java.logging; //JUL日志模块,也需要使用到
}