2010-05-19 17 views
9

पर क्लासपाथ से डेटा लोड करते हैं क्लासपाथ में मौजूद डेटा फ़ाइलों में जावा कक्षाओं की निर्भरताओं को प्रबंधित करने के लिए सबसे आसान तरीका क्या है?जावा क्लास की डेटा निर्भरता प्रबंधित करना जो रनटाइम

अधिक विशेष रूप से:
डेटा निर्भरताओं को कैसे एनोटेट किया जाना चाहिए? शायद जावा एनोटेशन का उपयोग (उदा।, @ डेटा)? या कुछ बिल्ड स्क्रिप्ट या गुण फ़ाइल में कुछ बिल्ड प्रविष्टियां? क्या कोई ऐसा उपकरण है जो ऐसी जानकारी को एकीकृत और मूल्यांकन करता है (चींटी, स्कॉन्स, ...)? क्या आपके पास उदाहरण हैं?

निम्नलिखित परिदृश्य पर विचार करें:
चींटी की कुछ पंक्तियां मेरे स्रोतों से एक जार बनाती हैं जिसमें क्लासपाथ पर मिली सब कुछ शामिल है। फिर jarjar का उपयोग सभी .class फ़ाइलों को निकालने के लिए किया जाता है जो निष्पादित करने के लिए आवश्यक नहीं हैं, कहें, कक्षा Foo। समस्या यह है कि क्लास बार पर निर्भर सभी डेटा फाइलें अभी भी जार में हैं। आदर्श तैनाती स्क्रिप्ट, तथापि, पहचान होता है कि डेटा फ़ाइलों को, जिस पर केवल वर्ग बार निर्भर करता है डेटा फ़ाइलों जिस पर वर्ग फू निर्भर करता है बनाए रखा जाना चाहिए, जबकि हटाया जा सकता है।

कोई संकेत?

उत्तर

0

मुझे नहीं लगता कि आपके द्वारा वर्णित सिस्टम के लिए एक सामान्य समाधान मौजूद है, हालांकि, मुझे ASM का उपयोग करके कक्षाओं पर एनोटेशन पढ़ने पर एक स्टैब था, क्योंकि इसका उपयोग जर्जर द्वारा भी किया जाता है। यह टिप्पणी संबंधी डेटा कि जिस तरह से पढ़ (ClassReader पर स्वीकार() विधि करने के लिए एक ClassVisitor में गुजरती हैं, और visitAnnotation कॉलबैक पर थोड़ा उपयोगी) के लिए कठिन नहीं है। इसका मतलब है कि आप या तो अपने इच्छित व्यवहार को जर्जर को आजमा सकते हैं और शामिल कर सकते हैं या आप इसे अपनी निर्माण प्रक्रिया के लिए कस्टम चरण के रूप में जोड़ सकते हैं।

+0

यह एक तरह लगता है कि दिलचस्प दृष्टिकोण। धन्यवाद! हालांकि, मैं पूरी तरह से खुश नहीं हूं मुझे खुद को सभी काम करना होगा, और समाधान स्वामित्व होगा। –

0

आप अपने प्रोजेक्ट refactor नहीं किया जा सकता है, ताकि आप submodules कि प्रत्येक परियोजना के लिए ही प्रासंगिक फ़ाइलें हो है; बार क्लास और बार संबंधित फाइलों को उनके बंडल में पैक किया जाएगा जबकि फू दूसरे को पैक करेंगे?

एक और संभावना कुछ पैकेज नामकरण परंपरा का उपयोग करने के लिए फ़ाइलों आप मैं अपने बंडल देखना चाहते हैं फिल्टर करने के लिए सक्षम होने के लिए किया जाएगा।

+0

यह * निश्चित रूप से * डेटा पर कक्षाओं की निर्भरता मॉडल करेगा, हालांकि, चरम मामले में इसका मतलब प्रति वर्ग एक परियोजना होगी, जो अक्षम है। इसके अलावा, अगर मैं अपनी डेटा निर्भरता मेरे घटक लेआउट को निर्देशित करता हूं तो मुझे नफरत होगी। फिर, * स्पष्ट रूप से * मॉडल कोड-डेटा-निर्भरताओं के लिए सबसे सरल और सबसे अधिक उपयोग किया जाने वाला तरीका क्या है? आपकी सहायताके लिए धन्यवाद! –

1

यह कई समस्याओं Maven पहले से ही हल किया है के साथ इसे बनाने, निर्भरता, और संसाधन प्रबंधन है में से एक है। कोई भी मैवेन प्रोजेक्ट एक मानक निर्देशिका लेआउट का पालन करता है जो आपको बताता है कि आपको अपनी डेटा फाइल कहां रखना चाहिए: 'संसाधन' निर्देशिकाओं में। पारंपरिक Maven निर्देशिका संरचना इस प्रकार है के रूप में ...

/ 
/src/ 
/src/main/java/ 
/src/main/java/App.java 
/src/main/resources/ 
/src/main/resources/my.prod.data.or.cfg.or.whatever 
/src/test/java/ 
/src/test/java/AppTest.java 
/src/test/resources/ 
/src/test/resources/my.test.data.or.cfg.or.whatever 
/pom.xml 

इस का लाभ यह है कि सभी फाइलों को जो 'मुख्य' (prod) संसाधन निर्देशिका में शामिल हैं से रन-टाइम में अपने आवेदन के लिए उपलब्ध हैं क्लासपाथ। 'परीक्षण/संसाधनों' फ़ाइलों के सभी निर्माण & इकाई परीक्षण के समय के दौरान अपने कोड के लिए उपलब्ध हैं, लेकिन अपने अंतिम विरूपण साक्ष्य में शामिल नहीं हैं।

+0

आपके उत्तर के लिए धन्यवाद, लेकिन मुझे डर है कि यह समस्या का समाधान नहीं करता है: क्या मैवेन * स्पष्ट रूप से * App.java और my.prod.data.or.cfg.or.whatever के बीच निर्भरता को एनोटेट करता है? और अगर मेवेन को तैनाती के दौरान बाहर रखा गया है तो क्या मैवेन स्वचालित रूप से बाद वाले को अनदेखा करता है? –

+0

मुझे ऐसी किसी भी अंतर्निहित टिप्पणियों से अवगत नहीं है जो आप जिस कार्यक्षमता की तलाश में हैं उसे प्रदान करते हैं। हालांकि, ऊपर दिए गए मेवेन समाधान के साथ, आप कोड की रेखा का उपयोग कर सकते हैं ... क्लासलोडर.getसिस्टम रिसोर्स ("क्लासपाथ: /my.prod.data.or.cfg.or।जो कुछ भी ") 'क्लासपाथ: /' भाग वैकल्पिक है क्योंकि यह डिफ़ॉल्ट रूप से क्लासपाथ को पहले भी देखता है लेकिन मुझे स्पष्ट होना पसंद है। इस बात को ध्यान में रखते हुए, इसे लपेटने के लिए अपनी खुद की एनोटेशन लिखना मुश्किल नहीं होना चाहिए इस कार्यान्वयन। इस पर अधिक जानकारी के लिए क्लासलोडर एपीआई देखें और यह अन्य तरीकों से है। उम्मीद है कि यह सही दिशा में मदद करता है। –

+0

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

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