2012-06-01 22 views
5

मान लें कि मेरे पास दो वर्ग (बॉब और टॉम) हैं जैसे कि बॉब टॉम का उपयोग करता है, लेकिन टॉम को बॉब की आवश्यकता नहीं होती है। इन दोनों फाइलें एक ही निर्देशिका संरचना में स्थित हैं।क्लासपाथ में कक्षा मौजूद होने पर मैं अंतर्निहित जावा संकलन को कैसे रोकूं?

public class Bob { 
    public static void main(String[] args) { 
    System.out.println(Tom.MESSAGE); 
    } 
} 

public class Tom { 
    public static String MESSAGE = "Hello World"; 
} 

अगर मैं ठेठ फैशन में बॉब संकलित करने के लिए प्रयास करते हैं, मैं इसे परोक्ष Tom.java को संकलित करने के रूप में अच्छी तरह के बाद से यह Bob.java की निर्भरता के रूप में मान्यता प्राप्त है प्राप्त कर सकते हैं। यह बहुत अच्छा काम करता है।

लेकिन अब मान लें कि मैं टॉम को एक जेएआर फ़ाइल में रखना चाहता हूं। तो मैं Tom.java बनाता हूं और परिणामों को एक जेएआर फ़ाइल में डालता हूं: libTom.jar। अब मैं libTom.jar पर पॉइंटिंग क्लासपाथ के साथ संकलित हूं। दुर्भाग्यवश, कंपाइलर Tom.java फ़ाइल देखता है और इसे libTom.jar में कक्षा का उपयोग करने के बजाय संकलित करने का कारण बनता है। कक्षा क्लासपाथ में मिली है तो Tom.java के अंतर्निहित निर्माण को छोड़ने के लिए संकलक प्राप्त करने का कोई तरीका है?

मुझे पता है कि यह उदाहरण काफी हद तक विकसित है। बाकी आश्वासन दिया कि इस मुद्दे से घिरा एक और जटिल, कम संकुचित उपयोग-मामला है। धन्यवाद।

+3

हालांकि मैंने इसका उपयोग नहीं किया है, क्या आपने javac के लिए "सरल" ध्वज की कोशिश की है? सहायता आउटपुट के अनुसार: "-इम्प्लिट: {none, class} निर्दिष्ट करें कि निहित संदर्भित फ़ाइलों के लिए क्लास फाइलें उत्पन्न करना है या नहीं, जो आपको पसंद है। –

+0

ऐसा क्यों नहीं है? @SteveB। – 11684

उत्तर

0

ऐसा प्रतीत होता है कि यह संभव नहीं है, जो मुझे शुरुआत से डरता है।

0

हाँ, तुम कर सकते हो कि, एक वर्ग के पूरा नाम लिखकर अर्थात टाइप

println (the.package.of.external.Tom.MESSAGE) द्वारा;
System.out.println (the.current.package.Tom.MESSAGE);

+0

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

+0

आह ... आप किसी अन्य निर्देशिका में स्रोत कोड डाल सकते हैं, और कक्षा को 'आयात' कर सकते हैं। – 11684

+0

या आप जेरेबेल पर एक नज़र डाल सकते हैं। @ViperBailey – 11684

1

यदि क्लासपाथ में एक ही नाम के साथ दो वर्ग हैं और उसी पैकेज में क्लासपाथ में, यह अनुमान करना मुश्किल है कि जब जावा कोड को संकलित करता है तो कौन सा उठाया जाएगा। यदि Tom वर्ग स्रोत में मौजूद है, तो निश्चित रूप से इसे उठाया जाएगा।

एक तरह से आप इससे बच सकते हैं एक अलग पैकेज में Tom एस में से एक को रखना है। एक और तरीका यह है कि यदि आप अपने वर्तमान Tom को एक अलग प्रोजेक्ट में ले जा सकते हैं। मैं समझता हूं कि इनमें से कोई भी आपके लिए व्यावहारिक नहीं हो सकता है। यदि यह वास्तव में आवश्यक है, तो आप अपने स्वयं के क्लासलोडर लिखने के साथ प्रयोग कर सकते हैं। संदर्भ के लिए यह प्रश्न देखें: Jar hell: how to use a classloader to replace one jar library version with another at runtime

0

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

+0

विशिष्ट समस्या की प्रकृति के कारण मैं हल करने की कोशिश कर रहा हूं, यह काम नहीं करेगा। –

+0

आपको विशिष्ट समस्या के बारे में अधिक जानकारी देना पड़ सकता है – davidfrancis