使用 launch4j 的 EXE 不起作用(javafx 项目),需要从控制台运行 JAR 文件,指定 javafx 位置的 VM 参数

问题描述 投票:0回答:1

使用 javafx 创建了一个非常简单的 gui,试图测试创建 javafx exe 的工作原理,从 eclipse 中提取了一个可运行的 jar 文件,但除非我使用 cmd 并添加 VM 参数 --module-path "" --否则该文件不会运行add-modules=javafx.controls,javafx.fxml,所以我尝试使用 launch4j 从该 jar 文件创建一个 exe,它会将我重定向到 java.com/downloads,所以我现在将 JRE bin 和 lib 文件夹与 exe 文件一起嵌入它根本不运行。 我是不是错过了什么或者做错了什么?

java javafx executable-jar launch4j
1个回答
3
投票

包装到原生容器中:

要将应用程序包装到 EXE 或 DEB 中,或者...,您不应该使用 launch4j,而应该使用“jpackage”。它是 Oracle 的官方工具,用于将 JAR 包装成 EXE 或 DEB,..并且包含在 JDK 17 LTS 中。它就像一个魅力。请注意:您的项目不必使用 JDK 17,也可以使用 JDK 11。

JFX 概况:

我无法告诉你为什么,但 JFX 不喜欢它,如果包含

main()
的类从另一个类扩展。我花了好几个小时才发现这一点。这可能听起来很愚蠢、不必要或类似,但我只能建议你这样做:

主课:

package com.wedasoft.FxMultiMessageSender;

public class FxMultiMessageSenderMain {

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

}

JFX-应用程序起始类:

package com.wedasoft.FxMultiMessageSender;

public class App extends Application {

    public static final String APPLICATION_NAME = "xxxxxxxx";

    private Stage primaryStage;
    private Scene primaryScene;

    public static void main(String[] args) {
        //createDatabase();
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        System.out.println("Starting " + APPLICATION_NAME);
    }

}

不是真正有效的 JAR:

您的问题听起来像是您正在使用普通的 Java 项目并嵌入了 JFX 库。如果是这样,我只能建议你至少在 JFX 项目中使用 Maven 或 Gradle;没有他们之一你就不会快乐。

如果您使用 Maven,请尝试将您的 pom.xml 与以下 pom.xml 集成。您不需要指定任何 VM 参数。您需要在

<mainClass>com.wedasoft.FxMultiMessageSender.FxMultiMessageSenderMain</mainClass>
javafx-maven-plugin
中调整主类
maven-shade-plugin

<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wedasoft</groupId>
<artifactId>FxMultiMessageSender</artifactId>
<version>0.0.2</version>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
    <javafx.version>17</javafx.version>
</properties>

<dependencies>
    <!-- javafx -->
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>${javafx.version}</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-fxml</artifactId>
        <version>${javafx.version}</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-media</artifactId>
        <version>${javafx.version}</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-swing</artifactId>
        <version>${javafx.version}</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-web</artifactId>
        <version>${javafx.version}</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <release>11</release>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-maven-plugin</artifactId>
            <version>0.0.8</version>
            <executions>
                <execution>
                    <!-- Default configuration for running -->
                    <!-- Usage: mvn clean javafx:run -->
                    <id>default-cli</id>
                    <configuration>
                        <mainClass>com.wedasoft.FxMultiMessageSender.FxMultiMessageSenderMain</mainClass>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.4</version>
            <executions>
                <execution>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <shadedArtifactAttached>true</shadedArtifactAttached>
                        <transformers>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>com.wedasoft.FxMultiMessageSender.FxMultiMessageSenderMain</mainClass>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

使用 gradle 的 JavaFX 应用程序示例

https://github.com/davidweber411/SimpleJavaFxAppWithoutModules

© www.soinside.com 2019 - 2024. All rights reserved.