>GraalVM native-image failing to compile a simple JavaFX app on Windows 10 - javafx

Summary: GraalVM native-image reports the following error when compiling a simple JavaFX application:
Error occurred during initialization of boot layer
java.lang.module.FindException: Module javafx.controls not found
Error: Image build request failed with exit status 1
Command line used:
"%GRAAL_BIN%"\native-image.cmd --module-path "c:\eclipse-javafx-sdk-19\lib" --add-modules javafx.controls,javafx.fxml,. -cp . application.GraalvmFX
Details:
Simple JavaFX application
package application;
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Separator;
import javafx.scene.control.ToolBar;
import javafx.scene.layout.BorderPane;
public class GraalvmFX extends Application {
#Override
public void start(Stage primaryStage) {
try {
ToolBar toolbar = new ToolBar();
Button b1 = new Button("New");
Button b2 = new Button("Open");
Button b3 = new Button("Save");
Button b4 = new Button("Exit");
toolbar.getItems().addAll(b1, b2, b3, new Separator(), b4);
BorderPane root = new BorderPane();
root.setTop(toolbar);
Scene scene = new Scene(root,400,400);
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
Running this app using command line:java.exe or javac.exe is not an issue:
C:\eclipse-workspace2\graalvmFX\src>java --version
java 17.0.4.1 2022-08-18 LTS
Java(TM) SE Runtime Environment (build 17.0.4.1+1-LTS-2)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.4.1+1-LTS-2, mixed mode, sharing)
C:\eclipse-workspace2\graalvmFX\src>javac --module-path "C:\eclipse-javafx-sdk-19\lib" --add-modules javafx.controls,javafx.fxml -cp . application\GraalvmFX.java
C:\eclipse-workspace2\graalvmFX\src>java --module-path "C:\eclipse-javafx-sdk-19\lib" --add-modules javafx.controls,javafx.fxml -cp . application.GraalvmFX
But trying to compile the app using native-image fails:
C:\eclipse-workspace2\graalvmFX\src>"%GRAAL_BIN%"\native-image.cmd --version
GraalVM 22.2.0 Java 17 CE (Java Version 17.0.4+8-jvmci-22.2-b06)
C:\eclipse-workspace2\graalvmFX\src>"%GRAAL_BIN%"\native-image.cmd --module-path "c:\eclipse-javafx-sdk-19\lib" --add-modules javafx.controls,javafx.fxml application.GraalvmFX
Error occurred during initialization of boot layer
java.lang.module.FindException: Module javafx.controls not found
Error: Image build request failed with exit status 1
I have tried everything that I can think of!

Related

openqa selenium Session Not Created Exception. Flutter Automation

I am trying to automate flutter Apk by using valuekey locators. I used following code to automate Apk. I am trying to use Appium and flutter finder for the automation.
package io.github.ashwith.flutter.example;
import java.net.MalformedURLException;
import java.net.URL;
import java.time.Duration;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import io.appium.java_client.android.AndroidDriver;
import io.github.ashwith.flutter.FlutterFinder;
public class Flutter_Finder {
public static RemoteWebDriver driver;
public static void main(String[] args) throws MalformedURLException {
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("deviceName", "Android");
capabilities.setCapability("platformName", "Android");
capabilities.setCapability("noReset", true);
capabilities.setCapability("app", "E:\\Testsigma.apk");
capabilities.setCapability("automationName", "flutter");
driver = new AndroidDriver(new URL("http://localhost:4723/wd/hub"), capabilities);
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(30));
FlutterFinder finder = new FlutterFinder(driver);
WebElement element = finder.byValueKey("incrementButton");
element.click();
}
}
When I am trying to run the code I am getting following error code.
Exception in thread "main" org.openqa.selenium.SessionNotCreatedException:
Could not start a new session.
Response code 500.
Message: An unknown server-side error occurred while processing the command.
Original error: Cannot read property 'match' of undefined
I have used following Appium java client version for this automation as my dependencies.
<dependency>
<groupId>io.appium</groupId>
<artifactId>java-client</artifactId>
<version>8.3.0</version>
</dependency>
Please help me to resolve this error.
Thank you very much!

How to Access JavaFX Virtual Keyboard (FXVK) Using Open JDK 15 or beyond?

I use the javafx virtual keyboard with open jdk 8. At times I have to access the virtual keyboard to prevent it from displaying when certain text fields get focus. An example of this is a screen where an operator has to scan in multiple barcodes. This virtual keyboard gets in the way. With open jdk 8 we were able to disable the virtual keyboard like this:
FXVK.detach(); //after importing "com.sun.javafx.scene.control.skin.FXVK"
We are now upgrading to open jdk 15 and building our UI with gradle. "com.sun.javafx.scene.control.skin.FXVK" is no longer accessible with a modular project with gradle. I don't believe using a different virtual keyboard is an option so can anyone explain how to access this FXVK class after java 8?
Is there a way to use --add-exports or --patch-module with a JAR to patch JavaFX to gain access to the internal class?
Below is the code for a sample project that shows this problem.
This is the JavaFX Application class that simply displays a text field and shows the code I could use with java 8 to not show the virtual keyboard.
package com.test.sampleapp.application;
////not accessible in java 15
//import com.sun.javafx.scene.control.skin.FXVK;
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class Main extends Application{
public static void main(String[] args)
{
launch(args);
}
#Override
public void start(Stage primaryStage) throws Exception
{
Label label = new Label("Text field below");
TextField textField = new TextField();
VBox vbox = new VBox(label);
vbox.getChildren().add(textField);
Scene scene = new Scene(vbox);
primaryStage.setScene(scene);
primaryStage.show();
textField.focusedProperty().addListener(new ChangeListener<Boolean>()
{
#Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue,
Boolean newValue)
{
// If focused
if (newValue)
{
//Need this to disable the virtual keyboard when using a textfield with scanning
//FXVK.detach();
}
}
});
}
}
Then I needed to add a wrapper class to have the virtual keyboard show up. Please note that most of the time I do use the virtual keyboard when text fields get focus, it's other times where I need to be able to programmatically disable it during certain situations.
The wrapper class:
package com.test.sampleapp.application;
import java.lang.reflect.Method;
public class AppWrapper
{
public static void main(String[] args) throws Exception
{
Class<?> app = Class.forName("com.test.sampleapp.application.Main");
Method main = app.getDeclaredMethod("main", String[].class);
System.setProperty("com.sun.javafx.isEmbedded", "true");
System.setProperty("com.sun.javafx.touch", "true");
System.setProperty("com.sun.javafx.virtualKeyboard", "javafx");
Object[] arguments = new Object[]{args};
main.invoke(null, arguments);
}
}
Let me know if you need anything else such as the build.gradle file however this is mostly just an issue using java 9 or beyond.
The FXVK class still exists in the same package, so the only issue is that its package is not exported by the javafx.controls module. If you must use this internal class, then you can pass an appropriate --add-exports JVM argument both at compile-time and at run-time.
Here's a simple application that calls FXVK#detach():
// Will fail at compile-time if the '--add-exports` argument is not
// passed to 'javac'
import com.sun.javafx.scene.control.skin.FXVK;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class Main extends Application {
#Override
public void start(Stage primaryStage) {
var root = new StackPane(new Label("Hello, World!"));
primaryStage.setScene(new Scene(root, 600, 400));
primaryStage.show();
// Will fail at run-time if the '--add-exports' argument is
// not passed to 'java'
FXVK.detach();
}
}
Assuming you put the Main.java file in your working directory, you can compile it with:
javac -p <path-to-fx> --add-modules javafx.controls --add-exports javafx.controls/com.sun.javafx.scene.control.skin=ALL-UNNAMED Main.java
And run it with:
java -p <path-to-fx> --add-modules javafx.controls --add-exports javafx.controls/com.sun.javafx.scne.control.skin=ALL-UNNAMED Main
If your code is modular then you can get rid of the --add-modules and you must change ALL-UNNAMED to the name of your module. Plus, make sure to launch your application via --module (or -m). Note the -p above is shorthand for --module-path.
If you use a build tool (e.g., Maven, Gradle, etc.), then you'll have to lookup how to set these JVM arguments for that tool. You'll also have to take into account how you deploy your application. For instance, if you use jpackage then you can use its --java-options argument to set the --add-exports option for when your application is launched.
You may also need to tell your IDE that you are giving yourself access to the internal package. Otherwise, your IDE will likely yell at you for trying to use an inaccessible type.

How to fix 'There are no JREs installed in the workspace that are strictly compatible with this environment. '?

I downloaded JavaFX Scene Builder 2.0, then I made a new JavaFX Project in Eclipse.
Unfortunately, this error occurs:
The import Javafx cannot be resolved
Below the log:
Eclipse version : 2019-09
JDK version : 13
Problem Description
Application cannot be resolved to a type
BorderPane cannot be resolved to a type
BorderPane cannot be resolved to a type
Scene cannot be resolved to a type
Scene cannot be resolved to a type
Stage cannot be resolved to a type
The import javafx cannot be resolved
The import javafx cannot be resolved
The import javafx cannot be resolved
The import javafx cannot be resolved
The method launch(String[]) is undefined for the type Main
Warnings
Build path specifies execution environment JavaSE-12. There are no JREs installed in the workspace that are strictly compatible with this environment. hello Build path JRE System Library Problem
Console
Error: Unable to initialize main class application.Main
Caused by: java.lang.NoClassDefFoundError: Stage
I've already downloaded e(fx)clipse 3.6.0
package application;
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
public class Main extends Application {
#Override
public void start(Stage primaryStage) {
try{
BorderPane root = new BorderPane();
Scene scene = new Scene(root,400,400);
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}

how to compile javafx programs in ubuntu without using any IDE? [duplicate]

This question already has answers here:
Compile code using JavaFX 2.0 (using command line)
(5 answers)
Closed 8 years ago.
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class HelloWorld extends Application
{
#Override
public void start(Stage primaryStage)
{
Button btn = new Button();
btn.setText("Say 'Hello World'");
btn.setOnAction(new EventHandler<ActionEvent>()
{
#Override
public void handle(ActionEvent event)
{
System.out.println("Hello World!");
}
});
StackPane root = new StackPane();
root.getChildren().add(btn);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args)
{
launch(args);
}
}
I tried compiling this using the command
javac -cp /opt/jdk8/jdk1.8.0_11/jre/lib/ext/jfxrt.jar HelloWorld.java
It gives several errors saying :
javafx.application package doesn't exist
javafx.scene package doesn't exist
I want some help ... I am new to javafx...
and I don't want to use any IDE
You don't need to add jfxrt.jar to classpath when compiling. Just be sure that the javac command is pointing to the /opt/jdk8 installation that you have.
I tried your code example, it ran just fine, opened a small window with a button in it:
~$ javac -version
javac 1.8.0_25
~$ java -version
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
~$ javac HelloWorld.java
~$ java HelloWorld
Hello World!

Make executable jar with JavaFx plugin for gradle

I'm trying to make an executable jar.
My IDE is Netbeans 7.3.1, using Gradle plugin for Netabeans, using JavaFX plugin for Gradle.
Simple JavaFX application:
i.lunin.autoposting.Main:
package i.lunin.autoposting;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class Main extends Application {
public static void main(String[] args) {
launch(args);
}
#Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Hello World! Man!");
Button btn = new Button();
btn.setText("Say 'Hello World'");
btn.setOnAction(new EventHandler<ActionEvent>() {
#Override
public void handle(ActionEvent event) {
try {
Thread.sleep(5000);
} catch (InterruptedException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("Hello World!");
}
});
StackPane root = new StackPane();
root.getChildren().add(btn);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}
}
Gradle file:
build.gradle:
apply from: "http://dl.bintray.com/content/shemnon/javafx-gradle/0.3.0/javafx.plugin"
apply plugin: 'java'
sourceCompatibility = '1.7'
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
repositories {
mavenCentral()
}
dependencies {
}
group = 'i.lunin.autoposting'
version = '0.0.0'
javafx {
mainClass = 'i.lunin.autoposting.Main'
}
When I use gradle run, it runs perfectly inside my IDE; But I can't start it without IDE.
When I use gradle :jfxDeploy It says that the is finished.
After that, when I'm try to start the executable jar from:
"... TestJava\build\distributions"
It shows the following error: "Unable to find class: i.lunin.autoposting.Main"
Please help me make an executable jar under netbeans, gradle.
I recently had the same issue. For me it turned out to be the build system.
If I build my app via gradle and javafx on a 32bit jvm, it resulted in the same error you had.
If I built it on a 64bit system everything went fine.
So I guess it's still a problem to deploy self contained 32bit java apps. I tested it with Java 7.
There seems to exist a newer plugin which looks very promissing:
From the repository README:
Using javafx-gradle-plugin enhances your build-script with
javapackager-power. No more using Apache Ant-calls, because this
gradle-plugin wraps all calls and introduces workarounds and fixes for
not-yet-fixed JDK-bugs. This gradle-plugin is a convenient-wrapper for
the javapackger, so you have to visit the official documentation to
know about the requirements on each operating-system.
Why does this gradle-plugin exist?
In the need of some equivalent of the javafx-maven-plugin just for
gradle, this project was born. A lot of you might have used the
javafx-gradle-plugin from Danno Ferrin, but he decided to not continue
that project.
Check it out at https://github.com/FibreFoX/javafx-gradle-plugin

Resources