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

7
AdoptOpenJDK的JRE 11+是否与仅使用jlink并添加所有依赖项相同?
自Oracle Java 11起,因为你可以使用jlink构建仅包含所需系统模块的自定义JRE,所以不再提供JRE仅JDK。这是我在Windows和Linux上做的事情。
但是对于某些平台(Docker和MacOS),如何整合jlinked JRE 对我来说并不那么明显,而且由于AdoptOpenJDK不仅为JDK提供二进制文件,还为JRE提供二进制文件,因此我想在这些平台上使用JRE。但是JRE是否包含我如果jlinked JDK将获得的所有系统模块依赖项?

是的,jlink'd镜像树是独立的。运行它不需要其他文件或程序。 - VGR
1
@VGR,那不是问题。 - Paul Taylor
你为什么不直接比较自己构建的JRE和AdoptOpenJDK提供的JRE呢? - user330315
我在 Mac JDK 上运行了 jlink,但由于创建的 JRE 没有预期的 Mac 文件结构(Home:Contents),因此无法使用它来使用 appbunder 工具。所以我退了一步,试图更好地理解 AdoptJdk 提供的 JRE。 - Paul Taylor
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 中期望的。

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

一些注意事项:(a) 这只是我的假设,因此不要把您的项目寄托在这上面,(b) 您可以应用大量标志到 jlink来调整生成的映像,例如压缩或剥离调试符号,这会影响其大小、性能(稍微)和调试能力。


谢谢,这很有用,我会再向您咨询的。 - Paul Taylor
谢谢,我在捆绑JRE时遇到了问题,我认为可能是JRE特定的问题,但当我捆绑JDK时也失败了 - https://dev59.com/YLroa4cB1Zd3GeqPiFbw 好的,谢谢你确认JRE包含我代码所需的所有模块。 - Paul Taylor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接