2011-09-29 12 views
9

यदि उपलब्ध हो तो जावा 7 एसडीके में कुछ एनआईओ 2 सुविधाओं का उपयोग करने में मुझे रूचि है (विशेष रूप से, file system watchers), हालांकि मैं जावा 7 के लिए अपनी कक्षाओं को संकलित नहीं करना चाहता हूं और जावा को बाहर नहीं करना चाहता 6 रनटाइम। अधिकतर क्योंकि मैं मैक ओएस एक्स के साथ संगतता बरकरार रखना चाहता हूं, और इसलिए भी क्योंकि मैं अपने उपयोगकर्ताओं को अपग्रेड करने के लिए मजबूर नहीं करना चाहता हूं।जावा 6 में जावा 7 एसडीके सुविधाओं का उपयोग 6

क्या यह संभव है? यह करने के लिए सबसे अच्छा तरीका क्या है? कोई लिंक या उदाहरण?

यहां कुछ तरीकों से मैं कल्पना कर सकता हूं: एक क्लास फ़ाइल को एक अलग कंपाइलर के साथ संकलित करना और इसे जावा संस्करण के आधार पर गतिशील रूप से लोड करना? या शायद प्रतिबिंब का उपयोग कर? या शायद जावा 6-संगत कक्षाएं उत्पन्न करने के लिए जावा 7 के लिए एक कंपाइलर सेटिंग है?

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

+0

चूंकि मुझे लगता है कि ये सुविधाएं SE7 में मौजूद होने लगती हैं, तो आपको लगता है कि आप एक एसई 6 संगतता मोड के साथ संकलित करने और उन्हें बनाए रखने में सक्षम होंगे? – KevinDTimm

+0

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

+0

क्षमा करें, दो कोड बेस आवश्यक होने जा रहे हैं (या, कम से कम, प्रत्येक वातावरण के लिए एक अलग फ़ाइल हैंडलिंग आधार है और प्रत्येक संस्करण के लिए अलग आउटपुट बनाएं क्योंकि संस्करण एक्स में संकलित कोड आमतौर पर किसी भी कम संख्या वाले संस्करण में काम नहीं करता है) – KevinDTimm

उत्तर

9

बस लक्ष्य 1.6 के साथ बनाएं और अपना कोड व्यवस्थित करें ताकि आप ClassNotFoundExceptions और NoClassDefFoundErrors को 1.7 का उपयोग करने वाले मॉड्यूल के चारों ओर साफ़ रूप से पकड़ सकें। उदाहरण के लिए शायद उन्हें एक अलग वर्ग लोडर के साथ लोड करें।

+0

पर विचार करें यह काम करता है, धन्यवाद! मैंने सिंटैक्स हाइलाइटिंग का ख्याल रखने के लिए ग्रहण में जेडीके 7 को कॉन्फ़िगर किया है, और मैंने लक्ष्य जावा 6 के साथ बनाया है। विधि कॉल के लिए जो मौजूद नहीं है, आपको NoSuchMethodError को पकड़ना होगा। –

+0

@Laurens @EJP। मुझे यह नहीं मिला, आप लक्ष्य 1.6 के साथ स्रोत 1.7 कैसे बना सकते हैं? यह आपको नहीं देगा: 'javac: स्रोत रिलीज 1.7 को लक्ष्य रिलीज की आवश्यकता है 1.7' – Pacerier

+0

@Pacerier चाल 1.7 के बजाय स्रोत 1.6 के साथ निर्माण करना है, और केवल 1.7 एसडीके से विधियों का आह्वान करना है। शिकायत करने से रोकने के लिए और कोड को पूरा करने के लिए अपने संपादक में कुछ कॉन्फ़िगरेशन की आवश्यकता हो सकती है, लेकिन अन्यथा यह केवल काम करता है। –

0

जावा 7 में जोड़े गए कुछ तत्वों के लिए, आप जावा 6 जेएसआर जार ढूंढ सकते हैं जो आपको कार्यक्षमता देते हैं। मुझे विश्वास नहीं है कि फाइल सिस्टम वॉचर के लिए यह मामला होगा।

+0

यदि जावा 6 पर चल रहा है, तो मुझे कार्यक्षमता की आवश्यकता नहीं है, यह जावा 7 पर चल रहे उपयोगकर्ताओं के लिए वैकल्पिक है। इस विशेष मामले में, शायद मैं मतदान या स्पष्ट ताज़ा व्यवहार पर वापस आना। –

+3

JNotify –

0

फाइल सिस्टम वॉचर्स के संदर्भ में, जावा 7 से पहले मैं प्रत्येक फ़ाइल में केवल कुछ फाइलों के गुणों को मतदान करता था या जांचता था कि यह नहीं बदला था। यह बिल्कुल अच्छा नहीं है, लेकिन व्यावहारिक रूप से यह कोई ध्यान देने योग्य संसाधनों का उपयोग नहीं करता है और अंत उपयोगकर्ता के परिप्रेक्ष्य से ऐसा ही प्रतीत होता है।

यदि आप अधिक व्यापक लाइब्रेरी के बाद हैं, तो http://commons.apache.org/jci/commons-jci-fam/index.html देखें - मेरा मानना ​​है कि ऐसा कुछ ऐसा करता है, हालांकि मैंने कभी इसका उपयोग नहीं किया है।

स्रोत निर्दिष्ट करना 1.7 और लक्ष्य 1.6 मुझे यकीन है कि मैं काम नहीं करूँगा, मैंने इसे थोड़ी देर पहले और स्मृति से अलग करने की कोशिश की, जेवीएम ने असंगत झंडे के बारे में शिकायत की (मेरा अनुमान 7 में नए आविष्कारिक के कारण है ।)

1

टूलकिट ने इंगित किया है कि आप जावा 1.6 के लिए आसानी से निर्माण कर सकते हैं। हालांकि, आपको यह सुनिश्चित करने की ज़रूरत है कि आप किसी भी विधि को गलती से एक्सेस न करें जो जावा 6 में मौजूद नहीं है। इससे आपके उत्पादन कोड में रनटाइम अपवाद होगा।

यदि आप मेवेन का उपयोग कर रहे हैं, तो आप मेवेन-एनफोर्स-प्लगइन का उपयोग कर सकते हैं जो सुनिश्चित करता है कि कोई जावा 1.7 कक्षाएं या विधि कॉल 1.6 के लिए आपके कोड में घुसपैठ नहीं करती है।

एक उदाहरण जावा 1.4 से 1.5 में परिवर्तन होगा। मैं 1.4 के लक्ष्य के साथ 1.5 के साथ निर्माण कर रहा था, और मैंने गलती से उपयोग किया:

new BigDecimal(5); 

यह संकलित ठीक है, और मेरे लिए ठीक चला गया। लेकिन चूंकि ग्राहक अभी भी 1.4 का उपयोग कर रहा था, यह असफल रहा। क्योंकि यह कन्स्ट्रक्टर 1.4 में मौजूद नहीं है। यह 1.5 में पेश किया गया था।

एक और समाधान दो जार बनाने के लिए होगा, एक नया एनओओ सामान, एक पुरानी सामग्री के साथ, और स्थापना समय पर पता लगाएगा कि उपयोगकर्ता जावा 1.7 चला रहा था या नहीं। यदि ऐसा है, तो जार जोड़ें जिसमें उचित कार्यान्वयन शामिल है।

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