2010-11-15 2 views
16

मुझे कुछ जावा कोड के साथ थोड़ा परेशानी हो रही है जिसे मैं ग्रहण में संकलित करने की कोशिश कर रहा हूं। मैं कोड की इस पंक्ति से निम्न चेतावनी ...ऑपरेटिंग सिस्टम MxBean के लिए jre6/lib/rt.jar तक पहुंच क्यों प्रतिबंधित है?

Access restriction: The type OperatingSystemMXBean is not accessible due to restriction on required library C:\Program Files\Java\jre6\lib\rt.jar 

बार आ रही है ...

com.sun.management.OperatingSystemMXBean bean = (com.sun.management.OperatingSystemMXBean) java.lang.management.ManagementFactory.getOperatingSystemMXBean(); 

मैं इस के आसपास तरीके पाया है, लेकिन मैं प्रतिबंध चेतावनी बारे में चिंतित हूँ। यह कोड मेरे ओपन सोर्स प्रोजेक्ट (CfTracker) के लिए है और यदि मैं किसी प्रकार के लाइसेंस समझौते को तोड़ने जा रहा हूं तो मैं इस प्रतिबंध के आसपास काम नहीं करना चाहता हूं। क्या कोई इसे समझने में मेरी सहायता कर सकता है?

उत्तर

13

यह लाइसेंस समझौतों की समस्या नहीं है। यह केवल ग्रहण है जो आपको उन वर्गों का उपयोग करने से बचाने की कोशिश कर रहा है जो आधिकारिक जेडीके एपीआई (बल्कि, ओरेकल/सूर्य के जेवीएम कार्यान्वयन का हिस्सा नहीं हैं) का हिस्सा नहीं हैं।

क्या कोई विशेष कारण है कि आपको कक्षा कास्ट करने की आवश्यकता है (the "official" interface java.lang.management.OperatingSystemMXBean का उपयोग करने के बजाय)?

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

+0

धन्यवाद थिलो। यह मेरे लिए इसे साफ़ करता है। मैं इसे ओरेकल/सूर्य कार्यान्वयन में प्राप्त getProcessCpuTime() विधि प्राप्त करने के लिए कास्टिंग कर रहा था। मैं जावा में नया हूं इसलिए पता नहीं था कि यह एक ऑफिकल एपीआई नहीं था। मैं एक कोशिश पकड़ने का उपयोग करने में देखता हूं हालांकि यह बहुत समझ में आता है अगर यह हर समय नहीं होगा :) चीयर्स! –

+0

मुझे लगता है कि परियोजना सेटिंग्स स्तर पर इस विकल्प को ओवरराइड करना बेहतर है। – user626528

13

विंडो पर जाएं -> प्राथमिकताएं -> जावा -> कंपाइलर -> त्रुटि/चेतावनी। बहिष्कृत और प्रतिबंधित API का चयन करें। इसे चेतावनी में बदलें। वर्जित और निराश संदर्भ बदलें और इसे चेतावनी में बदलें। (या आपकी आवश्यकता के रूप में।)

धन्यवाद।

9

सबसे अच्छा समाधान मैं इस एक के लिए मिला है:

  • परियोजना संपत्तियों में पथ बिल्ड सेटिंग में जाएं।

  • JRE सिस्टम लाइब्रेरी निकालें

  • इसे वापस जोड़ें; "लाइब्रेरी जोड़ें" का चयन करें और जेआरई सिस्टम लाइब्रेरी का चयन करें।

https://stackoverflow.com/a/2174607/1572446

+0

मैंने अपनी समस्या को ठीक करने की कोशिश करने पर बस ठोकर खाई और यह काम किया। सुपर आसान और कोई गन्दा विशेष परिस्थिति कॉन्फ़िगरेशन। धन्यवाद! – RNGuy

1

यहाँ यह Why Developers Should Not Write Programs That Call 'sun' Packages समझाया गया है।

ओरिएंट डीबी here द्वारा उपयोग किए जाने वाले एक वर्कअराउंड प्रतिबिंब है।

एक उदाहरण के रूप:

try { 
    OperatingSystemMXBean os = ManagementFactory.getOperatingSystemMXBean(); 
    if (Class.forName("com.sun.management.OperatingSystemMXBean").isInstance(os)) { 
     Method memorySize = os.getClass().getDeclaredMethod("getTotalPhysicalMemorySize"); 
     memorySize.setAccessible(true); 
     return (Long) memorySize.invoke(os); 
    } 
} catch (Exception e) { 
} 
संबंधित मुद्दे