JDK9新特性-module模块系统
- 在
Sources Root
下新建module-info.java
,内容格式如下所示
module modulename {//模块指令
}
modulename
具有唯一性- 一个工程,即使是不同的
Sources Root
,仅能存在一个module-info.java
- 模块体内可以保留空内容或者模块指令等内容,其指令类型包括requires、exports、provides…with、uses and opens,其涉及到的关键字包括exports、module、open、opens、provides、requires、uses、with,、to 、transitive
requires
- 该指令的表示形式如:
requires modulename
,假如在A模块中使用该指令,modulename
指定B
模块名称,则其表示的意义是模块A
依赖模块B
。每个模块必须显式地声明其需要依赖的模块。也就是当模块A
依赖模块B
,模块A
可读取模块B或者模块B
可被模块A
读取。 requires static
指令的意义是,模块A在编译阶段依赖B,但在运行期间该依赖性是可选项。
module module2 {requires module1;// 如果引用了module1中的类,运行时会报java.lang.NoClassDefFoundError异常// requires static module1;
}
requires transitive
该指令的表示形式如:requires transitive modulename
,其表示隐式可读性,假如在A
模块中使用该指令,modulename
指定B
模块名称,则其表示任何依赖A
模块的模块都可以读取B
模块。
exports and exports…to
- 该指令的表示形式如:
exports com.wen3.framework.jdk.module.module1
,假如在A模块中使用该指令,其中com.wen3.framework.jdk.module.module1
表示A
模块提供的类包的名称,其表示的意义,任何依赖A模块的模块都可以读取com.wen3.framework.jdk.module.module1
类包中公共类型, exports org.exp to comma-separated-list-of-modules
表示的意义,明确地将指定类包导出到指定的目标模块,多个模块以逗号分割。
module module1 {// 只有module1可以访问com.wen3.framework.jdk.module.module1包下的public classexports com.wen3.framework.jdk.module.module1 to module1;
}
uses
该指令的表示形式如:uses classA
,假如在A
模块中使用该指令,其中classA
表示一个接口或者抽象类,其表示的意义是A
模块是服务消费方,可以使用指定的服务classA
,服务classA
所在的模块是服务提供方。
provides…with
该指令的表示形式如:provides classA with classB
,假如在A模块中使用该指令,其中classA
提供给uses
指令使用,classB
是服务实现类,A
模块是服务提供方。
open, opens, and opens…to
该指令提供运行期可依赖、可反射的类包。
opens package to comma-separated-list-of-modules
表示将指定的类包开放给指定的模块,多个模块以逗号分割。
开放模块的所有运行期可依赖类包,可以使用如下的方式:
open module modulename {// 开放模块里面不允许使用opens指令// opens com.wen3.framework.jdk.module.module1 to module2
}
- 在
open module
里面,不允许再使用opens
查看JDK内建模块
$ java --list-modules
java.base@17.0.2
java.compiler@17.0.2
java.datatransfer@17.0.2
java.desktop@17.0.2
java.instrument@17.0.2
java.logging@17.0.2
java.management@17.0.2
java.management.rmi@17.0.2
java.naming@17.0.2
java.net.http@17.0.2
java.prefs@17.0.2
java.rmi@17.0.2
java.scripting@17.0.2
java.se@17.0.2
java.security.jgss@17.0.2
java.security.sasl@17.0.2
java.smartcardio@17.0.2
java.sql@17.0.2
java.sql.rowset@17.0.2
java.transaction.xa@17.0.2
java.xml@17.0.2
java.xml.crypto@17.0.2
jdk.accessibility@17.0.2
jdk.attach@17.0.2
jdk.charsets@17.0.2
jdk.compiler@17.0.2
jdk.crypto.cryptoki@17.0.2
jdk.crypto.ec@17.0.2
jdk.crypto.mscapi@17.0.2
jdk.dynalink@17.0.2
jdk.editpad@17.0.2
jdk.hotspot.agent@17.0.2
jdk.httpserver@17.0.2
jdk.incubator.foreign@17.0.2
jdk.incubator.vector@17.0.2
jdk.internal.ed@17.0.2
jdk.internal.jvmstat@17.0.2
jdk.internal.le@17.0.2
jdk.internal.opt@17.0.2
jdk.internal.vm.ci@17.0.2
jdk.internal.vm.compiler@17.0.2
jdk.internal.vm.compiler.management@17.0.2
jdk.jartool@17.0.2
jdk.javadoc@17.0.2
jdk.jcmd@17.0.2
jdk.jconsole@17.0.2
jdk.jdeps@17.0.2
jdk.jdi@17.0.2
jdk.jdwp.agent@17.0.2
jdk.jfr@17.0.2
jdk.jlink@17.0.2
jdk.jpackage@17.0.2
jdk.jshell@17.0.2
jdk.jsobject@17.0.2
jdk.jstatd@17.0.2
jdk.localedata@17.0.2
jdk.management@17.0.2
jdk.management.agent@17.0.2
jdk.management.jfr@17.0.2
jdk.naming.dns@17.0.2
jdk.naming.rmi@17.0.2
jdk.net@17.0.2
jdk.nio.mapmode@17.0.2
jdk.random@17.0.2
jdk.sctp@17.0.2
jdk.security.auth@17.0.2
jdk.security.jgss@17.0.2
jdk.unsupported@17.0.2
jdk.unsupported.desktop@17.0.2
jdk.xml.dom@17.0.2
jdk.zipfs@17.0.2
module编译
javac -d target/classes src/main/java/module-info.java src/main/java/com/wen3/framework/jdk/module/module1/Demo1Utils.java --module-path lombok -classpath xx.jar;xx2.jar