I am new to Java and currently reading through a text and learning. I have installed the JDK in my /opt
directory (working on Kubuntu). I have also installed openjfx in /opt
. Since I work out the terminal, whenever I want to compile or run something involving a module from JavaFX, I use
javac --module-path $PATH_TO_FX --add-modules ALL-MODULE-PATH className.java
However, when I try the same thing with jshell
it will not work. That is,
jshell --module-path $PATH_TO_FX --add-modules ALL-MODULE-PATH
What I am trying to find out is, is there any way I can install the JavaFX SDK so that it is merged with the Java SDK directory and saves me having to use the flags whenever I want to compile/run a program that requires any modules from JavaFX?
If not, can anyone tell me why the jshell
comand above will not work as I expect it to?
For this part of your question:
What I am trying to find out is, is there any way I can install the JavaFX SDK so that it is merged with the Java SDK directory and saves me having to use the flags whenever I want to compile/run a program that requires any modules from JavaFX?
you can use jlink
, which generates a custom runtime image. In order to include services in the generated runtime image, use the --bind-services
option. For reasons I don't quite understand, to include jshell
in this, you must explicitly add the jdk.jshell
module (simply using --add-modules ALL-MODULE-PATH
will not work). So you need something like:
jlink --module-path $PATH_TO_FX --add-modules javafx.controls,javafx.fxml,jdk.jshell --bind-services --output JavaWithFX
to create a JDK that includes the JavaFX modules. You might need to include other JavaFX modules (e.g. javafx.web
if you are using WebView
, javafx.media
if you are using MediaPlayer
, etc.), or omit javafx.fxml
if you are not using FXML.
Now you can just use that JDK to compile and run:
export JAVA_HOME=JavaWithFX
javac ClassName.java
java ClassName
(or possibly export PATH=JavaWithFX/bin:$PATH
instead of the export JAVA_HOME
, depending on how Java works on your system).
Running
JavaWithFX/bin/jshell
will give you a jshell that includes the JavaFX modules:
% JavaWithFX/bin/jshell
| Welcome to JShell -- Version 20
| For an introduction type: /help intro
jshell> import javafx.beans.property.SimpleIntegerProperty
jshell> var x = new SimpleIntegerProperty(0)
x ==> IntegerProperty [value: 0]
jshell> x.addListener((obs, oldValue, newValue) -> System.out.printf("x changed from %d to %d%n", oldValue, newValue))
jshell> x.set(42)
x changed from 0 to 42
jshell>