【问题标题】:Setting up JDK containing only javac设置只包含 javac 的 JDK
【发布时间】:2020-03-01 02:10:45
【问题描述】:

是否可以仅使用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 时,我得到了:

虚拟机初始化过程中发生错误
设置引导类路径失败。

感谢任何正确方向的提示。

【问题讨论】:

  • 你还需要编译文件的所有依赖。
  • 可以尝试jlink --add-modules java.se,jdk.compiler --output ...,然后将javac复制到生成图像的bin目录。
  • @JohannesKuhn,我还没有过多考虑依赖项,因为它主要用于比较编译器输出,所以可能只有没有(或很少)依赖项,我猜这些可以使用卷来提供也是。
  • @Slaw,是的,有效!请注意,我仅将jdk.compiler 用作模块,并且还将javac 复制到了自己的运行时映像中。使用--compress=2(ZIP 压缩),JDK 13 总共需要 45 MB,这要好得多。你想把它添加为答案吗?
  • 可以使用--strip-debug 使其更小。

标签: java javac


【解决方案1】:

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

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

这将创建一个自定义运行时映像(此处位于目录 my-path 中),其中包含所需的库和二进制文件 bin/javac。但是请注意,这样大部分属于java.se 的模块(例如SQL、XML 和桌面类)都不存在,并且必须在调用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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2022-08-18
    • 2012-06-02
    • 1970-01-01
    • 2011-06-19
    • 2010-11-28
    • 1970-01-01
    相关资源
    最近更新 更多