1. Java 9模块化介绍
在Java 9中引入了一项新特性:模块化系统。它旨在减少Java应用程序构建和维护时的复杂性和不良的依赖关系,并提升应用程序的安全性和可靠性。在这个新模型中,应用程序是由一组互相依赖的模块组成的,每个模块都可以被视为一个严格定义的、封装的、可重用的单元。
Java 9中引入了三种不同的模块类型:自身定义的模块、非自身定义的模块和自动模块。下面我们将逐一介绍这些模块类型。
2. 自身定义的模块
自身定义的模块指的是那些使用了module-info.java
文件的Java模块。这个文件包含了一些元数据,描述了模块的名称、依赖关系等信息。如果一个Java模块中包含了这个文件,那么这个模块就是一个自身定义的模块。
以下是一个简单的Java模块的例子:
module com.example.mymodule {
requires org.example.dependencymodule;
exports com.example.mypackage;
}
上面的代码定义了一个名为com.example.mymodule
的模块,它依赖于org.example.dependencymodule
模块,并导出了com.example.mypackage
包的内容。
通过使用自身定义的模块,我们可以明确指定模块之间的依赖关系,从而使代码更加可靠和可维护。
3. 非自身定义的模块
非自身定义的模块是指那些没有module-info.java
文件的Java模块。这种类型的模块通常由第三方提供,并且不知道它们到底有哪些依赖关系。
在Java 9中,我们可以使用--add-modules
选项来为非自身定义的模块添加依赖关系。例如:
java --add-modules javafx.controls myapp.Main
上面的代码为一个名为myapp.Main
的应用程序添加了对javafx.controls
模块的依赖关系。
需要注意的是,尝试在非自身定义的模块中使用Java 9中新的模块化特性可能不是明智之举。因为这些模块没有模块信息,所以它们可能不是模块化的。
4. 自动模块
自动模块是指那些没有module-info.java
文件的普通Jar文件。它们是为了协助我们将现有的Jar文件引入模块化系统中而产生的。系统会自动为这类Jar文件创建一些元数据,使得它们可以在模块化系统中被当作模块使用。
以下是一个自动模块的例子:
Automatic-Module-Name: com.example.mymodule
上面的代码指定了一个名为com.example.mymodule
的自动模块。
如果你将一个没有module-info.java
文件的Jar文件引入模块化系统中,系统会在运行时自动为这个Jar文件创建一个自动模块。如果这个Jar文件包含了META-INF/MANIFEST.MF
文件,并且这个文件指定了一个Automatic-Module-Name
属性,那么这个模块的名称就是这个属性的值。否则,系统将使用一个基于Jar文件名称的默认名称。
5. 总结
Java 9中引入了三种不同的模块类型:自身定义的模块、非自身定义的模块和自动模块。其中,自身定义的模块是我们最经常使用的,它可以明确指定模块之间的依赖关系,使得代码更加可靠和可维护;非自身定义的模块通常由第三方提供,我们可以使用--add-modules
选项为它们添加依赖关系;自动模块是为了协助我们将现有的Jar文件引入模块化系统中而产生的,系统会自动为这类Jar文件创建一些元数据,使得它们可以在模块化系统中被当作模块使用。
模块化系统的引入使得Java应用程序构建和维护更加简单和可靠,它也提升了应用程序的安全性和可维护性。我们应当尽可能地使用自身定义的模块,避免使用非自身定义的模块和自动模块,从而使得我们的代码更加可靠和可维护。