С Java / JavaFX 11 теневая / толстая банка не будет работать.
Как вы можете прочитать здесь:
Эта ошибка исходит от sun.launcher.LauncherHelper
в модуле java.base. Причина этого в том, что приложение Main расширяет Application
и имеет метод main. В этом случае LauncherHelper
проверит, присутствует ли модуль javafx.graphics как именованный модуль:
Optional<Module> om = ModuleLayer.boot().findModule(JAVAFX_GRAPHICS_MODULE_NAME);
Если этого модуля нет, запуск прерывается. Следовательно, в этом случае нельзя использовать библиотеки JavaFX в качестве jar-файлов в пути к классам.
Более того, каждый jar-файл JavaFX 11 имеет файл module-info.class
на корневом уровне.
Когда вы объединяете все содержимое банок в одну толстую банку, что происходит с этими файлами с одинаковыми именами и одинаковым расположением? Даже если в толстой банке все они хранятся, как это можно определить как единый модуль?
Есть запрос в поддержку этого, но он еще не рассмотрен: http://openjdk.java.net/projects/jigsaw/spec/issues/#MultiModuleExecutableJARs
Предоставляет средства для создания исполняемого модульного «uber-JAR», который содержит более одного модуля, сохраняя идентичность модулей и границы, так что все приложение может быть отправлено как единый артефакт.
Плагин shadow по-прежнему имеет смысл объединить все ваши другие зависимости в одну банку, но в конце концов вам придется запустить что-то вроде:
java --module-path <path-to>/javafx-sdk-11/lib \
--add modules=javafx.controls -jar my-project-ALL-1.0-SNAPSHOT.jar
Это означает, что, в конце концов, вам придется установить JavaFX SDK (для каждой платформы), чтобы запустить эту банку, которая использовала зависимости JavaFX из maven central.
В качестве альтернативы вы можете попробовать использовать jlink
для создания облегченной JRE, но ваше приложение должно быть модульным.
Также вы можете использовать Javapackager для создания установщика для каждой платформы. См. http://openjdk.java.net/jeps/343, который создаст упаковщик для Java. 12.
Наконец, есть экспериментальная версия Javapackager, которая работает с Java 11 / JavaFX 11: http://mail.openjdk.java.net/pipermail/openjfx-dev/2018-September/022500.html
ИЗМЕНИТЬ
Поскольку средство запуска Java проверяет, расширяет ли основной класс javafx.application.Application
, и в этом случае ему требуется среда выполнения JavaFX, доступная в виде модулей (а не в виде jar-файлов), возможным обходным путем для его работы должно быть добавление нового Главный класс, который будет основным классом вашего проекта, и этот класс будет тем, который вызывает ваш класс JavaFX Application.
Если у вас есть javafx11
пакет с классом Application:
public class HelloFX extends Application {
@Override
public void start(Stage stage) {
String javaVersion = System.getProperty("java.version");
String javafxVersion = System.getProperty("javafx.version");
Label l = new Label("Hello, JavaFX " + javafxVersion + ", running on Java " + javaVersion + ".");
Scene scene = new Scene(new StackPane(l), 400, 300);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Затем вам нужно добавить этот класс в этот пакет:
public class Main {
public static void main(String[] args) {
HelloFX.main(args);
}
}
И в вашем файле сборки:
mainClassName='javafx11.Main'
jar {
manifest {
attributes 'Main-Class': 'javafx11.Main'
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}
Теперь вы можете запустить:
./gradlew run
or
./gradlew jar
java -jar build/libs/javafx11-1.0-SNAPSHOT.jar
Конечная цель - иметь модули JavaFX как именованные модули на пути к модулю, и это похоже на быстрое / уродливое решение для тестирования вашего приложения. Для распространения все же предлагаю вышеупомянутые решения.
person
José Pereda
schedule
29.09.2018