java - जावाएफएक्स और मेवेन:नल पॉइंटर अपवाद:स्थान आवश्यक है




maven javafx (5)

मेरे लिए मैंने निम्नलिखित चीजों का ख्याल रखा था -

  1. सुनिश्चित करें कि fxml फ़ाइल स्थित है जहां आपका मुख्य वर्ग रहता है। और उसके बाद इसे लोड करें - (मेरे मामले में, TechJFX.fxml फ़ाइल है)

    FXMLLoader loader = new FXMLLoader(getClass().getResource("TechJFX.fxml"));
    
  2. अपने प्रोजेक्ट फ़ोल्डर में opencv - *। Jar जोड़ें (मेरे मामले में opencv-300.jar)

  3. उपयोग कर निर्माण पथ में जार जोड़ें

प्रोजेक्ट फ़ोल्डर पर राइट क्लिक करें -> बिल्ड पथ -> बिल्ड पथ कॉन्फ़िगर करें -> लाइब्रेरी टैब -> बाहरी जार जोड़ें और जार का पता लगाएं

इसके अलावा, आदेश और निर्यात के तहत -> ओपनसीवी-300.जर और जेआरई सिस्टम लाइब्रेरी (यदि पहले से ही नहीं टिके हैं)

  1. Opencv_java * .dll (मेरे मामले opencv_java300.dll में) उसी स्थान पर कॉपी करें जहां आप प्रोजेक्ट फ़ोल्डर में जार हैं।

  2. निम्नलिखित विधि को अपनी मुख्य कक्षा में जोड़ें

     static{ 
            System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
       }
    
  3. किया हुआ।

उम्मीद है कि यह किसी को इसी तरह के मुद्दे का सामना करने में मदद करता है।

मैं जावाफैक्स के साथ मेवेन स्थापित करने की कोशिश कर रहा हूं। हालांकि मैं मैवेन और जावाएफएक्स के साथ अनुभवहीन था, लेकिन मुझे उम्मीद नहीं थी कि यह एक चुनौती होगी। मेरा जावा ज्ञान बहुत ठोस है (स्विंग समेत), और इसे स्थापित करने में बहुत कठिनाई होने की उम्मीद नहीं थी।

मैंने इंटेलिजे 13.0 सामुदायिक संस्करण द्वारा आपूर्ति की गई जावाएफएक्स परियोजना के साथ शुरुआत की। मेरे मुख्य वर्ग में कोड अपेक्षाकृत छोटा है:

package sample;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application
{
    @Override
    public void start(Stage primaryStage) throws Exception
    {
        //getClass().getResource("../../resources/sample.fxml");
        Parent root = FXMLLoader.load(getClass().getResource("../sample.fxml"));
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 300, 275));
        primaryStage.show();
    }


    public static void main(String[] args)
    {
        launch(args);
    }
}

और मेरा pom.xml बहुत बड़ा नहीं है:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>sample</groupId>
    <artifactId>JavaFXDemo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <organization>
        <name>RubberDucky</name>
    </organization>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>com.zenjava</groupId>
                    <artifactId>javafx-maven-plugin</artifactId>
                    <version>2.0</version>
                </plugin>
            </plugins>
        </pluginManagement>
        <plugins>
            <plugin>
                <groupId>com.zenjava</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>2.0</version>
                <configuration>
                    <mainClass>sample.Main</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>javafx</artifactId>
            <version>2.2</version>
            <systemPath>${java.home}/lib/jfxrt.jar</systemPath>
            <scope>system</scope>
        </dependency>
    </dependencies>
</project>

मैं एप्लिकेशन बनाने के लिए जावाएफएक्स मेवेन प्लगइन का उपयोग कर रहा हूं। mvn clean jfx:jar चलाने के बाद mvn clean jfx:jar सबकुछ ठीक लगता है, सभी सफल होते हैं। लेकिन जब मैं एप्लिकेशन चलाने की कोशिश करता हूं तो मुझे निम्न त्रुटि मिलती है:

Exception in Application start method
java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at com.javafx.main.Main.launchApp(Main.java:698)
        at com.javafx.main.Main.main(Main.java:871)
Caused by: java.lang.RuntimeException: Exception in Application start method
        at com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown So
urce)
        at com.sun.javafx.application.LauncherImpl.access$000(Unknown Source)
        at com.sun.javafx.application.LauncherImpl$1.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException: Location is required.
        at javafx.fxml.FXMLLoader.load(Unknown Source)
        at javafx.fxml.FXMLLoader.load(Unknown Source)
        at javafx.fxml.FXMLLoader.load(Unknown Source)
        at javafx.fxml.FXMLLoader.load(Unknown Source)
        at javafx.fxml.FXMLLoader.load(Unknown Source)
        at sample.Main.start(Main.java:15)
        at com.sun.javafx.application.LauncherImpl$5.run(Unknown Source)
        at com.sun.javafx.application.PlatformImpl$5.run(Unknown Source)
        at com.sun.javafx.application.PlatformImpl$4$1.run(Unknown Source)
        at com.sun.javafx.application.PlatformImpl$4$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.application.PlatformImpl$4.run(Unknown Source)
        at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
        at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at com.sun.glass.ui.win.WinApplication.access$100(Unknown Source)
        at com.sun.glass.ui.win.WinApplication$3$1.run(Unknown Source)
        ... 1 more

किसी न किसी तरह की डीबगिंग के बाद समस्या में पथ लग रहा है, मैं अपनी फाइलें लोड कर रहा हूं। मेरे हार्ड ड्राइव पर किसी स्थान पर sample.fxml हार्डकोड करने के बाद, एप्लिकेशन बिना किसी समस्या के चलाता है। IntelliJ से एप्लिकेशन चलाते समय वर्तमान सेटअप (ऊपर देखा गया) के लिए चला जाता है।

मुझे लगता है कि मैंने हर संसाधन को समाप्त कर दिया है (स्टैक ओवरफ्लो, कुछ बहुत ही समान त्रुटियों सहित) लेकिन मैं यह नहीं समझ सकता कि वास्तव में क्या गलत है।


इंटेलिज और ग्रैडल के साथ मेरा एक ही मुद्दा था: ठीक करने के चरण:

1. फ़ाइल हटाएं

sample.fxml

पथ के लिए

\ Src \ मुख्य \ संसाधन \ fxml

  1. इस फ़ाइल पर पथ सेट करें:

अभिभावक रूट = FXMLLoader.load (getClass ()। GetResource ("/ fxml / sample.fxml"));


जैसा कि @ अब्बार्ड-माइंड ने पहले ही समझाया है, मैवेन किसी भी संसाधन फाइल (जैसे fxml) की प्रतिलिपि नहीं करेगा जो src निर्देशिका के अंतर्गत रहता है।

यदि आप जावा स्रोत फ़ाइलों के अलावा fxml फ़ाइलों को रखना चाहते हैं, तो आप उन्हें कॉपी करने के लिए fxml संसाधन प्लगइन का उपयोग कर सकते हैं:

<build>
   ...
    <resources>
        <resource>
            <filtering>false</filtering>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.fxml</include>
            </includes>             
        </resource>
        <resource>
   ...
</build>

सुनिश्चित करें कि आपका sample.fxml src/main/resources/ निर्देशिका (या उपनिर्देशिका) में है। फिर आप इस तरह की फाइल तक पहुंच सकते हैं:

Parent root = FXMLLoader.load(getClass().getClassLoader().getResource("sample.fxml"));

स्पष्टीकरण : संकलन चरण के दौरान सभी संसाधनों और वर्गों को target/classes/ प्रतियों में कॉपी किया जाता है। तो आपकी fxml फ़ाइल इस निर्देशिका में और आपकी कक्षा में अपने पैकेज नाम के संबंध में उपनिर्देशिका में रहती है। अगर आप getClass().getResource("sample.fxml"); कॉल करते हैं getClass().getResource("sample.fxml"); फ़ाइल को क्लास फ़ाइल के सापेक्ष खोजा जाएगा जो यह निर्देशिका होगी: target/classes/sample/

.getResource() पर कॉलिंग .getResource() target/classes/ के सापेक्ष खोज पथ सेट करता है और इसलिए आपकी फ़ाइल पाई जाती है।

पीएस आप भी लिख सकते हैं:

Parent root = FXMLLoader.load(getClass().getResource("/sample.fxml"));

आप इस प्लग-इन का भी उपयोग कर सकते हैं, यह बहुत अच्छा है और मैं इसे अपने जारों को पैकेजिंग के लिए उपयोग करता हूं http://sonatype.github.io/jarjar-maven-plugin/





java maven javafx