Skip to content
Advertisement

How to launch JavaFX source code file from command line?

Since JDK 11, the java command can launch a java source code file, i.e. no need to first compile your java source code. Here is my java source code:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class HelloJavaFxWorld extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        Label label = new Label("Hello JavaFX World");
        Pane root = new Pane(label);
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

I save this code as file HelloJavaFxWorld.java.
I open a command prompt window and enter the following command.

java HelloJavaFxWorld.java

This is (part of) the output.

HelloJavaFxWorld.java:1: error: package javafx.application does not exist
import javafx.application.Application;

How can I run a JavaFX source code file?

Advertisement

Answer

Since JDK 11 is modular, you need to add the JavaFX modules. Try the following.

java -p "pathtojavafx.graphics.jar;pathtojavafx.base.jar;pathtojavafx.controls.jar" --add-modules javafx.graphics,javafx.controls HelloJavaFxWorld.java

Replace pathto with the actual path to the JAR files. For example on my Windows 10 machine I have installed JDK 16.0.1 so I am using JavaFX 16 and have placed the [JavaFX] JAR files in this folder:

C:Program FilesJavajavafx-sdk-16lib

So my actual command for launching the JavaFX source code file is:

java -p "C:Program FilesJavajavafx-sdk-16libjavafx.graphics.jar;C:Program FilesJavajavafx-sdk-16libjavafx.base.jar;C:Program FilesJavajavafx-sdk-16libjavafx.controls.jar" --add-modules javafx.graphics,javafx.controls HelloJavaFxWorld.java

Note that instead of -p, you can use --module-path. Then the command becomes:

java --module-path "C:Program FilesJavajavafx-sdk-16lib" --add-modules javafx.graphics,javafx.controls HelloJavaFxWorld.java

Note that I enter that command from the folder containing the java source code file.

The above command may result in the following exception.

Exception in thread "main" java.lang.RuntimeException: java.lang.ClassNotFoundException: HelloJavaFxWorld
        at javafx.graphics/javafx.application.Application.launch(Application.java:310)
        at HelloJavaFxWorld.main(HelloJavaFxWorld.java:19)
Caused by: java.lang.ClassNotFoundException: HelloJavaFxWorld
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:636)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:182)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:519)
        at java.base/java.lang.Class.forName0(Native Method)
        at java.base/java.lang.Class.forName(Class.java:466)
        at javafx.graphics/javafx.application.Application.launch(Application.java:298)
        at HelloJavaFxWorld.main(HelloJavaFxWorld.java:19)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:567)
        at jdk.compiler/com.sun.tools.javac.launcher.Main.execute(Main.java:415)
        at jdk.compiler/com.sun.tools.javac.launcher.Main.run(Main.java:192)
        at jdk.compiler/com.sun.tools.javac.launcher.Main.main(Main.java:132)

This is because, when launching a java source code file, the source code is compiled and the compiled class is stored in memory, i.e. no .class file is created. Method launch(String...), in class javafx.application.Application, calls method forName, in class java.lang.Class in order to load the JavaFX application class. Since there is no HelloJavaFxWorld.class file, method forName throws ClassNotFoundException.

In order to fix that, simply change your java source code to call the other launch method. In other words, change method main to the following.

public static void main(String[] args) {
    launch(HelloJavaFxWorld.class, args);
}

Now, when I enter the above java command, I get the following window.

screen capture of JavaFX application window

User contributions licensed under: CC BY-SA
3 People found this is helpful
Advertisement