Как выполнить JAVA FX 11 JAR без предоставления аргументов VM через CMD - PullRequest
1 голос
/ 18 мая 2019

Java: JDK 12
Инструмент сборки: Maven
IDE: Eclipse
ОС: Windows

У меня есть простой фрагмент кода Java 11, который отображает простой пустой экран.Я сделал развернутый исполняемый файл JAR с использованием Eclipse.Он прекрасно работает, когда я даю следующую команду, используя CMD:

CMD command to run jar

Как видно, мне нужно предоставить модули во время выполнения файла JAR.

Если мы пропустим этот шаг, мы получим ошибку прямого выполнения JAR:

JAR direct execution error

Как я уже пробовал использовать maven как:

--Maven pom.xml

<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.proj1</groupId>
    <artifactId>Proj1</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <type>maven-plugin</type>
        </dependency>

        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>11.0.2</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>13-ea+7</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                <compilerArgs>
                <arg>--add modules</arg><arg> javafx.controls,javafx.fxml,javafx.graphics</arg>
                </compilerArgs>
                    <source>${jdk.version}</source>
                    <target>${jdk.version}</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.1</version>
                <configuration>
                    <mainClass>org.openjfx.App</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>

Но даже когда это сделано, экспортированный исполняемый JAR-файл все еще требует аргументов.

Можно ли как-то избежать этого через CMDи сделать исполняемый файл JAR, просто дважды щелкнув по нему с помощью Maven.

Я спрашиваю не о том, как решить исключительную ситуацию времени выполнения javaFx, а о том, как ее решить путем добавления зависимостей, чтобы при распределении JAR клиент делалне нужно передавать аргументы времени выполнения и выполнять работу простым щелчком мыши.

1 Ответ

0 голосов
/ 19 мая 2019

С помощью плагина JavaFX maven вы можете выполнить две цели: run и jlink.Первый просто запустит проект с необходимыми аргументами (--module-path, --add-modules), поэтому вы можете запустить его из командной строки:

mvn clean javafx:run

Конечно, это не предназначено для распространения.

javafx: jlink

Однако, если ваш проект модульный (т.е. у вас есть файл module-info.java), вы можете установить свой плагин следующим образом:

<plugin>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-maven-plugin</artifactId>
    <version>0.0.2</version>
    <configuration>
        <mainClass>hellofx/org.openjfx.App</mainClass>
        <launcher>app</launcher>
        <jlinkImageName>appDir</jlinkImageName>
        <jlinkZipName>appZip</jlinkZipName>
    </configuration>
</plugin>

и запустите:

mvn clean javafx:jlink

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

target/appdir/app

См. Параметры плагина здесь .

Плагин Shade

Вы также можете использовать maven-shade-plugin.

Как объяснено здесь вам понадобится основной класс, который не расширяется от Application:

Launcher.java

package org.openjfx;

public class Launcher {

    public static void main(String[] args) {
        App.main(args);
    }
}

А теперь вы можете добавить плагин Shade к вашему пом:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.2.1</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <transformers>
                    <transformer implementation=
                                         "org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>org.openjfx.Launcher</mainClass>
                    </transformer>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>

Запустить mvn clean package, и он сгенерирует ваш толстый кувшин, которыйВы можете распространять и запускать как:

java -jar target/hellofx-1.0-SNAPSHOT.jar

Кроссплатформенный

Обратите внимание, что в обоих случаях (плагин jlink или shade) у вас будет баночка, которую вы можетераспространять только для запуска на той же платформе, что и ваша.

Однако вы можете сделать его мультиплатформенным, если вы включите также зависимости для других платформ:

<dependency>
  <groupId>org.openjfx</groupId>
  <artifactId>javafx-controls</artifactId>
  <version>12.0.1</version>
</dependency>
<dependency>
  <groupId>org.openjfx</groupId>
  <artifactId>javafx-fxml</artifactId>
  <version>12.0.1</version>
</dependency>
<dependency>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-graphics</artifactId>
    <version>12.0.1</version>
    <classifier>win</classifier>
</dependency>
<dependency>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-graphics</artifactId>
    <version>12.0.1</version>
    <classifier>linux</classifier>
</dependency>
<dependency>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-graphics</artifactId>
    <version>12.0.1</version>
    <classifier>mac</classifier>
</dependency>
...