2013-02-14 54 views
37

सभी के लिए दृश्यमान नहीं हैफ़ाइल वसंत

मैं निम्नलिखित MANIFEST.MF अंदर के साथ एक जार फ़ाइल बनाई:

Manifest-Version: 1.0 
Ant-Version: Apache Ant 1.8.3 
Created-By: 1.6.0_25-b06 (Sun Microsystems Inc.) 
Main-Class: my.Main 
Class-Path: . lib/spring-core-3.2.0.M2.jar lib/spring-beans-3.2.0.M2.jar 

उसकी जड़ में एक फ़ाइल बुलाया my.config जो संदर्भित है नहीं है इस तरह मेरी वसंत-context.xml में:

<bean id="..." class="..."> 
    <property name="resource" value="classpath:my.config" /> 
</bean> 

अगर मैं जार चलाने के लिए, सब कुछ ठीक लग रहा है escept कि विशिष्ट फ़ाइल की लोडिंग:

Caused by: java.io.FileNotFoundException: class path resource [my.config] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/D:/work/my.jar!/my.config 
     at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:205) 
    at org.springframework.core.io.AbstractFileResolvingResource.getFile(AbstractFileResolvingResource.java:52) 
    at eu.stepman.server.configuration.BeanConfigurationFactoryBean.getObject(BeanConfigurationFactoryBean.java:32) 
    at eu.stepman.server.configuration.BeanConfigurationFactoryBean.getObject(BeanConfigurationFactoryBean.java:1) 
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:142) 
    ... 22 more 
  • कक्षाएं जार
  • वसंत और अन्य निर्भरता अलग जार
  • वसंत संदर्भ भरी हुई है से लोड किए गए हैं अंदर से लोड किए गए हैं (नई ClassPathXmlApplicationContext ("वसंत-संदर्भ/applicationContext.xml"))
  • my.properties को PropertyPlaceholderConfigurer ("classpath: my.properties")
  • में लोड किया गया है यदि मैं फ़ाइल सिस्टम के बाहर अपनी .config फ़ाइल डालता हूं, और संसाधन url को 'file:' में बदलता हूं, तो सब कुछ ठीक लगता है। ..

कोई सुझाव?

उत्तर

77

यदि आपकी वसंत-संदर्भ.एक्सएमएल और my.config फ़ाइलें विभिन्न जारों में हैं तो आपको classpath*:my.config का उपयोग करने की आवश्यकता होगी?

अधिक जानकारी here

इसके अलावा, सुनिश्चित करें कि आप resource.getInputStream() नहीं resource.getFile() उपयोग कर रहे हैं जब एक जार फ़ाइल के अंदर से लोड हो रहा है बनाते हैं।

+1

वे एक ही जार में हैं, लेकिन मैंने एक ही परिणाम के साथ आपके समाधान की कोशिश की: java.io.FileNotFoundException: क्लास पथ संसाधन [classpath *: my.config] को URL पर हल नहीं किया जा सकता है क्योंकि यह – BTakacs

+0

मौजूद नहीं है, मैंने फ़ाइल को 'conf' निर्देशिका में स्थानांतरित करने का प्रयास किया, लेकिन इससे मदद नहीं मिली। (प्रलेखन कहता है: "इसका मतलब है कि" क्लासपाथ *: *। Xml "जैसे पैटर्न जार फ़ाइलों की जड़ से फ़ाइलों को पुनर्प्राप्त नहीं करेंगे बल्कि विस्तारित निर्देशिकाओं की जड़ से ही होंगे। यह जेडीके के क्लासलोडर में एक सीमा से निकलता है। getResources() विधि जो केवल पास की गई खाली स्ट्रिंग (खोज करने के लिए संभावित जड़ों को इंगित करती है) के लिए फ़ाइल सिस्टम स्थान लौटाती है। ") – BTakacs

+0

अजीब बात यह है: my.properties को PropertyPlaceholderConfigurer द्वारा लोड किया गया है और log4j.properties sl4j द्वारा पाया गया है .. और वे एक ही स्थान पर हैं ... बस यह फ़ाइल ... – BTakacs

1

मुझे Tomcat6.x का उपयोग करते समय भी इसी तरह की समस्या थी और मुझे मिली कोई भी सलाह मदद नहीं कर रही थी। अंत में मैंने work फ़ोल्डर (टोमकैट का) हटा दिया और समस्या चली गई।

मैं जानता हूँ कि यह विसंगत लेकिन प्रलेखन उद्देश्य के लिए है ...

6

मैं जानता हूँ कि इस सवाल पहले से ही उत्तर दिया गया है। हालांकि, वसंत बूट का उपयोग करने वालों के लिए, इस लिंक पर मुझे मदद की - https://smarterco.de/java-load-file-classpath-spring-boot/

हालांकि, resourceLoader.getResource("classpath:file.txt").getFile(); इस समस्या को और SBK की टिप्पणी पैदा कर रहा था:

यह है कि। एक java.io.File निर्देशिका संरचना में फ़ाइल सिस्टम पर एक फ़ाइल का प्रतिनिधित्व करता है। जार एक java.io.File है। लेकिन के भीतर कुछ भी फ़ाइल java.io.File की पहुंच से परे है। जहां तक ​​जावा संबंधित है, जब तक कि यह असम्पीडित न हो, जार फ़ाइल में एक वर्ग शब्द दस्तावेज़ में किसी शब्द से भिन्न नहीं है।

ने मुझे समझने में मदद की कि getInputStream() के बजाय इसका उपयोग क्यों करें। यह अब मेरे लिए काम करता है!

धन्यवाद!