2012-10-04 14 views
9

मेरे पास अवधारण नीति = SOURCE की एनोटेशन के लिए एनोटेशन प्रोसेसर है।संकलन के दौरान एनोटेशन प्रोसेसर को डीबग कैसे करें?

मुझे नहीं पता कि इसे कैसे डिबग करना है।

  • मैं प्रिंट बयान जारी किया है, लकड़हारा जानकारी जब मैं mvn, स्थापित चला संकलन या पैकेज या चींटी javac, और मैं संकलन लॉग में उनके sysouts देखते हैं।

  • हालांकि, मुझे नहीं पता कि एक्लिप्स में प्रोसेसर को कैसे डिबग करना है। मेरा मतलब है, आप संकलन-समय को कैसे डिबग करते हैं?

उत्तर

5

आप ग्रहण से जावा कम्पाइलर आह्वान करने के लिए, एक डिबग विन्यास का उपयोग कर (यदि आप "डीबग विन्यास ..." मेनू विकल्प से मैन्युअल रूप से विन्यास बनाने के लिए, की आवश्यकता होगी।

" सही "तरीका जेडीके 1.6 या उससे ऊपर के तहत जावा कंपाइलर का आह्वान करने के लिए javax.tools में JavaCompiler इंटरफ़ेस का उपयोग करना है, जिसे आप ToolProvider से प्राप्त करते हैं (मैं सभी लिंक शामिल करता हूं क्योंकि आपको अच्छी तरह से कक्षा/पैकेज दस्तावेज पढ़ना चाहिए)।

"त्वरित और गंदा" तरीका ( काम करना चाहिए, लेकिन मुझे कोई गारंटी नहीं है) com.sun.tools.javac.Main.main() का आह्वान करना है, इसे अपने सामान्य कमांड लाइन तर्कों को पारित करना है। ऐसा करने के लिए, आपको अपने क्लासपाथ पर tools.jar की आवश्यकता होगी (यह $JAVA_HOME/lib में पाया गया है)।

+0

नमस्ते, इस उत्तर को स्वीकार करने के रूप में पढ़ना, मुझे लगता है कि यह समस्या का समाधान है। वैसे,, मुझे समझ में नहीं आ रहा है कि "डीबग कॉन्फ़िगरेशन का उपयोग करके ग्रहण से जावा कंपाइलर को क्या कहते हैं (आपको" डीबग कॉन्फ़िगरेशन "से मैन्युअल रूप से कॉन्फ़िगरेशन बनाना होगा। मतलब है। क्या आप बेहतर समझा सकते हैं? धन्यवाद – Apperside

+0

मैंने tools.jar और प्रोसेसर जार को एक मौजूदा प्रोजेक्ट में जोड़ा। फिर com.sun.tools.javac.Main क्लास का सुझाव दिया गया। क्लासपाथ में tools.jar के साथ जावा एप्लिकेशन डीबग कॉन्फ़िगरेशन बनाया गया, और जावैक तर्क कार्यक्रम तर्क। एक आकर्षण की तरह काम किया - धन्यवाद! – wbdarby

6

एक विकल्प हाल के दिनों में आदि

@Test public void testStuff() { 
    // Create a source file to process, or load one from disk. 
    JavaFileObject file = JavaFileObjects.fromSourceLines("test.Foo", 
    "package test;", 
    "", 
    "import bar.*;", 
    "", 
    "@MyAnnotation(blah=false)", 
    "interface TestInterface {", 
    " Bar someBar();", 
    "}", 

    // assert conditions following a compilation in the context of MyProcessor. 
    assert_().about(javaSource()).that(file) 
     .processedWith(new MyProcessor()) 
     .failsToCompile() 
     .withErrorContaining("some error message").in(file).onLine(5); 
} 

यह परीक्षण आप उम्मीद, http://github.com/google/compile-testing आप मनमाने ढंग से व्याख्या प्रोसेसर, आप ब्रेक अंक निर्धारित कर सकते हैं जिसके खिलाफ संकलन काम आह्वान की सुविधा देता है जो की तरह कुछ का उपयोग करने के माध्यम से कदम, है कुछ त्रुटि संदेश प्राप्त होगा क्योंकि परीक्षण डेटा स्रोत में @MyAnnotation गलत तरीके से घोषित किया गया है। यदि यह दावा विफल रहता है, तो आप इसे अपने आईडीई में डीबग मोड में चला सकते हैं, माइप्रोसेसर में ब्रेकपॉइंट सेट कर सकते हैं और डीबगिंग के दौरान सक्रिय एक पूर्ण कंपाइलर वातावरण के साथ कदम उठा सकते हैं।

इकाई परीक्षण के लिए विशिष्ट विधियों के भीतर अपने प्रोसेसर, आप भी @Rule CompilationRule जहाँ से आप एक और अधिक अलग-थलग तरीके से अपने संकलक में विशिष्ट तर्क का परीक्षण करने में तत्वों और प्रकार उपयोगिता वर्गों प्राप्त कर सकते हैं कहा जाता है का उपयोग कर सकते हैं।

2

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

Debugging an Annotation Processor in any project देखें।

अस्वीकरण: मैंने पोस्ट लिखा था।

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