2010-07-02 13 views
11

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

supplier:artifact:1.0.0 
com.supplier.useful.ClassA 
com.supplier.dto.ClassB (old) 

us:dependency:1.1.20 
com.supplier.dto.ClassB (new) 

us:project-web:1.1.20 
- supplier:artifact:1.0.0 
- us:dependency:1.1.20 

तो - मैं परियोजना वेब में ClassA उपयोग करने की आवश्यकता है, लेकिन मैं dependency विरूपण साक्ष्य से ClassB उपयोग करने के लिए की जरूरत है। मैं सप्लायर संशोधित नहीं कर सकता: आर्टिफैक्ट, या हम: निर्भरता।

कोई विचार ?!

उत्तर

8

संस्करण 2.0.9 मेवेन क्लासपाथ ऑर्डरिंग को संरक्षित करता है, इसलिए यदि आप सप्लायर जार से पहले अपने पैच किए गए कक्षाओं को एक जार में परिभाषित करते हैं तो यह आपूर्तिकर्ता कार्यान्वयन को छुपाएगा।

वैकल्पिक रूप से आप maven shade plugin पर देख सकते हैं क्योंकि यह वही है जो आप मुझसे पूछ रहे हैं।

5

यदि आप मेवेन 2.0.9+ का उपयोग कर रहे हैं, तो बस अपनी कक्षा को एक जार में रखें और इसे पर निर्भर करता है आपके सप्लायर से आर्टिफैक्ट। जैसा कि @ पीटर द्वारा उल्लेख किया गया है, मेवेन मेवेन 2.0.9 के बाद से क्लासपाथ के लिए पोम ऑर्डर का उपयोग करता है (देखें MNG-1412/MNG-3111)।

जो भी कारण के लिए आप इस समाधान से संतुष्ट नहीं हैं, तो आप Maven Dependency Plugin का उपयोग करें (Unpacking specific artifacts देखें) target/classes में निर्भरता (जो संकलन classpath पर होना चाहिए) कुछ excludes साथ dependency:unpack का उपयोग कर अनपैक करने के लिए कर सकता है। मैं इसे फिर से खोलने की भी कोशिश नहीं करता, यह बेकार जटिलता पेश करेगा (संकलित वर्गपंथ पर नए जार को बदलकर पुराने जार को बदलना मुश्किल नहीं होगा)।