2011-12-23 7 views
38

सी # में, हमारे पास परियोजनाओं के निर्माण के लिए 2 तरीके हैं: Debug और Release, मुझे आश्चर्य है कि जावा की एक ही चीज़ है या नहीं। मैं जावा आईडीई के रूप में इंटेलिजे आईडीईए का उपयोग कर रहा हूं और अब तक मैंने वीएस आईडीई जैसे बिल्ड मोड को कॉन्फ़िगर करने के लिए कहीं भी नहीं देखा है।क्या जावा में 'डीबग' और 'रिलीज' बिल्ड मोड जैसे सी # है?

+0

क्या आपने कुछ ऐसा करने के लिए वेब खोजा है जैसे ** java assert ** का उपयोग कर? आईडीईए के लिए, यदि आप /bin/idea.exe.vmoptions में देखते हैं तो आपको सबसे अधिक संभावना है कि यह 'डीबग' मोड में ही चलता है - यदि '-e' सेटिंग मौजूद है :) – gnat

+0

@gnat, हाँ, 'idea.exe.vmoptions' में '-ea' सेटिंग।लेकिन जब यह एक आर्टिफैक्ट (एक जार फ़ाइल) बनाता है, तब भी एक आर्टिफैक्ट के साथ 'डीबग' मोड में? – JatSing

+1

vmoptions फ़ाइल में, '-ea' प्रभाव करता है कि आईडीईए कैसे चलता है (यह एक जावा एप्लिकेशन है जिसे आप जानते हैं?) ** नहीं ** यह कोड बनाता है। जार के लिए, आप '-ea' को निर्दिष्ट या छोड़कर रनटाइम में अपना मोड प्रबंधित करते हैं। जैसा कि मैंने लिखा है, जावा आर्ट के लिए वेब पर खोज करें, – gnat

उत्तर

32
javac 
    -g       Generate all debugging info 
    -g:none     Generate no debugging info 
    -g:{lines,vars,source}  Generate only some debugging info 

आप संकलित कक्षाओं में डीबग प्रतीकों (यह डिफ़ॉल्ट है) या ऐसा नहीं करने के लिए चुन सकते हैं। ऐसा करने के लिए बहुत लाभ नहीं है। जार फ़ाइलें a little smaller होगी, लेकिन प्रदर्शन लाभ न्यूनतम (यदि कोई हो) है। इन प्रतीकों के बिना आपको अब स्टैक निशान में लाइन नंबर नहीं मिलते हैं। आपके पास additional symbols with local variable names शामिल करने का विकल्प भी है (डिफ़ॉल्ट रूप से केवल स्रोत फ़ाइल नाम और रेखा संख्याएं हैं)।

java 
    -ea[:<packagename>...|:<classname>] 
    -enableassertions[:<packagename>...|:<classname>] 
        enable assertions 

आप रन-टाइम (डिफ़ॉल्ट बंद है) पर भी दावा सक्षम कर सकते हैं, जो कभी-कभी विकास और परीक्षण के दौरान उपयोगी होता है। इसका प्रदर्शन प्रभाव पड़ता है (यदि प्रश्न में कोड वास्तव में दावाों का उपयोग करता है, जो मुझे लगता है कि uncommon है)।

इनमें से किसी भी सेटिंग के बावजूद, JVM हमेशा आपको डीबगर संलग्न करने की अनुमति देता है।

जावा में क्या सशर्त संकलन नहीं है जहां कुछ बाहरी सेटिंग के आधार पर पूरी तरह से अलग कोड संकलित किया जाएगा। आप जो निकटतम प्राप्त कर सकते हैं वह आपके कोड में कहीं भी public static final boolean DEBUG_BUILD = true; जैसा है और यदि विवरण में उपयोग किया जाता है। यह वास्तव में संकलक को कोड को बहिष्कृत कर देगा जो पहुंच योग्य नहीं हो सकता है, लेकिन आपको इसे निरंतर स्रोत कोड में सेट करना होगा।

+1

पर वैसे भी बहुत सारे ट्यूटोरियल हैं, वैसे भी 'सार्वजनिक स्थिर अंतिम बूलियन DEBUG_BUILD' को प्रीप्रोसेस में बनाने के लिए, सी # में '# ifdebug' जैसे कुछ? – JatSing

+3

@JatSing: सीधे नहीं। आपके पास कुछ प्रकार की स्क्रिप्ट हो सकती है जो संकलक शुरू करने से पहले मान अपडेट करती है। या हो सकता है कि एक Constants.java और उसके दो संस्करण हों, और उनमें से एक के लिए संकलन वर्गपथ स्थापित करें। लेकिन आधिकारिक टूलचेन में कुछ नहीं। – Thilo

4

आप विभिन्न चीजों में संकलन करने के लिए विभिन्न प्रकार के निर्माण के लिए पूछ रहे हैं। उदाहरण के लिए Debug.WriteLine और Console.WriteLine है।

"नहीं, जावा के पास उस कार्यक्षमता के लिए सटीक मिलान नहीं है। आप विभिन्न कार्यान्वयन कक्षाओं को इंजेक्ट करने के लिए पहलुओं का उपयोग कर सकते हैं या आईओसी कंटेनर का उपयोग कर सकते हैं।" निम्नलिखित प्रश्न से चुरा लिया: Conditional Java compilation

13

यह सब कुछ जारी करने के लिए जावा में सामान्य अभ्यास है एक तरह से जो डिबग किया जा सकता है (वहाँ तुम वहाँ के लिए अन्य अच्छा जवाब कर रहे हैं)। कुछ परियोजनाओं के लिए obfuscation की आवश्यकता है, वे एक रिलीज निर्माण हो सकता है, लेकिन मैंने इसे जावा विकसित करने के 12 वर्षों में कभी नहीं देखा है।

दावे और डीबग संदेशों जैसी चीजें आमतौर पर उत्पादन के उदाहरण के लिए रनटाइम पर बंद होती हैं लेकिन यदि आवश्यक हो तो भी किसी भी समय (गतिशील रूप से) चालू की जा सकती है।

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

जितना जावा कोड इस तरह लिखा गया है, जेआईटी मृत कोड को अनुकूलित करने में बहुत अच्छा है जिसे कभी नहीं कहा जाता है। इतने सारे कि आईएमएचओ माइक्रो-"बेंचमार्क" में से अधिकांश जहां जावा आउट सी ++ करता है, वह तब होता है जब बेंचमार्क कोई काम नहीं करता है और जेआईटी इसका पता लगाने में बेहतर होता है। आईएमएचओ, सी ++ मानता है कि डेवलपर पर्याप्त स्मार्ट है जो कोड लिखने के लिए पर्याप्त नहीं है जो कुछ भी नहीं करता है।

+1

"मैंने इसे जावा के विकास के 12 वर्षों में कभी नहीं देखा है"। मेरे लिए, यह आपके उत्तर का सबसे प्रासंगिक हिस्सा है, क्योंकि आप एचएफटी (!) के लिए जावा लिख ​​रहे हैं। क्या इसका मतलब यह है कि सभी डीबगिंग जानकारी को शामिल करने के लिए जावा कोड संकलित करना जेवीएम जेआईटी के साथ हस्तक्षेप नहीं करता है? मैं हाँ मानता हूं, लेकिन पुष्टि की तलाश करता हूं। – kevinarpe