设置 JDK 仅包含 javac
Setting up JDK containing only javac
是否可以仅使用 javac
以可靠的方式设置 JDK,而无需在 运行 之前移除和添加组件(反复试验)?
在我的用例中,我想创建一个基于 Linux 的 Docker 图像,其中包含多个 javac
版本,然后使用一个卷来提供要编译的源文件和一个到检索已编译的 class 文件。容器应该只能编译 Java classes,没有别的。
从 Linux 发行版的软件包存储库安装 JDK 软件包,并从 https://jdk.java.net/archive/ 手动下载无法作为软件包使用的软件包绝对是一种选择,但它们非常大(每个约 190MB) version),包含重复内容和不需要编译的内容。
我注意到 jmods/jdk.compiler.jmod
在 bin
文件夹中包含 javac
。由于缺少库,提取并执行失败,因此我尝试将其内容与 module-info
:
中标记为必需的模块合并
java.base
java.compiler
然而,当我尝试 运行 javac
我得到:
Error occurred during initialization of VM
Failed setting boot class path.
如有任何正确方向的提示,我们将不胜感激。
在 JDK 版本 >= 9 中,可以使用 jlink
工具:
jlink --add-modules jdk.compiler --output my-path
这将创建一个包含所需库和二进制文件 bin/javac
的自定义运行时映像(此处位于目录 my-path
)。但是请注意,这种方式下 java.se
的大部分模块(例如 SQL、XML 和 Desktop classes)都不存在,必须在调用 javac
.
使用以下插件可以进一步减小运行时图像的大小:
--compress=2
: 使用 ZIP 压缩
--no-header-files
: 排除头文件
--no-man-pages
:排除手册页
--strip-debug
:去除调试信息,包含选项(自JDK 13起可单独设置):
--strip-java-debug-attributes
:从 Java class 文件 中删除调试信息
--strip-native-debug-symbols
(仅 Linux,需要 objcopy
):从可执行文件和共享库中去除调试符号
--vm=server
: 仅包括服务器 JVM
(使用jlink --list-plugins
查看所有可用插件)
对于大约 190 MB 的 JDK 13,这创建了一个文件夹,其内容总共只有 42 MB。
是否可以仅使用 javac
以可靠的方式设置 JDK,而无需在 运行 之前移除和添加组件(反复试验)?
在我的用例中,我想创建一个基于 Linux 的 Docker 图像,其中包含多个 javac
版本,然后使用一个卷来提供要编译的源文件和一个到检索已编译的 class 文件。容器应该只能编译 Java classes,没有别的。
从 Linux 发行版的软件包存储库安装 JDK 软件包,并从 https://jdk.java.net/archive/ 手动下载无法作为软件包使用的软件包绝对是一种选择,但它们非常大(每个约 190MB) version),包含重复内容和不需要编译的内容。
我注意到 jmods/jdk.compiler.jmod
在 bin
文件夹中包含 javac
。由于缺少库,提取并执行失败,因此我尝试将其内容与 module-info
:
java.base
java.compiler
然而,当我尝试 运行 javac
我得到:
Error occurred during initialization of VM
Failed setting boot class path.
如有任何正确方向的提示,我们将不胜感激。
在 JDK 版本 >= 9 中,可以使用 jlink
工具:
jlink --add-modules jdk.compiler --output my-path
这将创建一个包含所需库和二进制文件 bin/javac
的自定义运行时映像(此处位于目录 my-path
)。但是请注意,这种方式下 java.se
的大部分模块(例如 SQL、XML 和 Desktop classes)都不存在,必须在调用 javac
.
使用以下插件可以进一步减小运行时图像的大小:
--compress=2
: 使用 ZIP 压缩--no-header-files
: 排除头文件--no-man-pages
:排除手册页--strip-debug
:去除调试信息,包含选项(自JDK 13起可单独设置):--strip-java-debug-attributes
:从 Java class 文件 中删除调试信息
--strip-native-debug-symbols
(仅 Linux,需要objcopy
):从可执行文件和共享库中去除调试符号
--vm=server
: 仅包括服务器 JVM
(使用jlink --list-plugins
查看所有可用插件)
对于大约 190 MB 的 JDK 13,这创建了一个文件夹,其内容总共只有 42 MB。