如果您下载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.compiler 和 jdk.javadoc 的存在意味着 bin
目录将包含 javac
和 javadoc
工具,这可能不是您从 JRE 中期望的。
这告诉我 AdoptOpenJDK 的 JRE 是使用特定模块列表构建的。如果获取该模块列表或只使用上面的列表来构建运行时映像,您应该得到与从 AdoptOpenJDK 下载的 JRE 完全相同的行为。
一些注意事项:(a) 这只是我的假设,因此不要把您的项目寄托在这上面,(b) 您可以应用大量标志到 jlink
来调整生成的映像,例如压缩或剥离调试符号,这会影响其大小、性能(稍微)和调试能力。