gpt4 book ai didi

JavaFX native 打包 - 初始化静态变量时出现奇怪错误

转载 作者:行者123 更新时间:2023-11-30 07:52:16 24 4
gpt4 key购买 nike

我正在 Netbeans 中开发一个 JavaFX 项目,该项目目前大约有 3000 行,并且我定期打包为 .exe 进行测试,但从未遇到过像这种奇怪事件这样的问题。

当 native 打包为 Windows .exe 文件时,我发现在安装 .exe 并启动我的程序后,我收到一个弹出窗口,提示“未找到类 {mypackage}/{mymainclass}。 ”后跟“无法启动 JVM。

在 Netbeans 中启动程序,打包为 .exe,并在 Powershell 中使用“java -jar {app}.jar”启动 .jar 所有绝对没有错误。甚至安装的应用程序文件夹中的 .jar 也没有问题,命令行上没有错误。

在对 git 提交和本地打包进行拖网搜索几个小时后,我设法将问题追溯到一行代码: private static ComboBox choices = new ComboBox();

当我在初始化程序中初始化 ComboBox 时,该程序在从 .exe 安装后神奇地工作:

private static ComboBox choices;
{
choices = new ComboBox();
}

但是,当我使用静态初始化程序时(通过将 static 放在第一个大括号前面),即使 Netbeans 声明“初始化程序可以是静态的”,我也会遇到与以前相同的错误。

这很令人费解,因为 Java 显然对代码本身没问题,但在通过 native 打包程序后它不会启动。我已经使用了大量类似的代码行来初始化其他类中的静态变量,没有任何不良影响。

我尝试在主类中添加类似的行:private static CheckBox chkbox = new CheckBox();

它在安装 .exe 后引起了完全相同的错误(和以前一样,.jar 没问题),但是当我将该行剪切并粘贴到不同的类时,它没有任何效果。

有趣的是,我的主类已经有一个静态 boolean 值,它的初始化方式与 ComboBox 和 CheckBox 的初始化方式相同:private static boolean someBool = true;但是 boolean 值没有问题。

谁能解释一下这背后的原因?谢谢。

编辑:我也尝试在另一台机器上打包,但在同一个 git 提交后它停止工作。我使用的是 1.8.0_144 版的 JDK 和 JRE。

编辑 2:这里是产生错误的简单示例的主类。

package testproject;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class MainApplication extends Application {

private static CheckBox testCheckBox = new CheckBox(); // Causes error after launching from installed .exe

/* UNCOMMENT THIS SECTION AND REMOVE THE " = new CheckBox()" ABOVE TO FIX THE ERROR
{
testCheckBox = new CheckBox();
}
*/

@Override
public void start(Stage primaryStage) {
StackPane root = new StackPane();
Scene scene = new Scene(root, 300, 250);

primaryStage.setTitle("Empty window");
primaryStage.setScene(scene);
primaryStage.show();
}

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

}

最佳答案

我会避免在静态初始化器中创建 JavaFX 小部件(例如静态字段或静态 block ),因为这会在加载类时创建它们,这可能发生在任何线程中 。您希望在 JavaFX 应用程序线程中发生这种情况。
在您的情况下,它发生在主线程中,这绝对是不正确的。

检查 this answer有关 JavaFX 应用程序启动以及线程如何参与该过程的更多详细信息。

尝试在“JavaFX 应用程序线程”之外初始化 JavaFX 小部件(据我所知)是未定义的行为,并且可能以许多不同的方式失败(或运气好)。如果创建失败,则类加载失败(因为静态初始化失败),因此“找不到类”。不幸的是,由于这发生在加载主类时,您看不到初始错误,只是“找不到类 XXX”。

可能在您的情况下,java launcher 可以很好地处理这个初始化,但是你的 .exe 使用的 launcher 是不同的。我对它失败并不感到惊讶。我同样惊讶它可以与常规 java 一起使用 :)

关于JavaFX native 打包 - 初始化静态变量时出现奇怪错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46084756/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com