2012-12-31 42 views
6

किसी विधि को लागू करने के लिए एक विशिष्ट संस्करण वाले जार का उपयोग करने के सामान्य मामले पर विचार करें, लेकिन सार्वजनिक या संरक्षित एपीआई (केवल निजी तरीकों के विधि हस्ताक्षर में) में उस जार से किसी भी प्रकार का खुलासा नहीं करना।एसबीटी में, क्या कोई स्वचालित रूप से निजी रूप से उपयोग किए गए पैकेजों का नाम बदल सकता है?

अब मैं जो चाहता हूं वह इस कोड का एक स्वचालित संकलन-समय है जो मूल पैकेज नाम का नाम बदलकर एसबीटी के भीतर जेनरेट कोड में बदल रहा है (फिर से: मैं एसबीटी में एक प्लगइन जोड़ना चाहता हूं या एक सेटिंग build.sbt यह प्रत्येक sbt compile पर करता है)।

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

+0

लगता है जैसे यह [स्कैला मैक्रोज़] (http://scalamacros.org/) के लिए उपयोग का मामला हो सकता है? – logan

+3

ओएसजीआई का सामान्य रूप से उपयोग किया जाता है। ओएसजीआई नाम मैंगलिंग के बजाए क्लास लोडर के साथ चतुर चाल का उपयोग करता है, लेकिन यह वही प्रभाव प्राप्त करता है। –

+0

मैवेन-शेड-प्लगइन से क्लास रिलायंस के बराबर एसबीटी करने के किसी भी तरीके से मुझे नहीं पता: http://maven.apache.org/plugins/maven-shade-plugin/examples/class-relocation.html – mpilquist

उत्तर

2

यह ऐसी चीज की तरह लगता है जो ProGuard करने में सक्षम होगा। SBT ProGuard plugin है लेकिन यह सक्रिय रूप से बनाए रखा प्रतीत नहीं होता है।

अगर मैं इस समस्या से निपट रहा था, व्यक्तिगत रूप से बोलते हुए मैं नाम के बजाय समाधान के लिए कस्टम क्लासलोडर की ओर देखता हूं।

+0

कृपया "व्यक्तिगत रूप से बोलने के लिए मैं एक कस्टम क्लासलोडर को देखूँगा" – samthebest