2010-04-16 15 views
12

मेरे पास एक वेब एप्लिकेशन है जो एक पुस्तकालय का उपयोग करता है जो TOMCAT_HOME/common/lib में रहता है।getResourceAsStream वेबपैप में संसाधन लोड नहीं कर रहा है

ApplicationConfig.class.getResourceAsStream("/hv-application.properties"); 

मेरे बिलाव वेब अनुप्रयोग इस गुण फ़ाइल में शामिल हैं: इस पुस्तकालय के लिए एक गुण classpath की जड़ में फ़ाइल (एक वर्ग ApplicationConfig बुलाया में) लग रहा है। यह वेब-आईएनएफ/कक्षाओं में है, जो वर्गपाथ की जड़ सही है? हालांकि, रनटाइम पर, जब यह गुण फ़ाइल लोड करने का प्रयास करता है, तो यह एक अपवाद फेंकता है क्योंकि यह इसे नहीं ढूंढ सकता (getResourceAsStream शून्य देता है)।

मेरा आवेदन एक साधारण, स्टैंडअलोन जावा एप्लिकेशन है, तो सब ठीक काम करता है। क्या टोमकैट अलग-अलग कार्य करने के लिए getResourceAsStream विधि का कारण बनता है? मुझे पता है कि वहां बहुत सारे प्रश्न हैं, लेकिन उनमें से कोई भी दुर्भाग्य से मदद नहीं करता है। धन्यवाद।

उत्तर

22

इसके बजाय Thread.currentThread().getContextClassLoader().getResourceAsStream("/hv-application.properties") आज़माएं।

+0

धन्यवाद बिनिल। यह काम करता है, लेकिन मुझे पुस्तकालय में कोई बदलाव नहीं करना पड़ेगा। यदि कोई अन्य समाधान नहीं मिलता है तो उत्तर के रूप में चिह्नित किया जाएगा। – Michael

+3

आश्चर्यजनक रूप से, टॉमकैट 5.5 के तहत विन XP और जेडीके 1.5.08 के साथ मैं अग्रणी "/" का उपयोग किये बिना संसाधन फ़ाइल लोड करने में सक्षम था। असल में जब "/" तैयार करना, मैं समस्याओं में भाग रहा था। – Olivier

1

टॉमकैट सुरक्षा प्रबंधक आम तौर पर आपको टॉमकैट रूट पुस्तकालयों में पुस्तकालयों से वेबैप कक्षाओं और संसाधनों तक पहुंचने नहीं देगा। यह एक कंटेनर में चल रहे वेब अनुप्रयोगों के बीच अलगाव देने के लिए है।

सुरक्षा नीति को अपडेट करके आप इसे प्राप्त करने में सक्षम होना चाहिए, लेकिन आमतौर पर यह बेहतर है कि आप अपनी libs को टॉमकैट कंटेनर में न रखें, जो मुझे लगता है कि आप कर रहे हैं।

+1

सवाल स्पष्ट रूप से कहता है कि संसाधन वेब-आईएनएफ/कक्षा निर्देशिका में स्थित है ... – Pointy

+0

@stevedbrown, ओपी का कहना है कि फ़ाइल को वेब-आईएनएफ/कक्षाओं के अंदर, युद्ध के साथ पैक किया गया है। –

+0

क्या आपने पहली वाक्य पढ़ी? "मेरे पास एक वेब एप्लिकेशन है जो एक पुस्तकालय का उपयोग करता है जो TOMCAT_HOME/common/lib में रहता है। यह लाइब्रेरी क्लासपाथ (एप्लिकेशन कॉन्फिग नामक कक्षा में) की एक रूट फ़ाइल में दिखती है:" – stevedbrown

2

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

यह document बताता है कि टोमकैट क्लास लोडर को कैसे प्रतिनिधि करता है। यदि संभव हो, तो आप निम्न में से किसी एक को आजमा सकते हैं:

  1. जार फ़ाइल को अपने वेब एप्लिकेशन (वेब-आईएनएफ/lib) में सामान्य/lib में ले जाएं। यह हमेशा संभव नहीं है मुझे पता है, लेकिन कभी-कभी जार (उदा। Log4j) क्लासलोडर्स (*) में शांतिपूर्वक सह-अस्तित्व में मिल सकता है।
  2. अपनी कॉन्फ़िगरेशन फ़ाइल को सामान्य/कक्षाओं में ले जाएं। यह प्रभावी रूप से वही बात है (कॉन्फ़िगरेशन आइटम को उसी क्लासलोडर में जार के रूप में रखता है)। फिर, यह आदर्श नहीं है, लेकिन अगर आपके पर्यावरण पर नियंत्रण है, तो यह काम करेगा।

किसी भी तरह से, अलग-अलग क्लासलोडरों में संसाधन होने से दर्द हो सकता है। आशा है कि ये आपकी मदद करेगा।

(*) log4j -log4j.ignoreTCL विकल्प जो यह संभव है, हालांकि

+0

धन्यवाद एंडी, मैंने अपनी कॉन्फ़िगरेशन फ़ाइल को सामान्य/कक्षाओं में ले जाने की कोशिश की, लेकिन यह काम नहीं किया। मेरा वेबपैप एकमात्र वेबपैप है जो इस लाइब्रेरी का उपयोग करता है, इसलिए शायद मैं इसे वेब-आईएनएफ/lib में ले जाऊंगा (हालांकि दर्द होना चाहिए क्योंकि मुझे अपने मेवेन पोम को संशोधित करना होगा ताकि इसमें जार शामिल हो)। – Michael

+0

अपने जार में सभी जार रखना बेहतर है। अधिकांश समय यह संभव है, लेकिन ऐसी परिस्थितियां हैं जहां चीजों को आम/lib में ले जाना (जैसे कि आप संसाधन बना रहे हैं जिसका उद्देश्य सर्वर पर उपलब्ध होना है)। –

0

मैं एक प्रतिक्रिया के रूप Olivier comment का विस्तार कर रहा हूँ है (लीड के लिए धन्यवाद)।

समस्या संसाधन पथ में अग्रणी स्लैश (/) प्रतीत होता है।

में टोमकैट 8 WebAppClassloader सही स्लैश के साथ और बिना पथ को सही ढंग से हल करता है। .getResourceAsStream("/org/pakopa/app/config.properties"); और .getResourceAsStream("org/pakopa/app/config.properties"); दोनों इनपुटस्ट्रीम लौटाते हैं।

में बिलाव 7.getResourceAsStream("/org/pakopa/app/config.properties"); हल नहीं होती है और null रिटर्न लेकिन .getResourceAsStream("org/pakopa/app/config.properties"); सही ढंग से हल हो गई है (और मैं पिछले संस्करणों भी मान लेते हैं)।

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