2010-03-18 14 views
5

मैं एक ऐसा एप्लिकेशन बनाने की कोशिश कर रहा हूं जो एक जार में संसाधन फ़ाइल बनाता है, लेकिन मैं ग्रहण के भीतर प्रोजेक्ट चलाने योग्य बनाना चाहता हूं। मेरे पास प्रोजेक्ट के लिए एक बुनियादी मेवेन 2 संरचना है, और मुझे यकीन है कि फ़ाइल में कैसे पढ़ा जाए, जैसे कि जेएआर से या ग्रहण के भीतर से यह पाया जाता है और उपयोग किया जाता है। विचार?कक्षा में एक जार, या कहीं भी एक फ़ाइल पढ़ना?

संरचना:

src/main/java 
src/main/resources/file.txt 

वर्तमान पढ़ने विधि:

getClass().getResourceAsStream("/file.txt") 

वहाँ विधि पढ़ने कि src/मुख्य/संसाधन/*, साथ ही जड़ जार का स्तर ऊपर ले जाएगा (है जहां संसाधन तैनात किए जाते हैं)?

उत्तर

8

मुझे आपकी समस्या नहीं आती है। src/main/resources से संसाधनों को स्वचालित रूप से target/classes पर कॉपी किया गया है और इस प्रकार मैवेन और ग्रहण के तहत क्लासपाथ पर अपेक्षाकृत उसी स्थान पर रूट स्तर पर अपेक्षाकृत उपलब्ध है (जब तक कि आपकी ग्रहण परियोजना ठीक से कॉन्फ़िगर नहीं की जाती)।

और जब एक जेएआर के अंदर पैक किया जाता है, तो target/classes की सामग्री को "जैसा है" पैक किया जाता है इसलिए कुछ भी नहीं बदला जाता है।

दूसरे शब्दों में, पर जाने से आपका file.txt की तरह इस (और यह वास्तव में how things are documented है) बिल्कुल ठीक है:

// Retrieve resource 
InputStream is = getClass().getResourceAsStream("/file.txt"); 

// Do something with the resource 

... 

आप एक समस्या कहीं है, तो कृपया स्पष्ट।

अद्यतन: मैं Maven-ग्रहण-प्लगइन के साथ एक त्वरित परीक्षण किया था और मैं आपकी समस्या को पुन: पेश नहीं कर सकते हैं:

$ mvn archetype:generate -DgroupId=com.stackoverflow -DartifactId=q2467362 -Dversion=1.0-SNAPSHOT 
... 
$ cd q2467362 
$ mkdir -p src/main/resources 
$ mvn eclipse:eclipse 
... 
$ cat .classpath 
<classpath> 
    <classpathentry kind="src" path="src/test/java" output="target/test-classes" including="**/*.java"/> 
    <classpathentry kind="src" path="src/main/java" including="**/*.java"/> 
    <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/> 
    <classpathentry kind="output" path="target/classes"/> 
    <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar" sourcepath="M2_REPO/junit/junit/3.8.1/junit-3.8.1-sources.jar"/> 
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> 
</classpath> 

निर्देशिका src/main/resources अपेक्षा के अनुरूप स्रोत फ़ोल्डर के रूप में जोड़ा गया है। क्या आप अपना पीओएम दिखा सकते हैं (विशेष रूप से resources तत्व यदि आप एक परिभाषित करते हैं)?

+0

ग्रहण परियोजना के साथ स्वचालित निर्माण चरण के दौरान लक्ष्य/कक्षाओं में संसाधनों की प्रतिलिपि बनाने के लिए क्या किया जाना चाहिए? स्रोत फ़ोल्डर के रूप में –

+0

@Stefan सेटअप 'src/main/resource'। लेकिन यह maven-eclipse-plugin या m2Eclipse दोनों द्वारा किया जाना चाहिए। –

+0

मैंने प्रोजेक्ट को एमवीएन ग्रहण के साथ पुन: उत्पन्न करने की कोशिश की: ग्रहण, लेकिन यह अभी भी नहीं लिया। हम्म। मुझे लगता है कि मैं इसे मैन्युअल रूप से इस तरह जोड़ दूंगा। –

0

मैवेन 2 का उपयोग कर स्रोत/मुख्य/संसाधनों में डाला गया कुछ भी जार के रूट स्तर में रखा जाएगा। तो जिस विधि का आप वर्तमान में उपयोग कर रहे हैं वह दोनों स्थितियों को पूरा करेगा। मेवेन पेज से: http://maven.apache.org/guides/getting-started/index.html#How_do_I_add_resources_to_my_JAR

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