上一次简单写了一个module并进行调用,这次会尝试模块间引用其他模块
首先列出所有文件
+--src
+--com.moduleA
+--module-info.java
+--com
+--moduleA
+--ModuleA.java
+--com.main
+--com
+--main
+Main.java
模块引用
moduleA的module-info
module com.moduleA {
exports com.moduleA;
}
ModuleA.java
package com.moduleA;
public class ModuleA {
public void doModule() {
System.out.println("from module1");
}
}
main的module-info
module com.main {
requires com.moduleA;
}
Main.java
package com.main;
import com.moduleA.*;
public class Main {
public static void main(String[] args) {
ModuleA m1=new ModuleA();
m1.doModule();
}
}
在src同级目录运行下面命令进行编译
>javac -d mods/com.moduleA src\com.moduleA\module-info.java src\com.moduleA\com\moduleA\ModuleA.java
>javac --module-path mods -d mods/com.main src/com.main/module-info.java src/com.main/com/main/Main.java
然后就可以运行main模块了
>java --module-path mods -m com.main/com.main.Main
from module1
找不到模块
模块编译时如果缺少对应的申明会被校验
缺少模块
删除生成的moduleA,运行main,会有如下报错
Error occurred during initialization of boot layer
java.lang.module.FindException: Module com.moduleA not found, required by com.main
就算程序中没有使用到对应的模块,只要缺少requires中的包就会提示以上错误。
缺少export
当对moduleA不进行export,在编译main时会出现,同样javac也可以识别出moduleA的存在,以及它并未被导出
src\com.main\com\main\Main.java:2: 错误: 程序包 com.moduleA 不可见
import com.moduleA.*;
^
(程序包 com.moduleA 已在模块 com.moduleA 中声明, 但该模块未导出它)
1 个错误
缺少require
当main的module-info中不标明requires modualA,编译时就会出现如下错误,值得注意的是javac能识别出已经存在的moduleA,并说明了未读取该模块
src\com.main\com\main\Main.java:2: 错误: 程序包 com.moduleA 不可见
import com.moduleA.*;
^
(程序包 com.moduleA 已在模块 com.moduleA 中声明, 但模块 com.main 未读取它)
1 个错误
当main不require,moduleA也不export的情况下,会优先显示该错误,所以javac首先会找到该类,然后通过export和requires进行控制。
export范围
在module-info中定义达的export,是暴露一个package下所有类,且需不会读取子package的内容,例如com.modulaA只会export该package下的类,其子package下的类并不会被包含在内,如果子package中的类被引用会提示缺少export同样的模块未导出。