java intellij-idea javafx javafx-11

JavaFX 11: IllegalAccessError al crear una etiqueta



intellij-idea javafx-11 (1)

Es probable que esta pregunta sea sobre el mismo problema que este , pero parece que quien la pregunta no ha agregado suficiente información para recibir una respuesta útil.

Estoy intentando ejecutar una aplicación JavaFx con JDK y JavaFx SDK versión 11.0.2.

Este código funciona exactamente como se esperaba, produciendo una ventana vacía:

import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.layout.StackPane; import javafx.stage.Stage; public class Main extends Application { public void start(Stage primaryStage) throws Exception { StackPane root = new StackPane(); primaryStage.setScene(new Scene(root, 420, 420)); primaryStage.show(); } public static void main(String[] args) { launch(args); } }

Sin embargo, si intento agregar una etiqueta al StackPane , se lanza una excepción.

import ... import javafx.scene.control.Label; public class Main extends Application { public void start(Stage primaryStage) throws Exception { StackPane root = new StackPane(); root.getChildren().add(new Label("42")); primaryStage.setScene(new Scene(root, 420, 420)); primaryStage.show(); } public static void main(String[] args) { launch(args); } }

La traza de pila que produce se ve así:

Exception in Application start method java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464) at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051) Caused by: java.lang.RuntimeException: Exception in Application start method at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900) at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195) at java.base/java.lang.Thread.run(Thread.java:834) Caused by: java.lang.IllegalAccessError: superclass access check failed: class com.sun.javafx.scene.control.ControlHelper (in unnamed module @0xbbd2743) cannot access class com.sun.javafx.scene.layout.RegionHelper (in module javafx.graphics) because module javafx.graphics does not export com.sun.javafx.scene.layout to unnamed module @0xbbd2743 at java.base/java.lang.ClassLoader.defineClass1(Native Method) at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016) at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174) at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:802) at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:700) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:623) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) at javafx.scene.control.Control.<clinit>(Control.java:86) at sample.Main.start(Main.java:13) at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428) at java.base/java.security.AccessController.doPrivileged(Native Method) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427) at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96) at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method) at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(GtkApplication.java:277) ... 1 more Exception running application sample.Main

Estoy ejecutando una versión reciente de IntelliJ Idea en Kubuntu. Descargué el JDK de Oracle y JavaFX de los sitios web oficiales

javafx-sdk-11.0.2 en el directorio /usr/lib/jvm/ y jdk-11.0.2 está en el mismo directorio.

En IntelliJ Idea, creo que he elegido correctamente el JDK, y he agregado /usr/lib/jvm/javafx-sdk-11.0.2/lib como una biblioteca.

IntelliJ Idea utiliza este comando para iniciar la aplicación (dividida para facilitar la lectura):

/usr/lib/jvm/jdk-11.0.2/bin/java -Djava.library.path=/usr/lib/jvm/javafx-sdk-11.0.2/lib --add-modules javafx.base,javafx.graphics --add-reads javafx.base=ALL-UNNAMED --add-reads javafx.graphics=ALL-UNNAMED -javaagent:/opt/jetbrains/idea-IU-183.4886.37/lib/idea_rt.jar=36031:/opt/jetbrains/idea-IU-183.4886.37/bin -Dfile.encoding=UTF-8 -classpath /home/rm/IdeaProjects/JfxPlayground/out/production/JfxPlayground :/usr/lib/jvm/javafx-sdk-11.0.2/lib/src.zip :/usr/lib/jvm/javafx-sdk-11.0.2/lib/javafx-swt.jar :/usr/lib/jvm/javafx-sdk-11.0.2/lib/javafx.web.jar :/usr/lib/jvm/javafx-sdk-11.0.2/lib/javafx.base.jar :/usr/lib/jvm/javafx-sdk-11.0.2/lib/javafx.fxml.jar :/usr/lib/jvm/javafx-sdk-11.0.2/lib/javafx.media.jar :/usr/lib/jvm/javafx-sdk-11.0.2/lib/javafx.swing.jar :/usr/lib/jvm/javafx-sdk-11.0.2/lib/javafx.controls.jar :/usr/lib/jvm/javafx-sdk-11.0.2/lib/javafx.graphics.jar -p /usr/lib/jvm/javafx-sdk-11.0.2/lib/javafx.base.jar :/usr/lib/jvm/javafx-sdk-11.0.2/lib/javafx.graphics.jar sample.Main

No he modificado ninguna opción de VM.

¿Cómo puedo solucionar este error? ¿Es un error en JavaFx?


Ya estás dando una explicación de tu problema:

No he modificado ninguna opción de VM.

Ya que JavaFX 11 ya no es parte del JDK, debe usar el SDK de JavaFX (como lo está haciendo) desde here , o alternativamente usar Maven / Gradle para recuperar los módulos de JavaFX de Maven Central.

Luego debe agregar el SDK como una biblioteca, para que IntelliJ pueda encontrar las clases de JavaFX.

Pero una vez que lo hayas hecho, y dado que los jars de JavaFX son módulos, debes hacer dos cosas:

  • Haga que los módulos JavaFX estén disponibles para su módulo de ruta.
  • Defina qué módulos agrega al proyecto.

Basado en su salida de IntelliJ, se agrega de forma predeterminada javafx.graphics y javafx.base :

--add-modules javafx.base,javafx.graphics -p /usr/lib/jvm/javafx-sdk-11.0.2/lib/javafx.base.jar :/usr/lib/jvm/javafx-sdk-11.0.2/lib/javafx.graphics.jar

(note que -p es lo mismo que --module-path )

Esto explica por qué su proyecto se ejecuta en el primer caso, cuando no tiene un control agregado a la escena, solo el StackPane , que pertenece al module javafx.graphics , pero falla con la excepción publicada cuando agrega la Label , que Pertenece al module javafx.controls .

Esto se ha dicho varias veces: debe configurar las opciones de VM necesarias para su proyecto.

Comience por leer la documentación en https://openjfx.io/openjfx-docs/ , incluida la documentación de IntelliJ , sección Proyectos no modulares para su IDE. Y lea la parte 4. Agregar opciones de VM.

Entonces haga clic en Ejecutar -> Editar configuraciones, y agregue:

-p /usr/lib/jvm/javafx-sdk-11.0.2/lib --add-modules javafx.controls

Aplicar y ejecutar, el problema será resuelto.