2012-02-25 9 views
13

मैं जावा आरएमआई क्लाइंट/सर्वर ऐप बनाने की कोशिश कर रहा हूं। मैं अपने ऐप के सर्वर पक्ष को शुरू करने में समस्याएं चला रहा हूं, क्योंकि यह ऐप के सर्वर पक्ष को शुरू करने का प्रयास करते समय Registry.bind() विधि पर कॉल के दौरान ClassNotFoundException में चल रहा है।मैं श्रेणीबद्धता को कैसे सेट करूं जो rmiregistry उपयोग करता है?

मैंने यहां सरल ट्यूटोरियल के साथ शुरुआत की: http://docs.oracle.com/javase/1.5.0/docs/guide/rmi/hello/hello-world.html। उन निर्देशों का पालन करने के बाद, शुरुआत में यह क्लास नॉटफाउंड अपवाद को शिकायत कर रहा था कि यह "example.hello.Hello" नहीं मिला। मैं ट्यूटोरियल में destDir निर्देशिका से rmiregistry शुरू करके इसे हल करने में सक्षम था, क्योंकि rmiregistry, जाहिर है, अपने क्लासपाथ के हिस्से के रूप में अपनी प्रारंभिक प्रारंभिक निर्देशिका का उपयोग करता है।

मैंने उसके बाद अपने अन्य टेस्ट ऐप पर शुरुआत की, और जब तक मैंने अपने सर्वर वर्ग में तीसरे पक्ष की जार फ़ाइलों का उपयोग शुरू नहीं किया तब तक मैं ठीक था। अब Registry.bind() क्लास नॉटफाउंड अपवाद फेंकता है यदि मेरा सर्वर क्लास किसी भी जार फ़ाइल में कुछ भी संदर्भित करता है क्योंकि rmiregistry ऐप उन जार फ़ाइलों के बारे में नहीं जानता है।

जहां तक ​​मैं कह सकता हूं, rmiregistry किसी भी प्रकार के क्लासपाथ स्टार्टअप तर्क को स्वीकार नहीं करता है, इसलिए मैं सोच रहा हूं कि मैं इसे कैसे बता सकता हूं कि मैं किस क्लासपाथ को स्वीकार करना चाहता हूं। यहां ट्यूटोरियल के मुताबिक: http://docs.oracle.com/javase/tutorial/rmi/running.html, "आपको यह सुनिश्चित करना होगा कि आप जिस शेल या विंडो में rmiregistry चलाएंगे, उसके पास नहीं क्लास्स्पैट पर्यावरण परिवर्तनीय सेट है या इसमें क्लासस्पैट पर्यावरण चर है जिसमें किसी भी वर्ग के पथ शामिल नहीं हैं कि आप अपने दूरस्थ वस्तुओं के ग्राहकों को डाउनलोड करना चाहते हैं। " यह मेरी जरूरत के विपरीत की तरह लगता है ... या क्या मैं इसे गलत तरीके से पढ़ रहा हूं? क्या किसी को आरएमआई क्लाइंट/सर्वर शुरू करने में कोई सफलता मिली है जो तीसरे पक्ष के जार (कॉमन्स-आईओ, कॉमन्स-लॉगिंग, और आरएमआईओ, मेरे मामले में) का उपयोग करता है?

यह विंडोज़ पर है, वैसे भी।


अद्यतन मैं इसे चारों ओर एक रास्ता मिल गया। नीचे मेरा जवाब देखें।

+3

अच्छा काम ट्रॉय। एक दोस्ताना अनुस्मारक के रूप में, क्या आप अपने आप को प्रश्न का उत्तर पोस्ट कर सकते हैं और फिर उस उत्तर को स्वीकार कर सकते हैं ताकि हम इस प्रश्न को बंद कर सकें? साथ ही, यदि आप अपनी समस्या को ठीक करते हैं तो आपको पिछले प्रश्नों के उत्तर स्वीकार करने की आवश्यकता है। – Zecas

उत्तर

3

(मैं मूल रूप से इस सवाल का जवाब मेरे सवाल के लिए एक अद्यतन के रूप में टिप्पणियों में से एक में प्रति Zecas के सुझाव था।, मैं जवाब अनुभाग में ले जाकर कर रहा हूँ।)

मैं सर्वर हिस्सा प्राप्त करने में सक्षम था दूसरा ट्यूटोरियल ऊपर मेरे सवाल में संदर्भित में सुझाव की अवमानना ​​से शुरू करने के लिए:

"आप यह सुनिश्चित करें कि खोल या खिड़की है जिसमें आप rmiregistry चलाने या तो कोई CLASSPATH वातावरण चर है करना होगा सेट या में क्लासस्पैट पर्यावरण चर है जिसमें कोई भी वर्ग शामिल नहीं है जिसे आप अपने रिमोट ऑब्जेक्ट्स के क्लाइंट्स पर डाउनलोड करना चाहते हैं। "

मैंने एक क्लासस्पैट पर्यावरण चर बनाया और मेरी .class आउटपुट निर्देशिका और तीसरे पक्ष की जार फ़ाइलों में से प्रत्येक को जोड़ा। मैंने सोचा कि मैंने पहले कोशिश की थी, लेकिन मुझे नहीं लगता ... बस सोचा कि अगर कोई और एक ही समस्या है तो मैं अपना समाधान छोड़ दूंगा।

+0

क्लासस्पैट को क्लाइंट मशीन में भी सेट किया जाना है? क्लास नॉटफाउंड अपवाद प्राप्त कर रहा हूं: _stub –

4

कोई आरएमआई रजिस्ट्री विशिष्ट जावा क्लास पथ नहीं है। इसे उसी क्लासपाथ का उपयोग बाकी जावा सिस्टम के रूप में करना चाहिए। आप कमांड लाइन पर या अपने ओएस पर्यावरण में इसे निर्दिष्ट करके अपना क्लासपाथ सेट कर सकते हैं। हालांकि थोड़ा दिनांकित, यह doc आपको सही दिशा में इंगित करना चाहिए।

1

कैसे rmiregistry के लिए classpath सेट करने के लिए की

Win32 एक उदाहरण:

set CLASSPATH=c:\home\ann\src;c:\home\ann\public_html\classes\compute.jar 

यूनिक्स:

setenv CLASSPATH /home/ann/src:/home/ann/public_html/classes/compute.jar 
+0

क्लासस्पैट को अनसेट करने के बारे में टिप्पणी केवल तभी लागू होती है जब आप कोडबेस सुविधा का उपयोग कर रहे हों। सवाल यह है कि इसे सेट करने के तरीके के बारे में है, इसे कैसे सेट नहीं किया जाए, और पोर्ट को बदलने के बारे में कोई भी नहीं पूछा। आज आप अप्रासंगिक स्थानों में इस उत्तर को कितनी बार पोस्ट करने जा रहे हैं? – EJP

+0

आप देख सकते हैं कि मेरे जवाब में क्लासपाथ कैसे सेट करें, लेकिन मुझे लगता है कि आपका लक्ष्य केवल मेरे उत्तरों को कम करने के लिए है, उन्हें ध्यान से पढ़ने के लिए नहीं !!! – MCHAppy

+0

मेरा लक्ष्य यह सुनिश्चित करना है कि प्रश्नों का उत्तर प्रासंगिक और सही ढंग से दिया जाए। जिस हिस्से का आप अब उल्लेख करते हैं वह मौजूद नहीं था जब मैंने टिप्पणी की, और आपका उत्तर का 9 5% अप्रासंगिक रहता है। – EJP

5

CLASSPATH unsetting के बारे में टिप्पणी केवल यदि आप RMI का उपयोग कर रहे लागू कोडबेस सुविधा, कक्षाओं को डाउनलोड करने के बारे में गुप्त टिप्पणी के रूप में इंगित करना है।

आप codebase सुविधा, बस या तो उपयोग नहीं कर रहे हैं:

  1. CLASSPATH वातावरण चर के रूप में सेट rmiregistry, शुरू करने के रूप में कहीं और यहाँ दिखाया गया है से पहले आवश्यक है, या
  2. प्रारंभ rmiregistry साथ -J-Djava.class.path=...
  3. प्रारंभ LocateRegistry.createRegistry(). के साथ आपके सर्वर JVM के अंदर रजिस्ट्री, यह कई तरीकों से सबसे अच्छा समाधान है, क्योंकि यह जेवीएम के साथ रहता है और मर जाता है, इसके क्लासपाथ को साझा करता है, और आकस्मिक रूप से कोडबेस सुविधा के लिए आवश्यकताओं का अनुपालन करता है।

आप करते हैं (3), तो आप वापसी मान एक स्थिर चर में यह कचरा-एकत्र, जो रजिस्ट्री unexported जा करने के लिए है, जो दूरदराज के वस्तु के DGC को जन्म दे सकता का कारण बनता है किया जा रहा से रोकने के लिए स्टोर करना आवश्यक है, जो इसे जीसीएडी का कारण बन सकता है, जो सुनवाई थ्रेड से बाहर निकलता है, जिससे पूरे जेवीएम बाहर निकल सकता है।

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

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