РЕДАКТИРОВАТЬ №3 (РЕШЕНИЕ)
Я решил эту проблему, не используя ни один из предложенных ответов. В конце у меня есть несколько папок и файлов, которые я могу заархивировать и отправить, которые не требуют установки java и которые можно запустить, дважды щелкнув .bat-файл. Для меня сработала следующая процедура:
Создать новый проект Gradle с нуля
Добавить все модули / код в src / main / java папка
создать AppLauncher. java, который вызывает основной метод
перемещает все fxml / css изнутри из папок java в папку ресурсов
убедитесь, что ваши вызовы f xml - / css -файлы не подвергаются ошибочному рефакторингу, и используйте следующий код :
//Main start method
Parent root = FXMLLoader.load(new File("fxml/main.fxml").toURI().toURL());
//Other FXML loading operations
FXMLLoader loader = null;
try { loader = new FXMLLoader(new File("fxml/GRAPHISO_proof.fxml").toURI().toURL()); }
...
и для таблиц стилей:
scene.getStylesheets().add("file:///" + new File("css/text-field-red-border.css").getAbsolutePath().replace('\\', '/'));
- создать
module-info.java
внутри папки src / main / java со следующей структурой:
module XYZ {
requires javafx.controls;
requires javafx.graphics;
requires java.desktop;
requires javafx.fxml;
requires javafx.base;
opens main.controller to javafx.fxml;
//Open ALL controller-modules (all of my modules have a controller-submodule, e.g. main/controller, dlog/controller, graphiso/controller, ...) to javafx.fxml
//...
exports main;
}
убедитесь, что gradle / wrapper / gradle-wrapper.properties установлен на не очень старую версию gradle (distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip
)
используйте это в качестве build.gradle:
buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath 'org.openjfx:javafx-plugin:0.0.8'
classpath 'com.github.jengelman.gradle.plugins:shadow:5.2.0'
}
}
plugins {
id 'java'
id 'org.beryx.jlink' version '2.19.0'
}
apply plugin: 'org.openjfx.javafxplugin'
apply plugin: 'com.github.johnrengelman.shadow'
group 'org.example.abc'
version '1.0'
sourceCompatibility = 1.14
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
}
javafx {
sdk = 'C:\\Program Files\\Java\\javafx-sdk-14.0.1'
modules = [ 'javafx.controls', 'javafx.fxml', 'javafx.base' ]
}
jlink {
mainClassName = 'main.AppLauncher'
launcher {
name = 'Whatever you want as name'
}
}
tasks.jlink.doLast {
copy {
from('src/main/resources')
into("$buildDir/image/bin")
}
copy {
from 'C:\\Program Files\\Java\\javafx-sdk-14.0.1\\bin\\glass.dll',
'C:\\Program Files\\Java\\javafx-sdk-14.0.1\\bin\\javafx_font.dll',
'C:\\Program Files\\Java\\javafx-sdk-14.0.1\\bin\\prism_d3d.dll',
'C:\\Program Files\\Java\\javafx-sdk-14.0.1\\bin\\prism_sw.dll'
into("$buildDir/image/bin")
}
}
Обратите внимание, как я включил некоторые dll-файлы в tasks.jlink.doLast. Без них программа продолжает давать сбой и обращается к QuantumRenderer.
- установите двоичные файлы openjdk-14.0.1 и соответствующим образом установите% JAVA_HOME%, также установите openjfx-14.0.1 (программе требуются некоторые библиотеки DLL, как указано выше)
Исходный вопрос
Я пытаюсь создать образ времени выполнения из проекта, который я реализовал в JavaFX 11, просто используя функциональность «конфигурации запуска» в IntelliJ. Мне кажется, что большой проблемой здесь является то, что мои знания maven / gradle практически отсутствуют, и что эти инструменты сборки имеют решающее значение на этом этапе.
Внутри C:\Program Files\Java
Я установил:
javafx-sdk-11.0.2
и jdk-13.0.2
Я настроил параметры виртуальной машины внутри «конфигурации запуска» IntellJ как --module-path "C:\Program Files\Java\javafx-sdk-11.0.2\lib" --add-modules javafx.controls,javafx.fxml
и установил основной класс в "main.Main".
Моя структура проекта выглядит так: Структура папок проекта
Выделенный Main. java - это обычный Main-файл (расширяющий Приложение, вызывающее запуск (args) внутри main). Он может загружать другие windows, находящиеся в других пакетах. Это не Launcher-файл, который не расширяет приложение и вызывает фактический основной файл (как это предлагается несколькими решениями для построения градиентов).
Первоначально я пробовал чтобы получить .jar-файл, который можно запустить без дополнительных параметров на Windows и Linux. После некоторого чтения я решил, что это не будет чистым решением, и многие источники заявили, что в современных решениях файлы .jar будут объединены и отправлены с файлом .bat /.sh, который включает все необходимые параметры. .
Мой вопрос: как мне лучше действовать и какие конфигурации / дополнительные файлы мне нужны, чтобы преобразовать этот проект «кликни для запуска внутри IDE» в «автономное приложение», которое я могу поделиться по электронной почте или аналогичным образом?
Я попытался создать новый проект Gradle через IntelliJ (следуя https://openjfx.io/openjfx-docs) и скопировал исходные файлы в src / main / java. Затем я опробовал предоставленный файл build.gradle и - после того, как это не сработало - внес некоторые изменения, предложенные различными блогами / форумами / et c. Ни один из них не позволял мне запускать проект через IntelliJ или из командной строки.
Большинство из этих подходов позволяют мне построить проект, но при попытке запустить с помощью «gradlew run» или вызова «java -jar file.jar "Я получаю сообщения об ошибках из-за исключений классов или сообщения о том, что мне все еще не хватает модулей javafx. Я также пробовал преобразовать мой текущий проект в проект gradle, но это даже не позволило мне впоследствии построить проект.
EDIT # 1 (JPackageScriptFX)
Я просмотрел ссылку на JPackageScriptFX. Теперь я получаю установщик (использующий mvn clean install
), который работает на моем компьютере, но при запуске полученного исполняемого файла я получаю сообщение об ошибке «Не удалось запустить JVM».
Что я сделал для этого far is:
установлен jdk-14.0.1 и установлен JAVA_HOME, установлен wix311
создан новый проект IntelliJ maven под названием "bachelor_maven"
удален исходный sr c -папка
добавлен новый модуль «ZKP_Inspector» и мои старые модули внутри полученного src / main / java папка
добавлены и отредактированы src / main / logo / windows / duke.ico, два файла pom. xml и build_app.bat из JPackageScriptFX
реализован AppLauncher. java, который вызывает Main. java
Мои файлы конфигурации:
-
Новая структура проекта: Imgur
pom. xml (Уровень проекта, bachelor_maven): Pastebin
* 1 144 * пом. xml (уровень модуля, ZKP_Inspector): Pastebin
build_app.bat: Pastebin
EDIT # 2
Я попытался удалить --runtime-image target/java-runtime ^
из параметров jpackage в файле build_app.bat, чтобы позволить jpackage решать, что включить. Это увеличило размер файла установщика (как и ожидалось), но привело к той же ошибке при попытке выполнить полученную программу.
Я также загрузил файлы JMOD и использовал их в задаче jlink в build_app. bat, как указано здесь .
Итак, я заменил --add-modules %detected_modules%,%manual_modules% ^
на
--module-path "C:\Program Files\Java\javafx-jmods-11.0.2" --add-modules %detected_modules%,%manual_modules%,javafx.controls,javafx.fxml
Это создало еще один установщик, который работал нормально и чья программа выкинул ту же ошибку.