设置只包含javac的JDK



是否可以以可靠的方式仅使用javac来设置JDK,而无需删除和添加组件,直到它运行为止(反复尝试(?

在我的用例中,我想创建一个基于Linux的Docker映像,它包含多个javac版本,然后使用一个卷来提供要编译的源文件,并使用一个来检索已编译的类文件。容器应该只能编译Java类,而不能编译其他类
从Linux发行版的软件包存储库安装JDK软件包,并从https://jdk.java.net/archive/绝对是一种选择,但它们相当大(每个版本约190MB(,并且包含重复的内容和编译不需要的内容。

我注意到jmods/jdk.compiler.jmodbin文件夹中包含javac。由于缺少库,提取和执行它失败了,所以我尝试将其内容与module-info:中标记为所需的模块合并

  • java.base
  • java.compiler

然而,当我尝试运行javac时,我得到了:

初始化VM时出错
设置启动类路径失败。

任何正确方向的提示都将不胜感激。

在JDK版本>=9中,可以使用jlink工具:

jlink --add-modules jdk.compiler --output my-path

这将创建一个自定义运行时映像(此处位于目录my-path中(,其中包含所需的库和二进制文件bin/javac。然而,请注意,通过这种方式,作为java.se的一部分的大多数模块(例如SQL、XML和Desktop类(都不存在,并且必须在调用javac时提供。

运行时图像的大小可以使用以下插件进一步缩小:

  • --compress=2:使用ZIP压缩
  • --no-header-files:排除头文件
  • --no-man-pages:不包括手册页
  • --strip-debug:剥离调试信息,包括选项(从JDK 13开始可以单独设置(:
    • --strip-java-debug-attributes:从Java类文件中剥离调试信息
    • --strip-native-debug-symbols(仅限Linux,需要objcopy(:从可执行文件和共享库中剥离调试符号
  • --vm=server:仅包括服务器JVM

(使用jlink --list-plugins查看所有可用插件(

对于大约190 MB大的JDK 13,这创建了一个文件夹,其内容总共只有42 MB。

相关内容

最新更新