Среда выполнения Java (JRE) с поддержкой модулей?

В поисках JRE для запуска моего настольного приложения (на основе Javafx) я нашел JRE версии 8 здесь https://www.java.com/en/download/manual.jsp . Это значение по умолчанию, и именно сюда я перенаправляюсь при нажатии на ссылку JRE на веб-сайте Oracle ( https://www.oracle.com/downloads/#category-java).

Но JRE не поддерживает --module-path, очевидно, потому что она слишком старая.

Какие у меня есть варианты запуска приложения на компьютерах, не предназначенных для разработчиков? (обратите внимание, что размер JRE составляет 60 МБ, а размер JDK — 190 МБ).

Боюсь спросить, почему загрузка JRE по умолчанию слишком старая?

Мое приложение компилируется с openjdk 17.0.9 17 октября 2023 г.

Дублирующий вопрос. Заменено на jlink, чтобы вы могли создать свою собственную JRE, которая даже может включать ваши собственные модули, чтобы --module-path не требовался.

DuncG 05.04.2024 14:08

Это, например, объяснено в openjfx.io/openjfx-docs/#modular

Mark Rotteveel 05.04.2024 15:04

@MarkRotteveel Приложение helloworld похоже на лепку небоскребов из пластилина в детском саду. Ссылка, которую вы разместили, часто появляется. На самом деле это довольно неудачная попытка решить эту проблему.

bliako 05.04.2024 15:41

Я конкретно говорю о том, что $JAVA_HOME/bin/jlink --module-path $PATH_TO_FX_MODS:mods --add-modules hellofx --output hellofx создаст соответствующую JRE (или собственный образ среды выполнения) специально для вашего приложения. Тот факт, что вы спрашиваете, можете ли вы использовать JRE Java 8, подсказывает мне, что вы даже не пробовали этот путь.

Mark Rotteveel 05.04.2024 16:08

Здесь у вас есть два вопроса. Тот, что в заголовке «Среда выполнения Java (JRE) с поддержкой модулей?» -> Ответ на этот вопрос прост (и я думаю, вы уже знаете) -> любая версия JRE 9+, потому что именно в Java 9 в Java была добавлена ​​поддержка модулей.

jewelsea 05.04.2024 19:44

«Каковы мои варианты запуска моего приложения на компьютерах, не предназначенных для разработчиков?» -> ответ на этот вопрос гораздо более сложен (слишком сложен, чтобы дать исчерпывающий ответ на StackOverflow IMO) и имеет множество решений, некоторые из которых представлены в ответе Бэзила. Чтобы получить однозначный ответ, вам, вероятно, придется задать более конкретный вопрос.

jewelsea 05.04.2024 19:48

Существует разница между названием решения, которое вам не сильно поможет, и предоставлением пошагового руководства по его реализации, что может оказаться весьма сложным. Например, руководство пользователя jpackage или крутая документация jlink — они оба одинаково массивны.

jewelsea 05.04.2024 19:48

Некоторые варианты и детали создания пользовательских JRE для распространения подробно обсуждаются в ответе на Как правильно получить модули JDK для толстой банки JavaFX с помощью jdeps, но есть большая вероятность, что это вас смутит. вместо того, чтобы помочь вам.

jewelsea 05.04.2024 21:37

@jewelsea the answer to that is straightforward (and I think you already know) -> any version of the JRE 9+, because that Java 9 is when module support was added to Java.. Где мне тогда скачать JRE 9+?!?! На сайте www.java.com указан только JRE8? Возможно я недостаточно искал?

bliako 09.04.2024 11:04

JRE 8 на java.com устарела. Существует множество поставщиков современных JRE (и JDK), некоторые из них включают JavaFX. Например Azul JRE FX или Liberica Full JRE , или без JavaFX, Temurin , Corretto , Oracle , OpenJDK.

jewelsea 09.04.2024 14:17
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
10
390
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

вр; доктор

Два поставщика предоставляют версии своих продуктов JDK/JRE для Java 17, 21 и текущей версии 22 в комплекте с современным поколением библиотек OpenJFX, реализующих JavaFX: Azul Systems и BellSoft.

Подробности

Поймите, что JavaFX никогда не был стандартной частью Java.

И поймите, что JavaFX теперь реализован в проекте с открытым исходным кодом OpenJFX. Этот проект находится в постоянной активной разработке под руководством Oracle Corp и компании Gluon.

Несколько лет назад Oracle решила объединить библиотеки JavaFX с некоторыми своими продуктами JDK/JRE. Потом они перестали комплектоваться.

Oracle — лишь один из нескольких поставщиков, предлагающих продукты JDK/JRE. См. Java по-прежнему бесплатна для объяснения экосистемы Java.

Некоторые поставщики JDK/JRE в настоящее время предпочитают включать библиотеки JavaFX, реализованные как OpenJFX, в некоторые выпуски своих продуктов. Я знаю как минимум двух таких поставщиков:

Система модулей платформы Java появилась в 2017 году в версии Java 9 и более поздних версиях. Перечисленные выше поставщики предлагают JavaFX-пакеты для модульных LTS версий 11, 17 и 21, а также текущей версии (теперь 22).

Для JavaFX 22 требуется JDK/JRE 17 или более поздней версии.

Альтернативно вы можете объединить библиотеки OpenJFX в свое приложение. Вы можете объединить JRE в свое приложение и при необходимости сократить JRE, включив в него только те части, которые использует ваше приложение. Проект OpenJDK предлагает инструменты для помощи: jlink и jpackage.

Передовая технология использует GraalVM для создания собственного приложения на основе вашего проекта JavaFX.


Вы спрашивали:

Но JRE не поддерживает --module-path, очевидно, потому что он слишком старый.

Java 9 и более поздние версии имеют систему модулей платформы Java (JPMS). Сосредоточьтесь на версиях LTS (11, 17, 21) и текущей (22), поскольку другие версии достигли EOL (окончания срока службы). Последние версии OpenJFX поддерживают Java 17 и более поздние версии.

Какие у меня есть варианты запуска приложения на компьютерах, не предназначенных для разработчиков?

Если у вас есть контроль над пользовательскими компьютерами, например, в корпоративной или образовательной среде, рассмотрите возможность установки системными администраторами JRE, которая поставляется в комплекте с необходимыми библиотеками OpenJFX.

На нишевом рынке, возможно, вы можете потребовать от своих пользователей установить JRE в комплекте с библиотеками OpenJFX.

На широком розничном рынке вам потребуется объединить в свое приложение как JVM, так и библиотеки OpenJFX. Торговые площадки приложений, такие как Apple App Store, примут такой продукт.

(обратите внимание, что размер JRE составляет 60 МБ, а размер JDK — 190 МБ).

Вы можете значительно уменьшить этот размер, используя инструмент jlink с модульным проектом JPMS.

Боюсь спросить, почему загрузка JRE по умолчанию слишком старая?

«Почему» просто заключается в том, что позже Oracle решила прекратить объединение библиотек JavaFX со своими собственными продуктами JDK/JRE.

Но вы можете бесплатно включить библиотеки OpenJFX в свое приложение.

Кроме того, у вас есть возможность получить более свежие версии Java JDK/JRE в комплекте с библиотеками OpenJFX от поставщиков, отличных от Oracle. Вы можете получить бесплатные продукты, а также продукты с платной поддержкой.

Мое приложение компилируется с openjdk 17.0.9 17 октября 2023 г.

Затем вы можете использовать OpenJFX 22 при компиляции для Java 17.

Я уже неделю пытаюсь использовать jpackage, сборку jlink maven и maven sprint-boot (сборку). Для меня все они терпят неудачу из-за того, что тот или иной модуль не найден во время упаковки на машине разработчика. Итак, что бы я ни делал, они не обнаруживают всех дефектов. За исключением Spring-Boot, который жалуется только на то, что модули javafx не могут быть запущены из jar. Поэтому я решил объединить все зависимости, найденные Spring-Boot, с моими классами и создать архив для распространения. Итак, снова в тупике. Теперь с jpackage я получаю ужасные jlink failed with: Error: Module jdk.management.jfr not found

bliako 05.04.2024 14:51

@bliako Создание приложений JavaFX — сложный, утомительный и чреватый проблемами процесс, к сожалению, худшая часть отличной в остальном платформы. У меня нет большого опыта, поэтому я не могу помочь. Предлагаю вам поискать ответы и комментарии, размещенные здесь экспертом jewelsea .

Basil Bourque 05.04.2024 14:55

@bliako Как уже отмечалось, это может быть сложный процесс. Учитывая, что вы используете Spring, который, если я не ошибаюсь, пока не является модульным, я бы рекомендовал, чтобы ваш собственный код не был модульным. Фактически, забудьте о модулях, за исключением JavaFX и любых модулей из самого JDK. Выполните jpackage, поместите JavaFX на --module-path и добавьте необходимые модули с помощью --add-modules (или создайте образ времени выполнения отдельно с помощью jlink напрямую и укажите jpackage на него с помощью --runtime-image). Затем ваш код и все другие зависимости должны быть включены через --input (см. также --main-jar).

Slaw 05.04.2024 21:10

Таким образом, частью модульного образа времени выполнения являются только модули JavaFX и Java SE/JDK. Ваш код и любые другие зависимости будут загружены из пути к классам и, по большей части, будут функционировать так же, как и до Java 9. Node, вам может потребоваться явно добавить определенные модули, например модули jdk.crypto.xxx, если вы хотите поддерживать SSL (т. е. если вы хотите поддерживать конечные точки HTTPS).

Slaw 05.04.2024 21:10

Вам следует попробовать использовать jlink, чтобы создать совместимую JRE из JDK. Прежде чем использовать jlink, убедитесь, что JDK, на котором вы хотите создать JRE, может запускать ваше приложение, используя соответствующие записи пути к классам/пути к модулю.

Если это сработает, попробуйте создать JRE, содержащую только используемые вами модули, например JavaFX. Например:

set JAVAFX_MODS=C:\java\javafx-jmods-21
jlink --module-path "%JAVAFX_MODS%" --add-modules javafx.base,javafx.controls,javafx.graphics --strip-debug --no-man-pages --no-header-files --output jre-fx

Это означает, что вы можете использовать jre-fx\bin\java для запуска любого класса, использующего JavaFX, без повторного указания модулей JavaFX.

Позже вы также можете использовать jlink, чтобы создать JRE с вашим собственным модулем. Если у вас есть правильные зависимости от JavaFX и вы установили путь к модулю, новая JRE будет содержать все необходимое для запуска вашего приложения:

jlink --module-path "%JAVAFX_MODS%;your-module-dir" --add-modules yourmodule --strip-debug --no-man-pages --no-header-files --output jre-all

С этой новой JRE — jre-all\bin\java — вам нужно указать только имена классов запуска, все модули включены.

Если вам нужно распространить свое приложение на другие машины, посмотрите jpackage для сборки установщиков — EXE/MSI в Windows или другой упаковщик для Mac/Linux. Его можно настроить для использования предварительно созданной JRE с jpackage --runtime-image jre-all или для внутреннего использования jlink при каждом запуске.

спасибо, твоя первая реплика вселила в меня надежду, но увы Error: Module java.desktop not found, required by javafx.graphics java.lang.module.FindException: Module java.desktop not found, required by javafx.graphics

bliako 09.04.2024 11:24

Какие JDK и JavaFX вы используете?

DuncG 09.04.2024 11:33

версия openjdk «17.0.9» 17 октября 2023 г., javafx v22. Я использую maven для компиляции и запуска приложения и не жалуюсь на отсутствие чего-либо. В java -version я вижу OpenJDK Runtime Environment, но его нигде нет для загрузки (для целевой ОС), тогда я увидел superuser.com/questions/1419880/does-openjdk-contain-a-jre , что указывает на усыновление .net/en-GB/temurin/releases И тут становится понятно, кто такие adoptium? и почему я должен доверять их дистрибутиву и что, если он скомпрометирует мои целевые машины?

bliako 09.04.2024 14:24

Пока игнорируйте Maven. Вы хотите сказать, что если бежать jdk-17\bin\jlink --module-path "somepath/to/javafx22-modules" --add-modules javafx.base,javafx.controls,javafx.graphics --strip-debug --no-man-pages --no-header-files --output jre17-fx даст Module java.desktop not found ?

DuncG 09.04.2024 14:55

правильно (и спасибо за помощь). а путь к модулю — это путь, который я извлек из jmods (из gluonhq.com/products/javafx), чтобы уточнить, что папка jmods содержит файлы .jmod. Исполняемый файл jlink имеет версию v17.0.9 и *я думаю, он установлен openjdk (iam в Linux, и все это было установлено менеджером пакетов). Javafx SDK в данный момент не используется, только JMODS. Возможно, javafx предоставляет собственный jlink, который мне следует использовать?

bliako 09.04.2024 15:14

JDK предоставляет jlink. Что-то не так с вашим JDK, если отсутствует java.desktop. Это должно работать и создать минимальные зависимости для проверки: jdk-17\bin\jlink --add-modules java.desktop --strip-debug --no-man-pages --no-header-files --output jre17.desktop

DuncG 09.04.2024 15:31

нет, Error: --module-path is not specified and this runtime image does not contain jmods directory. А двоичный файл jlink предоставляется java-17-openjdk-devel менеджером пакетов Fedora. то же самое, что обеспечивает java и javac.

bliako 09.04.2024 15:56

Вероятно, вы установили обезглавленный JDK, а не полный JDK.

DuncG 09.04.2024 16:11

Спасибо. Под «безголовым» вы подразумеваете отсутствие компонентов графического интерфейса или полную установку? Если вы не уверены, я сомневаюсь в том, что вы сказали. Неразумно, что единственный пакет Fedora, который предоставляет javac, не содержит компонентов. В любом случае мне удалось запустить приложение в Windows с помощью adoptium JRE. опишу как в ответе

bliako 09.04.2024 16:26

В ответе от @BasilBourque перечислены варианты загрузки JRE, которая поддерживает новейшие функции Java, и понимает функции --add-modules. Это общепринятый ответ на мой вопрос.

Однако я опишу здесь весь процесс упаковки моего приложения и его зависимостей, потому что в моем случае jlink продолжал жаловаться, что не нашел базовых зависимостей, см. комментарии под ответом @DuncG.

Я также разместил демо-версию на https://github.com/hadjiprocopis/javafx-uberjar

  1. Создайте CLASSPATH, MODULEPATH и MODULES для своего приложения. Если вы используете maven, это легко сделать, проанализировав вывод mvn -X javafx:run@dry-run-cli для создания указанных переменных.

  2. Соберите зависимости (jars) как-нибудь. На мой взгляд, загружать все эти зависимости не логично, когда у меня есть maven, который уже загрузил их в свой репозиторий (находится по адресу ~/.m2/repository/...). Итак, я прибегнул к плагину spring-boot maven, который создает JAR со всеми зависимостями, а также классами моего приложения. Этот JAR предупреждает с помощью WARNING: Unsupported JavaFX configuration: classes were loaded from 'unnamed module ...', и я не доверял ему его распространение. В любом случае этот jar-файл теперь содержит все зависимые jar-файлы в своем lib/*. В качестве бонуса он может содержать специфичные для ОС jar-файлы javafx для любых других ОС, которые вы указываете в pom.xml. как <dependency> с <classifier>, установленным на linux,win,mac и т. д.

  3. Структура дистрибутива zip/tar-ball будет такой: а. lib каталог, содержащий все сторонние jar-зависимости, даже jar-файлы модулей, даже jar-файлы для конкретной ОС, например. javafx-media-22-ea+11-mac.jar, javafx-media-22-ea+11-win.jar и т. д. б. classes каталог для классов ваших приложений или jar. в. launchers каталог для хранения сценариев запуска для вашей целевой ОС.

  4. Сценарий запуска в целом будет выглядеть примерно так: java -classpath "classes:lib/xyz.jar:..." --module-path "lib/javafx...jar:lib/..." --add-modules "javafx.base,..." com.myapp.Main Обратите внимание, что в M$ разделитель путей к классам ':' должен быть ';'

Теперь последняя и самая большая проблема — найти JRE, которая предоставляет команду java, которая понимает --module-path et.al. (которые были представлены в Java v9+). Задать этот вопрос меня побудил тот факт, что Oracle предоставляет JRE (через www.java.com), которая поддерживает Java версии 8!!!!! (Когда в настоящее время используется версия Java 20 и продолжает расти). Очевидно, оракул знает все, поэтому я не буду оспаривать это решение. Дело в том, что после всей этой тяжелой работы я безнадежен.

Все люди, ответившие на этот вопрос (спасибо всем за ваши усилия), предложили создать свою собственную JRE, используя jlink. У меня это не сработало. Он жалуется, что не находит базовую зависимость, например java.base (с использованием openJDK v17 в Linux Fedora, установленной через менеджер пакетов из пакета java-17-openjdk-devel : OpenJDK 17 Development Environment). Кроме того, неудачный пример hellofx предполагает, что мое приложение является модулем, но это не так. Кроме того, maven javafx:jlink также не работает (для меня), поскольку различные зависимости не найдены. Это загадка, потому что maven compile javafx:run работает без проблем.

Поскольку создание собственной JRE у меня не работает, я прибег к загрузке JRE, предоставленной https://adoptium.net/en-GB/temurin/releases/ (думаю, это связано с Eclipse). Это безопасно? Это "официально"? Не имею представления.

В ответе @Basil Bourque перечислено еще несколько вариантов. (И на самом деле это принятый ответ)

Я разместил демо-версию по адресу https://github.com/hadjiprocopis/javafx-uberjar

он работает на Linux и может создавать zip-архив дистрибутива для Linux, Mac и/или неназванных ОС.

Он основан на том, что ваше приложение разрабатывается как проект maven, поскольку все зависимости собираются с помощью плагина maven и Spring-Boot. Все зависимости javafx будут считываться из локального репозитория maven, который он использует для компиляции и запуска вашего приложения. Вам не нужно загружать какие-либо сторонние зависимости и сохранять параллельные версии!

спасибо за помощь (но нет, спасибо :))

Да, проект Adoptium был передан в [Eclipse Foundation](xx) после запуска в 2017 году под названием AdoptOpenJDK. См. Википедию. Что касается «безопасности», то проект полностью с открытым исходным кодом и общедоступен. Продукты JDK/JRE не только прошли тесты TCK, но и дополнительный набор тестов, придуманный в самом проекте Adoptium!

Basil Bourque 10.04.2024 17:03

Что касается «официального», официального JDK/JRE не существует. Java — это набор спецификаций, опубликованных Oracle. Любой может разработать реализацию этих спецификаций, однако для использования товарного знака «Java» требуется разрешение Oracle. Продукты JDK/JRE предлагают несколько компаний, включая Amazon, Microsoft, IBM, Red Hat, Oracle, SAP, Azul Systems, BellSoft и другие.

Basil Bourque 10.04.2024 17:04

Что касается тестовых наборов: TCK и AQAvit™ Verification.

Basil Bourque 10.04.2024 17:11

Другие вопросы по теме