找不到类 - JavaFX 原生打包

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

我正在尝试部署我创建的程序,但安装后出现错误。

我使用Native Packaging将其打包为EXE安装程序,当我单击所述安装程序时,它说找不到主类。以下是一些错误的屏幕截图:

为什么找不到班级?

java javafx native packaging
4个回答
1
投票

我遇到了同样的问题,经过一些深入研究,我在部署中找到了解决此错误的方法。我认为这与 CSS 和静态字段的编译方式以及 jfx 应用程序的启动有关。顺便说一句,我不确定它是否在 jdk/jfx 的更高版本中得到修复。 如果您在主 JavaFX 应用程序类中将任何 FX 对象声明为该类中的全局静态,就会出现问题。那么无论安装程序如何,您都无法通过 exe 启动!否则,可以通过双击等方式执行 jar 或 java –jar foo.jar。 解决方法有点荒谬:(1) 不要在主应用程序中声明任何静态 FX 对象。 (2) 将它们放在其他地方,即使作为内部类!

问题。这个例子不会通过exe执行:

public class FooBarJavaXDDeploy extends Application {
    private static final Button btn = new Button(); // Problem
    public void init(Stage primaryStage) {
        btn.setText("Say 'Hello World'");
        btn.setOnAction((ActionEvent event) -> {
            System.out.println("Hello Btn World!");
        });
        StackPane root = new StackPane();
        root.getChildren().add(btn);
        Scene scene = new Scene(root, 300, 250);
        primaryStage.setScene(scene);
    }
    @Override public void start(Stage primaryStage) {
        init(primaryStage);
        primaryStage.show();
    }
    public static void main(String[] args) {
        System.out.println("Goes through Main");
        launch(args);
    }
}

解决方法:

public class FooBarJavaXDDeploy extends Application {
    static class INNER_STATIC_CLASS {
        static final Button btn = new Button();
    }

    public void init(Stage primaryStage) {
        INNER_STATIC_CLASS.btn.setText("Say 'Hello World'");
        INNER_STATIC_CLASS.btn.setOnAction((ActionEvent event) -> {
            System.out.println("Hello Btn World!");
        });
        StackPane root = new StackPane();
        root.getChildren().add(INNER_STATIC_CLASS.btn);

... 解决方法 2:

public class FooBarJavaXDDeploy extends Application {
    public void init(Stage primaryStage) {
        Button btn = new Button();
        btn.setText("Say 'Hello World'");

0
投票

这并不总是最好的方法。 不过我也遇到了同样的问题,不过已经解决了

首先,如果你使用的是 kotlin, 创建一个主类,作为新的入口点,作为

Java
文件。

生成的Java文件应如下所示:

package {your_package};

import javafx.application.Application;

public class EP extends Main {
    public static void main(String... args) {
        Application.launch(args);
    }
}

Main
应该是看起来是当前入口点的类。 也许
Main
被定义为
open class Main: Application () {

将本次生成的EP类设置为入口点(主类)。

如果生成的exe为

-native image
, 请尝试执行生成的exe,注意以下几点。

○确保生成的目录不包含空格或多字节。

○不要直接从USB等执行(复制到PC上执行)


0
投票

我遇到了完全相同的问题。我在该项目中使用了 Maven 和 Spring Boot。因此,首先使用 maven 构建 jar 后,然后使用 org.springframework.boot.loader.JarLauncher 作为 -appclass 选项。问题解决了。


0
投票

我遇到了这个确切的问题,对我来说,这只是因为我使用了不匹配的 Java 版本。我正在使用 Java 17 JDK 和 JavaFX 17 构建一个 Jar,并尝试使用 Java 17 SDK 将其打包为 EXE。但是,我使用的是 Java 8 SDK(包含它的最后一个 Java 版本)中的 Javapackager。我认为 Javapackager 是版本盲的,因为它似乎工作得很好,直到我运行 EXE 文件的部分。但是,一旦我转而使用 Java 8 SDK 执行所有操作,它立即开始按预期工作。

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