2013-01-11 17 views
7

मेरे पास एक साधारण एप्लिकेशन है जो एक प्रॉपर्टी फ़ाइल से पढ़ता है और लिखता है। यह नेटबीन में विकसित किया गया था और जब नेटबींस के भीतर से चलाया जाता है तो ठीक काम करता है। हालांकि, अब मैंने इसे बनाया और तैनात किया है, गुण फ़ाइल नहीं मिल सकती है।क्यों मेरा जावा एप्लिकेशन मेरी गुण फ़ाइल नहीं ढूंढ सकता

परियोजना संरचना

com/company/projectname/controller/controllerclass.java <- this is where the code using the properties file exists 

conf/runController.properties <- the properties file, this exists here 

कोड में मैं पहुंचने के लिए नीचे है गुण फ़ाइल:

private final String PROPERTIESFILELOCATION = "conf/runController.properties"; 

public void runController(){ 
this.runController = new Properties(); 
this.propertiesLocation = this.getClass().getClassLoader().getResource(this.PROPERTIESFILELOCATION); 
FileInputStream propsInput = new FileInputStream(this.propertiesLocation.getFile()); 
this.runController.load(propsInput); 
} 

(संक्षिप्तता के लिए संक्षेप)

जब मैं से जार फ़ाइल फोन कमांड लाइन I मुद्दा:

java -classpath /usr/java/projectdirectory/project.jar com.company.projectname.controller.controllerclass arg1 

तो, मैंने इस तरह से अन्य परियोजनाओं पर पहले इसे हासिल करने में कामयाब रहा है लेकिन किसी कारण से यह काम नहीं कर रहा है।

मैंने जार फ़ाइल के अंदर संरचना की जांच की है और सभी की अपेक्षा की जाती है।

क्या कोई मेरी गलती को इंगित कर सकता है और मुझे इसे पाने और चलाने में मदद कर सकता है?

संपादित करें- नामों को मिलान करने के लिए नाम बदल दिया। वे हमेशा मेरे कोड

+0

* अंदर * जार फ़ाइल, फ़ाइल 'के रूप में conf/controller.properties' मौजूद हैं, या के रूप में' conf/runController.properties', या यह एक अलग नाम (या अलग रास्ता अंदर है करता है डब्बा)? – dashrb

+0

मैंने स्पॉट के लिए धन्यवाद नमूना कोड बदल दिया था। यह जार फ़ाइल में conf/runController.properties पर मौजूद है। मेरे ऐप – nathj07

+0

में सभी नामों का मिलान क्या होगा यदि आप संपत्ति को '/ conf/runController.properties 'के रूप में बदलते हैं, तो यह जार से संबंधित होना चाहिए (और जार में .class फ़ाइल के स्थान के सापेक्ष नहीं) – dashrb

उत्तर

0

धन्यवाद, प्लस 1

: गुण "नहीं करता है।। मैं इसे आपकी मदद से काम करने में कामयाब रहा। इस समस्या का अंतिम समाधान टकराव का मामूली परिवर्तन था।

क्योंकि मुझे फ़ाइल को पढ़ने और लिखने की आवश्यकता थी (शायद मेरे ओपी में स्पष्ट नहीं है) मैंने स्विच किया Apache.commons.configuration का उपयोग कर।

ने कहा कि इस धागे के पॉइंटर्स ने यह सुनिश्चित किया है कि मेरी अन्य गुण फ़ाइलें बिना छेड़छाड़ के काम कर रही हों।

धन्यवाद फिर से

2

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

एक चीज जो मदद कर सकती है, प्रारंभिक स्लैश के साथ फ़ाइल स्थान को संदर्भित करना है, इसलिए इसमें कोई संदेह नहीं है कि आप कक्षा के रूट से फ़ाइल को खोजना शुरू करना चाहते हैं। अन्यथा खोज पथ उस वर्ग के सापेक्ष है जो आपका कोड कॉल कर रहा है (यह नहीं पता कि यह सही है; इस तरह यह क्लास.getResource, Classloader.getResource के साथ काम करता है हालांकि अलग हो सकता है)।

+0

कोई उम्मीद करेगा कि गुण फ़ाइल जार फ़ाइल के अंदर है। मुझे लगता है कि कल सही है - नाम समान नहीं है। – dashrb

+0

@ दशरब: यह एक अच्छा पकड़ था (मेरे द्वारा +1), निश्चित रूप से नाम विसंगति मामलों की मदद नहीं करती है। निश्चित रूप से 1 से अधिक चीज़ गलत हो सकती है। –

+0

नाम विसंगति केवल मेरे द्वारा पोस्ट किए गए उदाहरण में एक मुद्दा है। मैंने इसे अभी सही कर दिया है, इसे स्पॉट करने के लिए धन्यवाद। – nathj07

3

आपका प्रश्न के बारे में

conf/controller.properties

बात करती है और अपने कोड में बात करती है के बारे में conf/runController.properties

संपादित करें: मैं यह सोचते हैं रहा है कि conf/* गुण के अंदर है। आपकी जार फ़ाइल यदि ऐसा है, तो फ़ाइलों को सही तरीके से नामित किया गया है तो आपके कोड को काम करना चाहिए।

+0

हाँ, यह जार और नाम मिलान में है। – nathj07

3

शायद FileInputStream गुणों को "फ़ाइल" का सम्मान करने में सक्षम नहीं है जो आपके जार फ़ाइल के अंदर है। अपने परिवर्तन:

this.runController = new Properties(); 
this.propertiesLocation = this.getClass().getClassLoader().getResource(this.PROPERTIESFILELOCATION); 
FileInputStream propsInput = new FileInputStream(this.propertiesLocation.getFile()); 
this.runController.load(propsInput); 

रहे हैं:

this.runController = new Properties(); 
this.runController.load(this.getClass().getClassLoader().getResourceAsStream(this.PROPERTIESFILELOCATION)); 

संपादित करें: मैं एक परीक्षण वर्ग बनाया है, और यह पता चलता है कि जब, फाइल सिस्टम से या कि "रंगमंच की सामग्री/main.properties एक जार फ़ाइल से चल रहा है "काम करता है लेकिन"/प्रोप/मुख्य।अपने कोड के लिए बाहर की मदद करने, विशेष रूप से dashrb के लिए हर किसी के लिए

[[email protected] props]$ cat org/dashrb/test/main.java 
package org.dashrb.test; 
import java.util.Properties; 
import java.io.IOException; 

public class main 
{ 
    public static void main(String args[]) 
    { 
     main myMain = new main(); 
     myMain.testProps("props/main.properties"); 
     myMain.testProps("/props/main.properties"); 
    } 

    public main() 
    { 
    } 

    public void testProps(String p) 
    { 
     try 
     { 
      System.out.println("==============================="); 
      Properties props = new Properties(); 
      System.out.println("Trying to load properties as " + p); 
      props.load(getClass().getClassLoader().getResourceAsStream(p)); 
      System.out.println("Loaded properties as " + p); 
      System.out.println("Property x is: " + props.getProperty("x")); 
     } 
     catch (IOException ioe) 
     { 
      ioe.printStackTrace(); 
     } 
     System.out.println("==============================="); 
    } 
} 

[[email protected] props]$ cat props/main.properties 
x = This is the property value of x 

[[email protected] props]$ java -cp . org.dashrb.test.main 
=============================== 
Trying to load properties as props/main.properties 
Loaded properties as props/main.properties 
Property x is: This is the property value of x 
=============================== 
=============================== 
Trying to load properties as /props/main.properties 
Exception in thread "main" java.lang.NullPointerException 
    at java.util.Properties$LineReader.readLine(Properties.java:434) 
    at java.util.Properties.load0(Properties.java:353) 
    at java.util.Properties.load(Properties.java:341) 
    at org.dashrb.test.main.testProps(main.java:25) 
    at org.dashrb.test.main.main(main.java:11) 




[[email protected] props]$ jar cvf main.jar org props 
added manifest 
adding: org/(in = 0) (out= 0)(stored 0%) 
adding: org/dashrb/(in = 0) (out= 0)(stored 0%) 
adding: org/dashrb/test/(in = 0) (out= 0)(stored 0%) 
adding: org/dashrb/test/main.class(in = 1218) (out= 679)(deflated 44%) 
adding: org/dashrb/test/main.java(in = 594) (out= 287)(deflated 51%) 
adding: props/(in = 0) (out= 0)(stored 0%) 
adding: props/main.properties(in = 36) (out= 36)(deflated 0%) 

[[email protected] props]$ jar tvf main.jar 
    0 Fri Jan 11 17:29:40 EST 2013 META-INF/ 
    68 Fri Jan 11 17:29:40 EST 2013 META-INF/MANIFEST.MF 
    0 Fri Jan 11 17:26:00 EST 2013 org/ 
    0 Fri Jan 11 17:26:00 EST 2013 org/dashrb/ 
    0 Fri Jan 11 17:29:24 EST 2013 org/dashrb/test/ 
    1218 Fri Jan 11 17:28:52 EST 2013 org/dashrb/test/main.class 
    594 Fri Jan 11 17:29:24 EST 2013 org/dashrb/test/main.java 
    0 Fri Jan 11 17:26:40 EST 2013 props/ 
    36 Fri Jan 11 17:26:40 EST 2013 props/main.properties 

[[email protected] props]$ cd/
[[email protected] /]$ java -cp ~/misc/src/java/props/main.jar org.dashrb.test.main 
=============================== 
Trying to load properties as props/main.properties 
Loaded properties as props/main.properties 
Property x is: This is the property value of x 
=============================== 
=============================== 
Trying to load properties as /props/main.properties 
Exception in thread "main" java.lang.NullPointerException 
    at java.util.Properties$LineReader.readLine(Properties.java:434) 
    at java.util.Properties.load0(Properties.java:353) 
    at java.util.Properties.load(Properties.java:341) 
    at org.dashrb.test.main.testProps(main.java:25) 
    at org.dashrb.test.main.main(main.java:11) 

वहाँ कुछ अपनी स्थिति जो अपनी सफलता रोक रहा है में अलग होना चाहिए

+0

मैंने कोशिश की कि मैं या तो conf/runController.properties के लिए या /conf/runController.properties के लिए नल पॉइंटर प्राप्त करता हूं, मुझे java.util पर नल पॉइंटर मिलता है। प्रॉपर्टीज $ LineReader.readLine यह सब कुछ liltte baffling है क्योंकि मुझे कभी ऐसे मुद्दों नहीं थे – nathj07

+0

से पहले मुझे पता है कि आपने पहले से ही नामों को देखा है। क्या आप पूंजीकरण की पुष्टि कर सकते हैं? यदि आप विंडोज़ पर हैं, डिस्क पर फ़ाइल नाम केस संवेदनशील नहीं हैं लेकिन (मुझे विश्वास है) जार फाइलों की सामग्री हैं। निश्चित रूप से – dashrb

+0

। पूंजीकरण सही और सुसंगत है। फ़ाइल को runController.properties कहा जाता है और इसे इस तरह संदर्भित किया जाता है। – nathj07

संबंधित मुद्दे