JDK9定义了如下几个模块
普通模块(有module-info.java文件)
开放模块(与普通模块相似,只是前面多了一个open关键字,全部类可反射,包含私有方法)
匿名模块(无module-info.java文件,通常是JDK9之前的JAR包),匿名模块在JDK9里面会成为自动模块
自动模块与普通模块的区别,自动模块也就是匿名模块,它实际至关于一个open模块,里面的全部类能够被反射,自动模块调用普通模块须要遵循模块规则。java
通常在源代码根目录下写一个固定的module-info.java文件 module XXXX{} 定义一个普通模块 open module XXX{} 定义一个开放模块 能够反射全部 require module name 写在模块里面,须要依赖某个模块 require static module name 编译必须,运行不须要 export package 导出该包下的全部的public修饰的类,能够反射 export package to module name 导出该包下的全部的public修饰的类给某个模块使用,能够反射 opens package to module name 开放该包下全部的类 uses 在当前模块下加载服务 provides interface name with implemnet name 在当前模块下定义服务名,多个实现类用逗号隔开 ServiceLoader 加载服务,须要在META-INFO/services/目录下,建立以接口全名为名称的配置文件,内容为实现类的全名称,多个实现类换行分隔
编译 -d 设置编译后文件存放路径 javac -d mods -encoding utf-8 src/main/java/com/city/City.java src/main/java/module-info.java javac -d mods -encoding utf-8 -p ../city/mods src/main/java/com/school/School.java src/main/java/module-info.java 运行模块内的主文件 java -p mods;../city/mods -m school/com.school.School 建立jmod包 jmod create school.jmod -p mods 输出jlink jlink --module-path "%JAVA_HOME%"\jmods --add-modules school.jmod --output link