JavaFX Exception in thread “main” java.lang.NoClassDefFoundError: javafx/application/Application

我收到此错误

Exception in thread "main" java.lang.NoClassDefFoundError: javafx/application/Ap
plication
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Caused by: java.lang.ClassNotFoundException: javafx.application.Application
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 13 more

尝试运行我的类文件时,这是源

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.util.concurrent.Executor;

public class TestApplication extends Application{

    @Override
    public void start(Stage stage) throws Exception {
        new TestApplication();
    }

    public TestApplication() {
        try{
            final Parent root = FXMLLoader.load(Executor.class.getResource("test.fxml"));
            final Stage stage = new Stage(){{
                setScene(new Scene(root, 300, 250));
                setTitle("Test");
                setResizable(false);
                show();
            }};
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

fxml 文件包含一个简单的 gui。


答案 1

在过去的几个小时里,我一直在研究同样的问题。尽管我还没有看到它被明确地写出来,但似乎你必须使用JavaFX打包工具之一,它要么是Ant任务,要么是javafxpackager可执行文件。(见 http://docs.oracle.com/javafx/2/deployment/packaging.htm,第5.3.1节)。NetBeans IDE 使用 Ant 来打包代码。(我正在使用IntelliJ)

当您使用这些打包方法之一时,除了应用程序的所有代码和资源之外,它还会将以下内容添加到输出 JAR 文件中:

/com/javafx/main/Main$1.class
/com/javafx/main/Main$2.class
/com/javafx/main/Main.class
/com/javafx/main/NoJavaFXFallback.class

设置好这些后,您可以从命令行运行应用:

java -jar outjar.jar

一切正常。如果我删除额外的com.javafx.main文件,应用程序将无法运行。

为了仔细检查这一点,我查看了JavaFX样本中的所有四个JAR文件(BrickBreaker,Ensemble,FXML-LoginDemo和SwingInterop)。它们也都有“额外”文件。

对于我的小型测试应用,我使用此命令行构建一个“可执行”JAR 文件:

javafxpackager -createjar -appclass sample.Main -outfile outjar -v -nocss2bin -srcdir C:\workspaces\garoup1\out\production\javafx1

希望这有帮助!


答案 2

我遇到了同样的问题,以下步骤帮助我解决了它,

在运行应用程序时添加 vm 参数,

--module-path  /home/user/Java-libraries/openjfx-11.0.2_linux-x64_bin-sdk/javafx-sdk-11.0.2/lib/ --add-modules javafx.controls,javafx.fxml

注意:

  • --module-path 将包含 Java fx 的 jars
  • 我用了 open-jdk 13

在你的日食中配置它(如果你正在使用),或者你可以编译和运行,就像这样,

编译

javac --module-path /path/to/java-fx-libs/ --add-modules javafx.controls,javafx.fxml *.java

java --module-path /path/to/java-fx-libs/ --add-modules javafx.controls,javafx.fxml MyMainClass