В поисках 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 г.
Это, например, объяснено в openjfx.io/openjfx-docs/#modular
@MarkRotteveel Приложение helloworld похоже на лепку небоскребов из пластилина в детском саду. Ссылка, которую вы разместили, часто появляется. На самом деле это довольно неудачная попытка решить эту проблему.
Я конкретно говорю о том, что $JAVA_HOME/bin/jlink --module-path $PATH_TO_FX_MODS:mods --add-modules hellofx --output hellofx
создаст соответствующую JRE (или собственный образ среды выполнения) специально для вашего приложения. Тот факт, что вы спрашиваете, можете ли вы использовать JRE Java 8, подсказывает мне, что вы даже не пробовали этот путь.
Здесь у вас есть два вопроса. Тот, что в заголовке «Среда выполнения Java (JRE) с поддержкой модулей?» -> Ответ на этот вопрос прост (и я думаю, вы уже знаете) -> любая версия JRE 9+, потому что именно в Java 9 в Java была добавлена поддержка модулей.
«Каковы мои варианты запуска моего приложения на компьютерах, не предназначенных для разработчиков?» -> ответ на этот вопрос гораздо более сложен (слишком сложен, чтобы дать исчерпывающий ответ на StackOverflow IMO) и имеет множество решений, некоторые из которых представлены в ответе Бэзила. Чтобы получить однозначный ответ, вам, вероятно, придется задать более конкретный вопрос.
Существует разница между названием решения, которое вам не сильно поможет, и предоставлением пошагового руководства по его реализации, что может оказаться весьма сложным. Например, руководство пользователя jpackage или крутая документация jlink — они оба одинаково массивны.
Некоторые варианты и детали создания пользовательских JRE для распространения подробно обсуждаются в ответе на Как правильно получить модули JDK для толстой банки JavaFX с помощью jdeps, но есть большая вероятность, что это вас смутит. вместо того, чтобы помочь вам.
@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? Возможно я недостаточно искал?
JRE 8 на java.com устарела. Существует множество поставщиков современных JRE (и JDK), некоторые из них включают JavaFX. Например Azul JRE FX или Liberica Full JRE , или без JavaFX, Temurin , Corretto , Oracle , OpenJDK.
Два поставщика предоставляют версии своих продуктов 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 Создание приложений JavaFX — сложный, утомительный и чреватый проблемами процесс, к сожалению, худшая часть отличной в остальном платформы. У меня нет большого опыта, поэтому я не могу помочь. Предлагаю вам поискать ответы и комментарии, размещенные здесь экспертом jewelsea .
@bliako Как уже отмечалось, это может быть сложный процесс. Учитывая, что вы используете Spring, который, если я не ошибаюсь, пока не является модульным, я бы рекомендовал, чтобы ваш собственный код не был модульным. Фактически, забудьте о модулях, за исключением JavaFX и любых модулей из самого JDK. Выполните jpackage
, поместите JavaFX на --module-path
и добавьте необходимые модули с помощью --add-modules
(или создайте образ времени выполнения отдельно с помощью jlink
напрямую и укажите jpackage
на него с помощью --runtime-image
). Затем ваш код и все другие зависимости должны быть включены через --input
(см. также --main-jar
).
Таким образом, частью модульного образа времени выполнения являются только модули JavaFX и Java SE/JDK. Ваш код и любые другие зависимости будут загружены из пути к классам и, по большей части, будут функционировать так же, как и до Java 9. Node, вам может потребоваться явно добавить определенные модули, например модули jdk.crypto.xxx
, если вы хотите поддерживать SSL (т. е. если вы хотите поддерживать конечные точки HTTPS).
Вам следует попробовать использовать 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
Какие JDK и JavaFX вы используете?
версия 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
? и почему я должен доверять их дистрибутиву и что, если он скомпрометирует мои целевые машины?
Пока игнорируйте 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
?
правильно (и спасибо за помощь). а путь к модулю — это путь, который я извлек из jmods (из gluonhq.com/products/javafx), чтобы уточнить, что папка jmods содержит файлы .jmod. Исполняемый файл jlink
имеет версию v17.0.9 и *я думаю, он установлен openjdk (iam в Linux, и все это было установлено менеджером пакетов). Javafx SDK в данный момент не используется, только JMODS. Возможно, javafx предоставляет собственный jlink, который мне следует использовать?
JDK предоставляет jlink. Что-то не так с вашим JDK, если отсутствует java.desktop. Это должно работать и создать минимальные зависимости для проверки: jdk-17\bin\jlink --add-modules java.desktop --strip-debug --no-man-pages --no-header-files --output jre17.desktop
нет, Error: --module-path is not specified and this runtime image does not contain jmods directory.
А двоичный файл jlink
предоставляется java-17-openjdk-devel
менеджером пакетов Fedora. то же самое, что обеспечивает java
и javac
.
Вероятно, вы установили обезглавленный JDK, а не полный JDK.
Спасибо. Под «безголовым» вы подразумеваете отсутствие компонентов графического интерфейса или полную установку? Если вы не уверены, я сомневаюсь в том, что вы сказали. Неразумно, что единственный пакет Fedora, который предоставляет javac
, не содержит компонентов. В любом случае мне удалось запустить приложение в Windows с помощью adoptium
JRE. опишу как в ответе
В ответе от @BasilBourque перечислены варианты загрузки JRE, которая поддерживает новейшие функции Java, и понимает функции --add-modules
. Это общепринятый ответ на мой вопрос.
Однако я опишу здесь весь процесс упаковки моего приложения и его зависимостей, потому что в моем случае jlink продолжал жаловаться, что не нашел базовых зависимостей, см. комментарии под ответом @DuncG.
Я также разместил демо-версию на https://github.com/hadjiprocopis/javafx-uberjar
Создайте CLASSPATH, MODULEPATH и MODULES для своего приложения. Если вы используете maven, это легко сделать, проанализировав вывод mvn -X javafx:run@dry-run-cli
для создания указанных переменных.
Соберите зависимости (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
и т. д.
Структура дистрибутива zip/tar-ball будет такой:
а. lib
каталог, содержащий все сторонние jar-зависимости, даже jar-файлы модулей, даже jar-файлы для конкретной ОС, например. javafx-media-22-ea+11-mac.jar
, javafx-media-22-ea+11-win.jar
и т. д.
б. classes
каталог для классов ваших приложений или jar.
в. launchers
каталог для хранения сценариев запуска для вашей целевой ОС.
Сценарий запуска в целом будет выглядеть примерно так:
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!
Что касается «официального», официального JDK/JRE не существует. Java — это набор спецификаций, опубликованных Oracle. Любой может разработать реализацию этих спецификаций, однако для использования товарного знака «Java» требуется разрешение Oracle. Продукты JDK/JRE предлагают несколько компаний, включая Amazon, Microsoft, IBM, Red Hat, Oracle, SAP, Azul Systems, BellSoft и другие.
Что касается тестовых наборов: TCK и AQAvit™ Verification.
Дублирующий вопрос. Заменено на
jlink
, чтобы вы могли создать свою собственную JRE, которая даже может включать ваши собственные модули, чтобы--module-path
не требовался.