Является ли JRE 11+ AdoptOpenJDK тем же, что и использование jlink в JDK, добавляя все зависимости

JRE 11+ от AdoptOpenJDK - это то же самое, что просто использовать jlink и добавлять все зависимости?

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

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


person Paul Taylor    schedule 15.04.2020    source источник
comment
Да, дерево изображений jlink’d является автономным. Никаких других файлов или программ для его запуска не требуется.   -  person VGR    schedule 15.04.2020
comment
@VGR, вопрос не в этом   -  person Paul Taylor    schedule 16.04.2020
comment
Почему бы вам просто не сравнить созданную вами JRE с JRE от AdoptOpenJDK?   -  person a_horse_with_no_name    schedule 16.04.2020
comment
Я запустил jlink на mac jdk, но не смог его использовать, потому что созданный jre не был принят инструментом appbunder, потому что не ожидал файловой структуры Mac (Home: Contents). Итак, я сделал шаг назад и попытался лучше понять jre, предоставляемый AdoptJdk.   -  person Paul Taylor    schedule 16.04.2020


Ответы (1)


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

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.

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

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

person Nicolai Parlog    schedule 16.04.2020
comment
Спасибо, это полезно, я еще вернусь к вам по этому поводу. - person Paul Taylor; 17.04.2020
comment
Спасибо, у меня возникла проблема при связывании jre, и я, хотя это может быть специфичным для jre, но не работает и при связывании jdk - stackoverflow.com/questions/61185934/ хорошо, спасибо за подтверждение, что jre содержит все модули, необходимые для моего кода. - person Paul Taylor; 21.04.2020