7

AdoptOpenJDK 的 JRE 11+ 是否与仅使用jlink并添加所有依赖项相同?

Oracle Java 11 及更高版本不附带仅 JRE JDK,因为您可以使用jlink构建自己的 JRE,其中仅包含您需要的系统模块,这就是我在 Windows 和 Linux 上所做的。

但是,对于我来说,如何为某些平台(Docker 和 MacOS)合并一个 jlinked JRE 对我来说并不是那么明显,而且由于 AdoptOpenJDK 不仅为 JDK 还为 JRE 提供二进制文件,我想我可能只为这些平台使用 JRE。但是如果我链接 JDK 并包含所有系统模块依赖项,JRE 是否包含我将获得的所有内容?

4

1 回答 1

4

如果您下载 Adopt 的 JRE 并运行java --list-modules,您会得到以下信息(为了更好的可读性,我删除了该版本):

java.base
java.compiler
java.datatransfer
java.desktop
java.instrument
java.logging
java.management
java.management.rmi
java.naming
java.net.http
java.prefs
java.rmi
java.scripting
java.se
java.security.jgss
java.security.sasl
java.smartcardio
java.sql
java.sql.rowset
java.transaction.xa
java.xml
java.xml.crypto
jdk.accessibility
jdk.aot
jdk.charsets
jdk.crypto.cryptoki
jdk.crypto.ec
jdk.dynalink
jdk.httpserver
jdk.internal.ed
jdk.internal.le
jdk.internal.vm.ci
jdk.internal.vm.compiler
jdk.internal.vm.compiler.management
jdk.jdwp.agent
jdk.jfr
jdk.jsobject
jdk.localedata
jdk.management
jdk.management.agent
jdk.management.jfr
jdk.naming.dns
jdk.naming.rmi
jdk.net
jdk.pack
jdk.scripting.nashorn
jdk.scripting.nashorn.shell
jdk.sctp
jdk.security.auth
jdk.security.jgss
jdk.unsupported
jdk.xml.dom
jdk.zipfs

如果您下载 JDK 并使用它jlink --add-modules java.se来构建映像,您将获得以下信息:

java.base
java.compiler
java.datatransfer
java.desktop
java.instrument
java.logging
java.management
java.management.rmi
java.naming
java.net.http
java.prefs
java.rmi
java.scripting
java.se
java.security.jgss
java.security.sasl
java.sql
java.sql.rowset
java.transaction.xa
java.xml
java.xml.crypto

如您所见,它不包含jdk.*模块,因为严格来说,运行时不需要这些模块。尽管如此,他们的缺席还是会被注意到,例如没有jdk.localedata,只有英语语言环境(或者甚至可能只是美国)可以工作。

如果您要求jlink绑定服务,您会得到不同的画面,但仍与 JRE 不同:

java.base
java.compiler
java.datatransfer
java.desktop
java.instrument
java.logging
java.management
java.management.rmi
java.naming
java.net.http
java.prefs
java.rmi
java.scripting
java.se
java.security.jgss
java.security.sasl
java.smartcardio
java.sql
java.sql.rowset
java.transaction.xa
java.xml
java.xml.crypto
jdk.charsets
jdk.compiler
jdk.crypto.cryptoki
jdk.crypto.ec
jdk.dynalink
jdk.internal.opt
jdk.jartool
jdk.javadoc
jdk.jdeps
jdk.jfr
jdk.jlink
jdk.localedata
jdk.management
jdk.management.jfr
jdk.naming.dns
jdk.naming.rmi
jdk.scripting.nashorn
jdk.security.auth
jdk.security.jgss
jdk.unsupported.desktop
jdk.zipfs

例如jdk.compilerjdk.javadoc的存在意味着该bin目录将包含javacjavadoc工具,这可能不是您对 JRE 的期望。

这告诉我 Adopt 的 JRE 是使用特定的模块列表构建的。如果您掌握了该模块列表或仅使用上面的列表来构建运行时映像,您应该获得与从 AdoptOpenJDK 下载的 JRE 完全相同的行为。

一些警告:(a)这只是我的假设,所以不要把你的项目押在上面,(b)你可以应用很多标志jlink来摆弄生成的图像,例如压缩或剥离调试符号,这将影响其大小、性能(轻微)和调试能力。

于 2020-04-16T20:37:19.397 回答