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

new*_*ing 3 java javafx executable-jar launch4j

使用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 文件一起嵌入根本不运行。我错过了什么或者做错了什么吗?

Dav*_*ber 5

包装到本机容器中:

为了将您的应用程序包装到 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);
    }

}
Run Code Online (Sandbox Code Playgroud)

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);
    }

}
Run Code Online (Sandbox Code Playgroud)

没有真正工作的 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>
Run Code Online (Sandbox Code Playgroud)

使用 gradle 运行 JavaFX 应用程序的示例

https://github.com/davidweber411/JavaFxAppGradleNonModular

使用 Maven 运行 JavaFX 应用程序的示例

https://github.com/davidweber411/JavaFxAppMavenNonModular

JavaFx 项目生成器

我出于私人目的创建了一个项目生成器,但如果您愿意,您也可以从 GitHub 下载并使用它:

https://github.com/davidweber411/JavaFxProjectGenerator