2017-01-30 5 views
6

मैं सभी उपलब्ध वर्गों को स्कैन करता है (इंटरफेस के लिए, एनोटेशन आदि), क्रम में अभी भी संभव है जिस तरह से वसंत, पर किसी भी जानकारी मिल नहीं कर पा रहे कुछ विचार और कई अन्य चौखटे और कक्षाएं लोड होने के तरीके में आरा से संबंधित परिवर्तनों के मुकाबले वर्तमान में पुस्तकालय हैं।स्कैनिंग classpath/जावा में क्रम में modulepath 9

संपादित: यह सवाल के बारे में स्कैनिंग वास्तविक भौतिक फ़ाइल पथ कक्षाओं की तलाश में है। The other question गतिशील रूप से लोडिंग कक्षाओं और संसाधनों के बारे में है। यह संबंधित है लेकिन बहुत अधिक डुप्लिकेट नहीं है।

अद्यतन: जेट्टी परियोजना इस के लिए एक मानकीकृत एपीआई के लिए एक JEP proposal बना दिया है। यदि आपके पास इस वास्तविकता को बनाने में मदद करने का कोई तरीका है, तो कृपया करें। अन्यथा, प्रतीक्षा करें और आशा है।

+0

मुझे नहीं लगता कि बहुत कुछ बदल गया है, मेरा मतलब है कि अगर एक मॉड्यूल की तरफ एक मॉड्यूल की दृश्यता है, तो आप अभी भी सामान्य चीजें कर सकते हैं। यदि आप किसी मॉड्यूल से किसी क्लास तक नहीं पहुंच पा रहे हैं तो संभवत: आप 'इनकैसिबल ऑब्जेक्ट एक्सेप्शन' या – Eugene

+0

@ यूजीन जैसी कुछ अपवाद को अपनाना चाहते हैं? यह पूछने पर कि क्लासपाथ अब "विरासत" चीज प्रतीत होता है, जिसे _modulepath_ द्वारा प्रतिस्थापित किया जा रहा है। तो मैं स्कैनिंग का अनुमान लगा रहा हूं कि क्लासपाथ क्या बदलता है ... – kaqqao

+0

[जावा 9 में कक्षाओं और संसाधनों को लोड करना] का संभावित डुप्लिकेट [https://stackoverflow.com/questions/45166757/loading-classes-and-resources- इन-जावा -9) –

उत्तर

6

मैं FastClasspathScanner लिए यह पता लगाने की कोशिश कर रहा हूँ। अब तक सबसे अच्छा जानकारी मैं कैसे सिस्टम को पता चलता है और निराकरण मॉड्यूल here है, और कोड आप नमूदार मॉड्यूल की सूची प्राप्त करने के लिए चाहते हैं here है, परियोजना java8-jigsaw-depvis से पर पाया। आप प्रत्येक ModuleReference से एक यूआरएल फ़ील्ड प्राप्त कर सकते हैं, और उसके बाद मॉड्यूल रूट के भीतर मैन्युअल रूप से प्रत्येक निर्देशिका या जार स्कैन कर सकते हैं जैसे कि यह पारंपरिक क्लासपाथ से तत्व था - हालांकि यदि आप मैन्युअल रूप से स्कैन करते हैं, तो आपको अतिरिक्त जानकारी की आवश्यकता हो सकती है या नहीं निर्देशिका या मॉड्यूलर जर्फ़ाइल की रूट में module-info.class (उदाहरण के लिए दृश्यता जानकारी के लिए exports परिभाषाएं पढ़ना)। तुम भी ModuleReference का उपयोग प्रत्येक मॉड्यूल में संसाधनों को सूचीबद्ध करने के कर सकते हैं, और फिर आप एक InputStream या ByteBuffer प्रत्येक नामित संसाधन की सामग्री के साथ देने के लिए मॉड्यूल लोड हो रहा है प्रणाली का उपयोग करें।

कुछ बिंदु पर, यह सब FastClasspathScanner में पारदर्शी ढंग से समर्थन किया जाएगा, लेकिन बहुत कुछ यहीं पाने के लिए जैसे देखते हैं, क्या मॉड्यूल की सूची प्राप्त करने और उनको स्कैन करने के लिए पर्याप्त है, क्लासलोडर्स को अनदेखा कर रहे हैं, या क्या क्लासलोडर अभी भी स्कैन किए जाने चाहिए? (शायद क्लासपाथर को क्लासपाथ यूआरएल के लिए भी स्कैन किया जाना चाहिए, क्योंकि कमांडलाइन से क्लासपाथ में पारंपरिक जार जोड़ना अभी भी संभव है।)

+1

बहुत बढ़िया, आखिर में कुछ वास्तविक सुराग! धन्यवाद इसके लिए एक गुच्छा! – kaqqao

+1

यहां एक ही लेखक द्वारा अधिक विस्तृत जांच की गई है: https://github.com/lukehutch/fast-classpath-scanner/issues/36 – Vadzim

1

वास्तविक मुद्दा यहां सभी जार और फ़ोल्डरों के पथ ढूंढना है। classpath। एक बार जब आपके पास हो, तो आप स्कैन कर सकते हैं।

  • वर्तमान वर्ग के लिए वर्तमान मॉड्यूल वर्णनकर्ता
  • MANIFEST.MF
  • में से प्रत्येक के इस तरह के मॉड्यूल खुला संसाधन के लिए सभी requires मॉड्यूल
  • मिल पाने को दूर MANIFEST.MF पथ:

    मैं क्या पीछा कर रहा है संसाधन url

  • मॉड्यूल के क्लासपाथ, यानी इसके जार या फ़ोल्डर के लिए क्या बनी हुई है।

वर्तमान कोड के लिए क्लासपाथ प्राप्त करने के लिए, मैं वर्तमान मॉड्यूल के लिए भी ऐसा करता हूं।

इस तरह से मैं एक वर्तमान में काम कर रहा मॉड्यूल के classpath और उसके सभी आवश्यक मॉड्यूल (1 कदम दूर) एकत्र करें। वह मेरे लिए काम कर रहा था - और मेरा जावा 8 स्कैनर अभी भी नौकरी करने में सक्षम था।इस दृष्टिकोण के लिए किसी भी अतिरिक्त वीएम ध्वज इत्यादि की आवश्यकता नहीं है

मैं सभी प्राप्त करने के लिए इस दृष्टिकोण को आसानी से प्राप्त कर सकता हूं (केवल पहले स्तर पर नहीं), लेकिन अभी के लिए, मुझे इसकी आवश्यकता नहीं है।

Code

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