Требуется ли плагин javafx-maven для доставки приложения javafx после JDK11?

Я пытаюсь выяснить, какой минимум pom.xml использовать для создания приложения javafx hello-world, которое может быть предоставлено клиенту как jar + ./lib и запустить с java -jar.

Я использовал:

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example.javafx</groupId>
    <artifactId>javafx-jdk14-example</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>14</maven.compiler.source>
        <maven.compiler.target>14</maven.compiler.target>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>com.example.javafx.app.Main</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>            
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>3.1.1</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>14</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-graphics </artifactId>
            <version>14</version>
            <classifier>linux</classifier>
        </dependency>        
    </dependencies>    
</project>

Main.java

package com.example.javafx.app;

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
 
public class Main extends Application {
    public static void main(String[] args) {
        launch(args);
    }
    
    @Override
    public void start(Stage primaryStage) {
        GridPane grid = new GridPane();
        grid.setAlignment(Pos.CENTER);  // Override default
        grid.setHgap(10);
        grid.setVgap(12);        
        
        Button btn = new Button();

        
        btn.setText("Clickme");
        btn.setOnAction((t) -> System.out.println("Clicked!"));
        
        grid.add(btn, 0, 0);
        primaryStage.setScene(new Scene(grid, 640, 480));
        primaryStage.show();
    }
}

Обратите внимание: Я не использую module-info.java в своем приложении.

Но когда я его запускаю:

mvn clean package
cd target
/jdk14/bin/java -jar javafx-jdk14-example-1.0.0.jar

Я получил:

Ошибка: компоненты среды выполнения JavaFX отсутствуют и необходимы для запуска этого приложения.

Если я использую то же самое с JDK10 (также compiler.source/target=10 и org.openjfx deps с комментариями), то вышеуказанное работает нормально.

Есть ли другой способ (на JDK11 +) построить и затем запустить приложение изнутри целевого каталога без необходимости использовать javafx-maven-plugin?


person Marinos An    schedule 23.06.2020    source источник
comment
Ваш основной класс не может расширяться javafx.application.Application, если JavaFX помещен в путь к классам (вместо пути к модулю). При запуске Java с java -jar ... используется путь к классам. Создайте отдельный основной класс, который просто запускает JavaFX.   -  person Slaw    schedule 23.06.2020
comment
@Slaw Спасибо за отзыв. Ваш ответ помог мне найти команду, которую я искал.   -  person Marinos An    schedule 23.06.2020


Ответы (1)


С помощью @Slaw я нашел способ запустить приложение javafx (созданное без javafx-maven-plugin):

cd target
java -p lib/ --add-modules javafx.controls -jar javafx-jdk14-example-1.0.0.jar

Мне нужно явно добавить модуль javafx.controls.

Нижняя линия:

javafx-maven-plugin не требуется для создания и доставки приложения javafx.

person Marinos An    schedule 23.06.2020