java - जावाएफ़एक्स 11: लेबल बनाते समय अवैध विफलता



intellij-idea javafx (1)

यह प्रश्न इस एक के रूप में एक ही मुद्दे के बारे में होने की संभावना है, लेकिन यह उस व्यक्ति के पूछने वाले को एक उपयोगी प्रतिक्रिया प्राप्त करने के लिए पर्याप्त जानकारी नहीं जोड़ी गई प्रतीत होती है।

मैं JDK और JavaFx SDK संस्करण 11.0.2 के साथ JavaFx एप्लिकेशन चलाने का प्रयास कर रहा हूं।

यह कोड अपेक्षा के अनुरूप काम करता है, एक खाली खिड़की का निर्माण:

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);
    }
}

हालाँकि, अगर मैं StackPane एक लेबल जोड़ने की कोशिश करता हूं, तो एक अपवाद फेंक दिया जाता है।

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);
    }
}

इसके द्वारा निर्मित स्टैक ट्रेस इस तरह दिखता है (मेन 13 है जहां लेबल बनाया गया है):

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

मैं कुबंटु पर IntelliJ Idea का हालिया संस्करण चला रहा हूं। मैंने आधिकारिक वेबसाइटों से Oracle JDK और साथ ही JavaFX डाउनलोड किया

मैंने javafx-sdk-11.0.2 को डायरेक्टरी /usr/lib/jvm/ और jdk-11.0.2 उसी डायरेक्टरी में है।

IntelliJ Idea में, मेरा मानना ​​है कि मैंने JDK को सही ढंग से चुना है, और मैंने लाइब्रेरी के रूप में /usr/lib/jvm/javafx-sdk-11.0.2/lib जोड़ा है।

IntelliJ Idea इस कमांड का उपयोग एप्लिकेशन को लॉन्च करने के लिए कर रहा है (पठनीयता के लिए विभाजित):

/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

मैंने कोई VM विकल्प संशोधित नहीं किया है।

मैं इस त्रुटि को कैसे ठीक कर सकता हूं? क्या यह JavaFx में बग है?


आप पहले से ही अपने मुद्दे का स्पष्टीकरण दे रहे हैं:

मैंने कोई VM विकल्प संशोधित नहीं किया है।

चूंकि JavaFX 11 अब JDK का हिस्सा नहीं है, इसलिए आपको यहाँ से JavaFX SDK (जैसा कि आप कर रहे हैं) का उपयोग करना होगा, या Maven Central से JavaFX मॉड्यूल को पुनः प्राप्त करने के लिए Maven / Gradle का उपयोग करना होगा।

फिर आपको एसडीके को एक पुस्तकालय के रूप में जोड़ना होगा, इसलिए इंटेलीजे जावाएफएक्स कक्षाएं पा सकते हैं।

लेकिन एक बार जब आप ऐसा कर लेते हैं, और यह देखते हुए कि JavaFX जार मॉड्यूल है, तब भी आपको दो काम करने होंगे:

  • जावाएफएक्स मॉड्यूल को अपने मॉड्यूल-पथ के लिए उपलब्ध कराएं
  • परिभाषित करें कि आप किस मॉड्यूल को प्रोजेक्ट में जोड़ते हैं

आपके IntelliJ आउटपुट के आधार पर, यह डिफ़ॉल्ट javafx.graphics और 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

(ध्यान दें कि -p एक ही तरह है - --module-path )

यह बताता है कि आपका प्रोजेक्ट पहले मामले में क्यों चलता है, जब आपके पास दृश्य में एक नियंत्रण नहीं जोड़ा जाता है, बस javafx.graphics , जो कि javafx.graphics module , लेकिन Label जोड़ने पर पोस्ट किए गए अपवाद के साथ विफल हो जाता है, javafx.controls module अंतर्गत आता है।

यह कई बार कहा गया है: आपको अपनी परियोजना के लिए आवश्यक वीएम विकल्प निर्धारित करने की आवश्यकता है।

IntelliJ doc, अपने IDE के लिए गैर-मॉड्यूलर परियोजनाओं सहित https://openjfx.io/openjfx-docs/ पर दस्तावेज़ीकरण पढ़कर प्रारंभ करें। और भाग 4 पढ़ें। VM विकल्प जोड़ें।

इसलिए Run -> एडिट कॉन्फ़िगरेशन को क्लिक करें, और जोड़ें:

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

आवेदन करें, और चलाएं, समस्या हल हो जाएगी।





javafx-11