Является ли JOP 11+ в AdoptOpenJDK такой же, как и использование Jlink в JDK, добавление всех зависимостей - PullRequest
5 голосов
/ 15 апреля 2020

Является ли AdoptOpenJDK JRE 11+ таким же, как просто с помощью jlink и добавлением всех зависимостей?

Oracle Java 11 и далее не поставляется с JRE только JDK, потому что вы можете создайте свою собственную JRE, содержащую только те системные модули, которые вам нужны, используя jlink , и это то, что я делаю на Windows и Linux.

Однако для меня это не так очевидно как включить JRE с Jlink для некоторых платформ (Docker и MacOS) и поскольку AdoptOpenJDK предоставляет двоичные файлы не только для JDK, но и для JRE. Я подумал, что могу просто использовать JRE для этих платформ. Но содержит ли JRE все, что я получил бы, если бы связал JDK и включил все зависимости системного модуля или нет?

1 Ответ

2 голосов
/ 16 апреля 2020

Если вы скачаете JRE в Adopt и запустите 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 для создания image, вы получите следующее:

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 , будут работать только локали Engli sh (или, может быть, даже только США).

Если вы попросите 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.javado c означает, что каталог bin будет содержать инструменты javac и javadoc, вероятно, не то, что вы ожидаете от JRE.

Это говорит о том, что JRE в Adopt создается с указанием c список модулей. Если вы получили этот список модулей или просто используете приведенный выше список для создания образа среды выполнения, вы должны получить то же поведение, что и JRE, загруженный из AdoptOpenJDK.

Некоторые предостережения: (a) это просто мое предположение, поэтому не ставьте на него свой проект, (б) есть множество флагов, которые вы можете применить к jlink, чтобы поиграть с результирующим изображением, например, символы сжатия или отладки полосы, которые повлияют на его размер, производительность (немного ) и отладочные способности.

...