我遇到了同样的问题,经过一些深入研究,我在部署中找到了解决此错误的方法。我认为这与 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'");
这并不总是最好的方法。 不过我也遇到了同样的问题,不过已经解决了
首先,如果你使用的是 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上执行)
我遇到了完全相同的问题。我在该项目中使用了 Maven 和 Spring Boot。因此,首先使用 maven 构建 jar 后,然后使用 org.springframework.boot.loader.JarLauncher 作为 -appclass 选项。问题解决了。
我遇到了这个确切的问题,对我来说,这只是因为我使用了不匹配的 Java 版本。我正在使用 Java 17 JDK 和 JavaFX 17 构建一个 Jar,并尝试使用 Java 17 SDK 将其打包为 EXE。但是,我使用的是 Java 8 SDK(包含它的最后一个 Java 版本)中的 Javapackager。我认为 Javapackager 是版本盲的,因为它似乎工作得很好,直到我运行 EXE 文件的部分。但是,一旦我转而使用 Java 8 SDK 执行所有操作,它立即开始按预期工作。