Java 9中模块的不同编译模式是什么?

1. Java 9中的模块化

Java 9之前的版本,所有的Java类都是放在同一个包下,没有明确的模块化划分,这在项目变得臃肿的时候会变得难以管理。Java 9中加入了模块化的概念,对项目的管理提供了更好的支持。模块的引入,可以将Java应用程序分成逻辑上的部分,为不同的情况提供更好的访问控制。

2. Java 9中的模块描述文件

Java 9中,模块描述文件(module-info.java)是新的源代码文件,用于声明一个模块以及该模块的依赖关系。它包含模块的名称和元数据,以及指明该模块依赖的其他模块。

2.1 模块名称

模块的名称必须是一个Java标识符,严格遵循Java语法。模块名称必须唯一,并且与模块目录的名称一致。

例如,有一个名为"com.example.myapp"的Java模块,则该模块的模块描述文件会以以下方式声明:

module com.example.myapp {

}

2.2 模块依赖

一个模块可以依赖于其他模块。模块可以依赖于JDK中的模块,也可以依赖于其他自定义模块。

模块依赖规范是通过在模块描述文件中声明的模块指定的,例如:

module com.example.myapp {

requires com.example.utils;

requires java.base;

}

其中,"requires"关键字后跟随所依赖的模块的模块名称。模块的依赖关系可以不仅仅包含模块名称,还可以指定版本范围等元数据。

2.3 暴露API

默认情况下,Java 9中的模块将不会向其它的模块暴露任何类型。要将模块中的类型暴露给其他模块,可以使用"exports"语句。

module com.example.myapp {

requires com.example.utils;

requires java.base;

exports com.example.myapp.package1;

}

3. Java 9中的模块编译模式

Java 9中模块化提供了三种不同的编译模式:

命令行编译模式:使用javac命令来编译一个模块。命令行编译模式会将编译时需要的依赖项作为参数提供给javac。

IDE编译模式:使用Java 9新版本的IDE,如IntelliJ IDEA等来管理和编译模块化代码。IDE能够检测到模块化的代码并自动执行必要的操作来编译你的代码。

自动模块编译模式:如果在Java 9中使用非模块化的JAR文件,则JAR文件将被自动转换为模块。在这种情况下,模块名称将会是一个自动分配的名称,它是根据JAR文件名生成的。

3.1 命令行编译模式

命令行编译模式最常见的使用方式是通过使用"javac"命令行编译一个模块。在这种情况下,你需要将所依赖的任何模块列表作为"-modulepath"选项的一部分提供给javac。

javac -d outDir -modulepath module-info.java packagename/*.java

这里,"-d"选项用于指定编译输出目录,"-modulepath"选项用于指定依赖项。如果你使用的是Java 8及以前的版本的JAR文件,则还需要在相同的命令行上使用"-classpath"设置。

3.2 IDE编译模式

Java 9的新版本的IDE,例如IntelliJ IDEA等,提供了对模块化Java的很好支持。它们能够检测到Java 9项目中的模块化代码,并自动管理依赖项。你可以使用IDE来管理代码、创建和编辑模块描述文件、运行测试等。

在IntelliJ IDEA中,你可以选择使用"Project Structure"来设置每个模块的依赖项:

3.3 自动模块编译模式

如果你正在使用非模块化的JAR文件,则这些文件将在Java 9中自动转换为模块。在这种情况下,生成的模块名称将是根据JAR文件名生成的,但是你仍然可以手动给它命名。例如,如果你将 "myjar.jar" 文件重命名为 "utils.jar",那么该JAR文件将成为一个新的模块:"utils"。

一个重要的注意点是,自动模块编译会忽略模块描述文件(module-info.java),也会忽略所依赖的任何JAR文件。因此,有很大几率导致自动模块不完整,或者在运行时引发异常或错误。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签