JLink 工具在 Java 9 中是什么?
1. JLink 工具简介
JLink 是 Java 9 中的一个新工具,它让我们能够创建一个自包含的运行时图像。这意味着它会包含所有需要运行的模块,不需要安装额外的组件。JLink 工具的优点如下:
- 可以创建一个小型的运行时镜像,可以定制 JVM 配置,并且可以排除不需要的模块。
- 由 JLink 工具创建的自包含可执行文件是完全独立的,不需要安装 JDK 或 JRE。
- JLink 工具生成的镜像可以被一些轻量级系统(如嵌入式系统)用于运行。
2. JLink 工具使用方式
JLink 工具需要指定一个模块路径(module path),然后指定需要包含在镜像中的模块。我们可以使用以下命令创建自包含的可执行文件。
jlink --module-path /path/to/modules --add-modules module_name --output /path/to/image
上述命令中的 `—module-path` 参数指定模块路径,在 Windows 上可能需要使用反斜杠作为路径分隔符。 `--add-modules` 参数指定需要包含的模块的名称,可以使用逗号分隔。 使用 `--output` 提供的路径指定生成的自包含可执行文件的输出路径以及文件名。
2.1 示例
为了使用JLink工具,将创建一个包含一个模块 `com.java.example` 的最小的示例。
创建目录结构如下:
example
│───src
│ └───com.java.example
│ └───com
│ └───java
│ └───example
│ └───Main.java
│───module-info.java
2.2 引导模块 (module-info文件)
`module-info.java` 文件定义包含两个模块的程序的模块化结构,并将 `com.java.example` 模块指定为该程序的引导模块。
module java.cli.main {
requires com.java.example;
}
注意,模块化结构对于使用 JLink 工具生成自包含的映像是必需的。
2.3 模块 (Main文件)
`Main.java` 文件代码如下:
package com.java.example;
public class Main {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
2.4 生成自包含映像
生成自包含映像,可以使用下面的命令:
jlink --module-path "/path/to/your-jdk/jmods:/path/to/your-example-folder/out/production/example"
--add-modules java.desktop,com.java.example
--launcher example=com.java.example/com.java.example.Main
--output example-image
我们指定了 JDK 的模块路径和示例程序的路径。`--add-modules` 参数指定了需要包含的模块。除了 `com.java.example` 模块,我们还添加了 `java.desktop` 模块。 我们设置了一个启动器,通常是 `java` 命令,但现在我们将其命名为 `example`。命令 `--output` 指定映像的生成目录和文件名。
3. JLink 工具中排除不必要的模块
JLink 工具可以通过以下命令来排除不需要的模块:
jlink --module-path /path/to/modules --add-modules module_name --output /path/to/image --exclude-files path/to/excludelist.txt
其它参数与之前相同。excludelist.txt 包含排除的模块的名称列表,每行一条记录。
JLink 工具通过使用 `Linker` API 完成操作。Linker API 用于将解析的模块连接起来并创建一个计算机可以解释的图片。Linker API 实现了由模块描述符集成的连接器,并提供了插件,以便我们可以使用自定义逻辑来指定要包含或排除的模块。
4. 总结
JLink 工具是为 Java 9 引入的。此工具使得我们能够创建小型的、自包含的运行时映像,无需其他组件的安装。JLink 工具使用方便,只需要指定模块路径和需要包含的模块即可。此外,我们还可以使用 excludelist.txt 自动生成排除不必要的模块。JLink 工具可以使应用程序更加轻便,适用于一些嵌入式设备以及其他一些运行空间受限的系统中。