IntelliJ OpenJDK 11 के साथ JavaFX 11 को नहीं पहचान सकता


83

मुझे JavaFX पैकेज को पहचानने में IntellJ की दिक्कत हो रही है। एक नए JavaFX प्रोजेक्ट के साथ, OpenJDK 11 के साथ, जब प्रोजेक्ट बनाने की कोशिश की जा रही है, तो IntelliJ JavaFX पैकेज को पहचान नहीं सकता है।

मैंने openjfx:javafx-base-11मावेन रेपो से आयात किया है ।

मैंने अन्य प्रश्नों को देखा है और समाधान यह जांचने से लेकर लगता है कि बायटेकोड सही स्तर पर है (मेरा है), और यह कि प्रोजेक्ट भाषा सही है (मेरा है)।

क्या किसी के भी पास कोई सुझाव है?

तस्वीर 1

तस्वीर 2

तस्वीर 3

संपादित करें:

त्रुटि:

यहाँ छवि विवरण दर्ज करें


क्या आप टर्मिनल से संकलन और चलाने की कोशिश कर सकते हैं?
डूब गया

आप अपने अपने मॉड्यूल (रों) की आवश्यकता होती है की आवश्यकता होगीmodule-info.java
याकूब जी

मुझे लगता है कि आपको इस कलाकृतियों की आवश्यकता है: mvnrepository.com/artifact/org.openjfx/javafx/11 आधार में वह सब कुछ शामिल है जो मुझे लगता है।
बजे Jorn Vernee

@JornVernee जब मैं कोशिश करता हूं कि मुझे एक त्रुटि मिले। मैंने इसके साथ ओपी को संपादित किया।
हमेशानईनिंगहेल्प

1
जिसने भी आपको बताया कि गलती की संभावना थी। आप एक बनाने की जरूरत module-info.java: अपने स्रोत फ़ोल्डर में फ़ाइल और स्पष्ट रूप से जो भी JavaFX मॉड्यूल है कि आप प्रयोग कर रहे हैं की आवश्यकता होती है requires javafx.controls;, requires javafx.graphics;आदि
याकूब जी

जवाबों:


134

जैसा कि टिप्पणियों में उल्लेख किया गया है, शुरुआती गाइड जावा 11 और जावाएफएक्स 11 के साथ शुरू करने का स्थान है।

जावा 11 से पहले आपने काम करने की कुंजी यह समझ ली है कि:

  • JavaFX 11 अब JDK का हिस्सा नहीं है
  • आप इसे अलग-अलग स्वादों में, या तो एसडीके के रूप में या नियमित निर्भरता (मावेन / ग्रेडल) के रूप में प्राप्त कर सकते हैं।
  • आपको इसे अपनी परियोजना के मॉड्यूल पथ में शामिल करना होगा, भले ही आपकी परियोजना मॉड्यूलर न हो।

JavaFX प्रोजेक्ट

यदि आप IntelliJ (Maven या Gradle के बिना) में एक नियमित JavaFX डिफ़ॉल्ट प्रोजेक्ट बनाते हैं, तो मैं आपको यहाँ से SDK डाउनलोड करने का सुझाव दूंगा । ध्यान दें कि वहाँ jmods भी हैं, लेकिन एक गैर मॉड्यूलर परियोजना के लिए SDK को प्राथमिकता दी जाती है।

डिफ़ॉल्ट प्रोजेक्ट को चलाने के लिए ये आसान चरण हैं:

  1. JavaFX प्रोजेक्ट बनाएं
  2. JDK 11 सेट करें (अपने स्थानीय जावा 11 संस्करण पर इंगित करें)
  3. JavaFX 11 SDK को लाइब्रेरी के रूप में जोड़ें। URL कुछ ऐसा हो सकता है /Users/<user>/Downloads/javafx-sdk-11/lib/। एक बार जब आप ऐसा कर लेते हैं तो आप देखेंगे कि JavaFX कक्षाएं अब संपादक में पहचानी जाती हैं।

JavaFX 11 परियोजना

  1. डिफ़ॉल्ट प्रोजेक्ट चलाने से पहले, आपको बस उन्हें VM विकल्पों में जोड़ना होगा:

    --module-path /Users/<user>/Downloads/javafx-sdk-11/lib --add-modules=javafx.controls,javafx.fxml

  2. Daud

Maven

यदि आप अपनी परियोजना के निर्माण के लिए मावेन का उपयोग करते हैं, तो इन चरणों का पालन करें:

  1. JavaFX के साथ एक Maven प्रोजेक्ट बनाएँ
  2. JDK 11 सेट करें (अपने स्थानीय जावा 11 संस्करण पर इंगित करें)
  3. JavaFX 11 निर्भरताएँ जोड़ें।

    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>11</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>11</version>
        </dependency>
    </dependencies>
    

एक बार जब आप ऐसा कर लेते हैं तो आप देखेंगे कि JavaFX कक्षाएं अब संपादक में पहचानी जाती हैं।

JavaFX 11 मावेन परियोजना

आप देखेंगे कि Maven आप के लिए आवश्यक निर्भरता का प्रबंधन करता है: यह javafx.controls के लिए javafx.base और javafx.graphics जोड़ना होगा, लेकिन सबसे महत्वपूर्ण, यह आवश्यक जोड़ देगा वर्गीकारक अपने प्लेटफॉर्म पर आधारित। मेरे मामले में, मैक।

यही कारण है कि अपने जार org.openjfx:javafx-controls:11हैं खाली है, क्योंकि वहाँ तीन संभावित classifiers (विंडोज, लिनक्स और मैक प्लेटफार्मों), कि सभी वर्गों और देशी कार्यान्वयन शामिल हैं।

यदि आप अभी भी अपने .m2 रेपो में जाना चाहते हैं और वहां से निर्भरता मैन्युअल रूप से लेना चाहते हैं, तो सुनिश्चित करें कि आप सही (उदाहरण के लिए .m2/repository/org/openjfx/javafx-controls/11/javafx-controls-11-mac.jar) को चुनें

  1. यहां से डिफ़ॉल्ट मावेन प्लगइन्स को बदलें ।

  2. भागो mvn compile javafx:run, और यह काम करना चाहिए।

ग्रैडल परियोजनाओं के लिए भी इसी तरह काम करता है, जैसा कि विस्तार से बताया गया यहां है

संपादित करें

उल्लिखित आरंभिक गाइड में IntelliJ के लिए अद्यतन प्रलेखन और नमूना परियोजनाएं शामिल हैं:


1
पथ कुछ ऐसा है /Users/<user>/Downloads/javafx-sdk-11/lib/, libफ़ोल्डर को नोटिस करें । इसमें सभी javafx जार
José Pereda

5
यदि किसी के पास मॉड्यूल पथ के साथ समस्याएँ हैं, तो उसे खिड़कियों पर कुछ इस तरह देखना होगा: --module-path = "C: \ Path \ To \ Your Your Java Java \ lib" --add-मॉड्यूल = javafx.controls, javafx .fxml, javafx.base, javafx.media, javafx.graphics, javafx.swing, javafx.web "=" पर ध्यान दें और इसके आसपास के उद्धरण भी। यह मेरे लिए काम किया, जबकि कोई अन्य दृष्टिकोण नहीं था। इसके अलावा ध्यान रखें कि -jar YourJar.jar पैरामीटर को मॉड्यूल पथ और ऐड-मॉड्यूल विकल्पों के बाद आने की जरूरत है।
जालौन

4
हाय @ जोसपीरेडा। मैं थोड़ी देर से इस गाइड के साथ संघर्ष कर रहा हूं, लेकिन मैं वास्तव में IntelliJ को अपना कोड नहीं बना सकता, भले ही मैंने वही किया हो जो आपने लिखा है। मुझे अभी भी "त्रुटि: जावा: मॉड्यूल नहीं मिला: javafx.fxml" और इसी तरह। इस मुद्दे को सुलझाने में मेरी मदद करने के लिए एक निजी बातचीत करने का कोई मौका? धन्यवाद।
दाविदे 3

1
@ जालौ शुक्रिया! उद्धरण वास्तव में यह किया है, आप एक जवाब के रूप में यह लिखना चाहिए।
1919

2
जब मैं ग्रैडल के लिए नमूना परियोजना के लिए वितरण का निर्माण करता हूं और फिर इसे चलाता हूं, तो मुझे त्रुटि संदेश मिलता है: "त्रुटि: JavaFX रनटाइम घटक गायब हैं, और इस एप्लिकेशन को चलाने के लिए आवश्यक हैं"
Trejkaz

10

यह समस्या कि JavaFX अब JDK 11 का हिस्सा नहीं है। निम्नलिखित समाधान इंटेलीज का उपयोग करके काम करता है (नेटबैंस के साथ इसे आजमाया नहीं गया है):

  1. निर्भरता के रूप में JavaFX ग्लोबल लाइब्रेरी जोड़ें:

    सेटिंग्स -> प्रोजेक्ट स्ट्रक्चर -> मॉड्यूल। मॉड्यूल में निर्भरता टैब पर जाएं, और "+" साइन -> लाइब्रेरी -> जावा-> सूची से JavaFX चुनें और ऐड सिलेक्ट करें पर क्लिक करें, फिर सेटिंग्स लागू करें पर क्लिक करें।

  2. अपने JavaFX प्रोजेक्ट में राइट क्लिक सोर्स फाइल (src), और एक नया मॉड्यूल-info.java फाइल बनाएं । फ़ाइल के अंदर निम्नलिखित कोड लिखें:

    module YourProjectName { 
        requires javafx.fxml;
        requires javafx.controls;
        requires javafx.graphics;
        opens sample;
    }
    

    ये 2 चरण JavaFX के साथ आपके सभी मुद्दों को हल करेंगे, मैं आपको विश्वास दिलाता हूं।

संदर्भ: लर्न प्रोग्रामिंग चैनल द्वारा बनाई गई एक यू-ट्यूब ट्यूटोरियल है, जो ऊपर दिए गए सभी विवरणों को केवल ५ मिनट में बताएगा। मैं आपकी समस्या को हल करने के लिए इसे देखने की भी सलाह देता हूं: https://www.youtube.com/watch?v=WtOgoomDewo


8

उपरोक्त में से किसी ने भी मेरे लिए काम नहीं किया। मैंने अन्य त्रुटियों को दूर करने में बहुत समय बिताया। मुझे यह सबसे आसान और सबसे अच्छा तरीका लगा।

यह 11, 12 और OpenJdk12 पर भी JavaFx प्राप्त करने के लिए काम करता है!

  • वीडियो आपको JavaFx Sdk डाउनलोड दिखाता है
  • इसे ग्लोबल लाइब्रेरी के रूप में कैसे स्थापित किया जाए
  • सेट मॉड्यूल-info.java (मैं नीचे एक पसंद करते हैं)

module thisIsTheNameOfYourProject {
    requires javafx.fxml;
    requires javafx.controls;
    requires javafx.graphics;
    opens sample;
}

पूरी बात मुझे केवल 5mins ले लिया !!!


इसे 2019.3 में एक वैश्विक पुस्तकालय के रूप में सेट करें। क्या आप बता सकते हैं कि यह अब कहां स्थित है?
माइकल एस।

5

त्वरित सारांश, आप या तो कर सकते हैं:

  1. जोसेफ के जवाब के माध्यम से --module-pathऔर --add-modulesजैसे JavaFX मॉड्यूल शामिल करें ।

    या

  2. एक बार जब आप अपने प्रोजेक्ट में जावाएफ़एक्स पुस्तकालयों को जोड़ लेते हैं (या तो मैन्युअल रूप से या मावेन / ग्रेडेल आयात के माध्यम से), module-info.javaइस उत्तर में निर्दिष्ट फ़ाइल के समान फ़ाइल जोड़ें । (ध्यान दें कि यह समाधान आपके ऐप को मॉड्यूलर बनाता है, इसलिए यदि आप अन्य पुस्तकालयों का उपयोग करते हैं, तो आपको module-info.javaफ़ाइल के अंदर उनके मॉड्यूल की आवश्यकता के लिए स्टेटमेंट भी जोड़ना होगा )।


यह उत्तर जोस के उत्तर का पूरक है।

स्थिति यह है:

  1. आप हाल ही के जावा संस्करण का उपयोग कर रहे हैं, उदाहरण के लिए 13।
  2. आपके पास जावा प्रोजेक्ट एक मावेन प्रोजेक्ट के रूप में है।
  3. अपने मावेन प्रोजेक्ट में आपके पास जोसफ के उत्तर के अनुसार JavaFX प्लगइन कॉन्फ़िगर और JavaFX निर्भरता सेटअप है।
  4. आप अपने मुख्य वर्ग के स्रोत कोड पर जाते हैं जो अनुप्रयोग का विस्तार करता है, आप उस पर राइट-क्लिक करते हैं और इसे चलाने का प्रयास करते हैं।
  5. आप प्राप्त एक IllegalAccessErrorजब एप्लिकेशन को लॉन्च करने की कोशिश कर रहा एक "अज्ञात मॉड्यूल" से जुड़े।

IllegalAccessErrorजब एक Intellij Idea से JavaFX ऐप चलाने की कोशिश कर रहे एक स्टैक ट्रेस उत्पन्न के लिए अंश :

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:567)
    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:567)
    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:830)
Caused by: java.lang.IllegalAccessError: class com.sun.javafx.fxml.FXMLLoaderHelper (in unnamed module @0x45069d0e) cannot access class com.sun.javafx.util.Utils (in module javafx.graphics) because module javafx.graphics does not export com.sun.javafx.util to unnamed module @0x45069d0e
    at com.sun.javafx.fxml.FXMLLoaderHelper.<clinit>(FXMLLoaderHelper.java:38)
    at javafx.fxml.FXMLLoader.<clinit>(FXMLLoader.java:2056)
    at org.jewelsea.demo.javafx.springboot.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(AccessController.java:391)
    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)
Exception running application org.jewelsea.demo.javafx.springboot.Main

ठीक है, अब आप एक तरह से फंस गए हैं और कोई सुराग नहीं है कि क्या चल रहा है।

वास्तव में क्या हुआ है:

  1. मावेन ने आपके आवेदन के लिए सफलतापूर्वक जावाएफएक्स निर्भरताएं डाउनलोड की हैं, इसलिए आपको निर्भरता को अलग से डाउनलोड करने या जावाएफएक्स एसडीके या मॉड्यूल वितरण या ऐसा कुछ भी स्थापित करने की आवश्यकता नहीं है।
  2. आइडिया ने मॉड्यूल को आपकी परियोजना पर निर्भरता के रूप में सफलतापूर्वक आयात किया है, इसलिए सब कुछ ठीक है और सभी कोड पूरा होने और सब कुछ ठीक काम करता है।

तो ऐसा लगता है कि सब कुछ ठीक होना चाहिए। लेकिन, जब आप अपना एप्लिकेशन चलाते हैं, तो आपके ऐप्लिकेशन क्लास (जब आप लॉन्च शुरू करते हैं) और आपके एफएक्सएमएल कंट्रोलर क्लासेस (जब आप एफएक्सएमएल लोड करते हैं) के तुरंत इंस्टेंस को रिफ्लेक्ट करने की कोशिश करते समय JavaFX मॉड्यूल्स में कोड फेल हो रहा होता है। कुछ मदद के बिना, प्रतिबिंब का यह उपयोग कुछ मामलों में विफल हो सकता है, अस्पष्ट पैदा कर सकता है IllegalAccessError। यह जावा मॉड्यूल सिस्टम सुरक्षा सुविधा के कारण है जो अन्य मॉड्यूल से कोड को आपकी कक्षाओं पर प्रतिबिंब का उपयोग करने की अनुमति नहीं देता है जब तक कि आप स्पष्ट रूप से इसकी अनुमति नहीं देते हैं (और जावाएफ़एक्स एप्लिकेशन लॉन्चर और एफएक्सएमएलएलडियर दोनों को कार्य करने के लिए उनके वर्तमान कार्यान्वयन में प्रतिबिंब की आवश्यकता होती है। सही ढंग से)।

यह वह जगह है जहां इस प्रश्न के कुछ अन्य उत्तर, जो संदर्भ module-info.java, चित्र में आते हैं।

तो जावा मॉड्यूल में क्रैश कोर्स करें:

मुख्य भाग यह है:

4.9। खुलती

यदि हमें निजी प्रकार के प्रतिबिंब की अनुमति देने की आवश्यकता है, लेकिन हम अपने सभी कोड को उजागर नहीं करना चाहते हैं, तो हम विशिष्ट पैकेजों को उजागर करने के लिए ओपन डायरेक्टिव का उपयोग कर सकते हैं।

लेकिन याद रखें, यह पूरी दुनिया के लिए पैकेज खोल देगा, इसलिए सुनिश्चित करें कि आप क्या चाहते हैं:

module my.module { opens com.my.package; }

इसलिए, शायद आप अपना पैकेज पूरी दुनिया के लिए नहीं खोलना चाहते, तो आप ऐसा कर सकते हैं:

4.10। खुलता है ... करने के लिए

ठीक है, इसलिए प्रतिबिंब कभी-कभी बहुत अच्छा होता है, लेकिन हम अभी भी उतनी ही सुरक्षा चाहते हैं जितना कि हम एनकैप्सुलेशन से प्राप्त कर सकते हैं। हम चुनिंदा तौर पर अपने पैकेज को मॉड्यूल की एक पूर्व-अनुमोदित सूची में खोल सकते हैं, इस मामले में, ओपन का उपयोग करते हुए ... निर्देश के लिए:

मॉड्यूल my.module {मॉड्यूल के लिए com.my.package खोलता है, मॉड्यूलटाउ, आदि; }

तो, आप अंत में एक src / main / java / मॉड्यूल-info.java क्लास बनाते हैं जो इस तरह दिखता है:

module org.jewelsea.demo.javafx.springboot {
    requires javafx.fxml;
    requires javafx.controls;
    requires javafx.graphics;
    opens org.jewelsea.demo.javafx.springboot to javafx.graphics,javafx.fxml;
}

जहाँ, org.jewelsea.demo.javafx.springbootउस पैकेज का नाम है जिसमें जावाएफ़एक्स एप्लिकेशन क्लास और जावाएफ़एक्स कंट्रोलर क्लासेस शामिल हैं (इसे अपने आवेदन के लिए उपयुक्त पैकेज नाम से बदलें)। यह जावा रनटाइम को बताता है कि यह आपके पैकेज में कक्षाओं के लिए javafx.graphicsऔर कक्षाओं में javafx.fxmlप्रतिबिंब लागू करने के लिए ठीक है org.jewelsea.demo.javafx.springboot। एक बार यह पूरा हो जाने के बाद, और एप्लिकेशन को संकलित किया जाता है और फिर से चलने वाली चीजें ठीक काम करेंगी और IllegalAccessErrorजावाएफ़एक्स द्वारा प्रतिबिंब के उपयोग से उत्पन्न अब नहीं होगा।

लेकिन क्या होगा अगर आप एक मॉड्यूल-info.java फ़ाइल नहीं बनाना चाहते हैं

यदि इसके बजाय अपने आवेदन वर्ग को सीधे चलाने के लिए IDE के शीर्ष टूलबार में रन बटन का उपयोग करें, तो आप इसके बजाय:

  1. IDE के साइड में Maven विंडो पर गया।
  2. Javafx maven plugin को टारगेट करें javafx.run
  3. उस पर राइट-क्लिक किया और Run Maven Buildया तो चुना Debug...

फिर ऐप बिना module-info.javaफाइल के चलेगा । मुझे लगता है कि यह इसलिए है क्योंकि मावेन प्लगइन गतिशील रूप से काफी स्मार्ट है जिसमें कुछ प्रकार की सेटिंग्स शामिल हैं जो कि ऐप को जावाएफएक्स कक्षाओं द्वारा बिना किसी module-info.javaफ़ाइल के भी प्रतिबिंबित करने की अनुमति देता है , हालांकि मुझे नहीं पता कि यह कैसे पूरा होता है।

उस टूल को शीर्ष टूलबार में रन बटन पर स्थानांतरित करने के लिए, javafx.runमावेन लक्ष्य पर राइट-क्लिक करें और लक्ष्य के लिए विकल्प चुनें Create Run/Debug Configuration। तब आप केवल मावेन लक्ष्य को निष्पादित करने के लिए शीर्ष टूलबार से रन चुन सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.