2011-11-18 8 views
11

सारांश:

मैं एक दिलचस्प समस्या हुई है, और मैं काफी यकीन है कि यह कैसे के लिए खोजी कुत्ता नहीं कर रहा हूँ:का उपयोग ग्रहण जावाडोक दुर्घटना में javac परिणाम के बजाय संकलक

  • हमारी परियोजना किया गया है महीने के लिए इमारत ठीक
  • मैं maven-compiler-plugin बदल गया जब मैं mvn site चलाने अब javac
  • के बजाय eclipse संकलक उपयोग करने के लिए, maven-javadoc-plugin विफल रहता है
  • स्टैक ट्रेस के अनुसार, ऐसा लगता है जावाडोक उपकरण ग्रहण संकलक

द्वारा बनाई गई एक वर्ग फ़ाइल पर क्रैश हो रहा है तो इसे ठीक करने कोई तरीका है? यदि नहीं, तो क्या इसे कम से कम डीबग करने का कोई तरीका है?

पूर्ण विवरण:

मैं जावा 1.6.0_27 और Maven 3.0.2 का उपयोग कर रहा हूँ।

मैं अपने कोडबेस बनाने के लिए जावैक कंपाइलर का उपयोग कर रहा हूं, लेकिन मुझे एक्लिप्स कंपाइलर को आजमाने में दिलचस्पी है, क्योंकि यह बहुत बेहतर चेतावनियां उत्पन्न करता है (और अन्य तरीकों से अधिक विन्यास योग्य है)।

तो मैं करने के लिए pom.xml में maven-compiler-plugin की परिभाषा ही बदल:

<plugin> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <version>2.3.2</version> 
    <configuration> 
     <compilerId>eclipse</compilerId> 
     <source>1.6</source> 
     <target>1.6</target> 
     <compilerArgument>-warn:+boxing,enumSwitch,javadoc,hashCode</compilerArgument> 
     <showWarnings>true</showWarnings> 
     <showDeprecation>true</showDeprecation> 
    </configuration> 
    <dependencies> 
     <dependency> 
      <groupId>org.codehaus.plexus</groupId> 
      <artifactId>plexus-compiler-eclipse</artifactId> 
      <version>1.8.2</version> 
     </dependency> 
    </dependencies> 
</plugin> 

मेरी <reporting> अनुभाग में, मेरे पास है:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-javadoc-plugin</artifactId> 
    <version>2.8</version> 
</plugin> 

अब तक तो अच्छा। मैंने mvn clean install किया और सब कुछ ठीक बनाता है, सभी परीक्षण पास होते हैं, और सबकुछ बढ़िया दिखता है।

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-site-plugin:3.0:site (default-site) on project framework: Error during page generation: Error rendering Maven report: 
[ERROR] Exit code: 1 - java.lang.StringIndexOutOfBoundsException: String index out of range: -15 
[ERROR] at java.lang.String.substring(String.java:1937) 
[ERROR] at java.lang.String.substring(String.java:1904) 
[ERROR] at com.sun.tools.javac.jvm.ClassReader.simpleBinaryName(ClassReader.java:958) 
[ERROR] at com.sun.tools.javac.jvm.ClassReader.readEnclosingMethodAttr(ClassReader.java:930) 
[ERROR] at com.sun.tools.javac.jvm.ClassReader.readMemberAttr(ClassReader.java:909) 
[ERROR] at com.sun.tools.javac.jvm.ClassReader.readClassAttr(ClassReader.java:1053) 
[ERROR] at com.sun.tools.javac.jvm.ClassReader.readClassAttrs(ClassReader.java:1067) 
[ERROR] at com.sun.tools.javac.jvm.ClassReader.readClass(ClassReader.java:1560) 
[ERROR] at com.sun.tools.javac.jvm.ClassReader.readClassFile(ClassReader.java:1658) 
[ERROR] at com.sun.tools.javac.jvm.ClassReader.fillIn(ClassReader.java:1845) 
[ERROR] at com.sun.tools.javac.jvm.ClassReader.complete(ClassReader.java:1777) 
[ERROR] at com.sun.tools.javac.code.Symbol.complete(Symbol.java:386) 
[ERROR] at com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:763) 
[ERROR] at com.sun.tools.javac.code.Symbol$ClassSymbol.flags(Symbol.java:695) 
[ERROR] at com.sun.tools.javadoc.ClassDocImpl.getFlags(ClassDocImpl.java:105) 
[ERROR] at com.sun.tools.javadoc.ClassDocImpl.isAnnotationType(ClassDocImpl.java:116) 
[ERROR] at com.sun.tools.javadoc.DocEnv.isAnnotationType(DocEnv.java:574) 
[ERROR] at com.sun.tools.javadoc.DocEnv.getClassDoc(DocEnv.java:546) 
[ERROR] at com.sun.tools.javadoc.PackageDocImpl.getClasses(PackageDocImpl.java:154) 
[ERROR] at com.sun.tools.javadoc.PackageDocImpl.addAllClassesTo(PackageDocImpl.java:170) 
[ERROR] at com.sun.tools.javadoc.RootDocImpl.classes(RootDocImpl.java:178) 
[ERROR] at com.sun.tools.doclets.internal.toolkit.AbstractDoclet.startGeneration(AbstractDoclet.java:96) 
[ERROR] at com.sun.tools.doclets.internal.toolkit.AbstractDoclet.start(AbstractDoclet.java:64) 
[ERROR] at com.sun.tools.doclets.formats.html.HtmlDoclet.start(HtmlDoclet.java:42) 
[ERROR] at com.sun.tools.doclets.standard.Standard.start(Standard.java:23) 
[ERROR] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
[ERROR] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
[ERROR] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
[ERROR] at java.lang.reflect.Method.invoke(Method.java:597) 
[ERROR] at com.sun.tools.javadoc.DocletInvoker.invoke(DocletInvoker.java:269) 
[ERROR] at com.sun.tools.javadoc.DocletInvoker.start(DocletInvoker.java:143) 
[ERROR] at com.sun.tools.javadoc.Start.parseAndExecute(Start.java:340) 
[ERROR] at com.sun.tools.javadoc.Start.begin(Start.java:128) 
[ERROR] at com.sun.tools.javadoc.Main.execute(Main.java:41) 
[ERROR] at com.sun.tools.javadoc.Main.main(Main.java:31) 
[ERROR] 
[ERROR] Command line was: "C:\Program Files (x86)\Java\jdk1.6.0_27\jre\..\bin\javadoc.exe" @options @packages 
[ERROR] 
[ERROR] Refer to the generated Javadoc files in 'C:\Projects\SMF\framework\target\site\apidocs' dir. 
[ERROR] -> [Help 1] 
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. 
[ERROR] Re-run Maven using the -X switch to enable full debug logging. 
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles: 
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException 

मेरे प्रश्न::

ठीक है, तो क्या बदल

लेकिन जब मैं mvn site को चलाने के लिए, जब यह जावाडोक रिपोर्ट के हो जाता है की कोशिश, यह क्या एक जावाडोक दुर्घटना प्रतीत होता है के साथ विफल ? जब मैं जावैक का उपयोग कर रहा था तब सभी जावाडोक और मेवेन साइट ठीक ठीक से निर्माण कर रहे थे, लेकिन जैसे ही मैंने ग्रहण कंपाइलर पर स्विच किया, जावाडोक दुर्घटनाग्रस्त हो गया।

इससे भी बदतर, यह मुझे यह भी नहीं बताता कि किस वर्ग ने इसे दुर्घटनाग्रस्त कर दिया है, इसलिए मुझे यह भी नहीं पता कि यह कहां से डिबग करना शुरू करें।

जाहिर है, इस समय के लिए इसका मतलब है कि मैं ग्रहण कंपाइलर का उपयोग नहीं कर रहा हूं, और मैं इसके बजाय जावैक के साथ चिपकने जा रहा हूं। लेकिन मैं के लिए उत्सुक हूं क्यों यह हो रहा है, और मैं इसे ठीक करने या उसके आसपास काम करने के लिए संभवतः क्या कर सकता हूं।

+0

यह अजीब है। हो सकता है कि यह एक "डिफ़ॉल्ट" मुद्दा --- क्या आप स्पष्ट तर्कों के साथ जावैक चला सकते हैं? – jayunit100

+0

@ jayunit100: मैं वास्तव में जावैक का आह्वान नहीं कर रहा हूं। ऐसा लगता है जैसे जावाडोक उपकरण आंतरिक रूप से जावैक (भागों) का उपयोग कर रहा है, लेकिन जहां तक ​​मुझे पता है कि मेरे पास इसका कोई नियंत्रण नहीं है। (यदि आप किसी भी तरह से जानते हैं, तो हर तरह से, कृपया इसे उत्तर के रूप में पोस्ट करें!) –

+0

mvnDebug का उपयोग करने के बारे में यह जानने के लिए कि यह किस स्ट्रिंग पर चल रहा है? यह कुछ सुराग दे सकता है। –

उत्तर

3

मैं अंत में कुछ समय के इस में फिर से देखने के लिए मिल गया संकलन के लिए अलग JDK संस्करणों का उपयोग कर रहे हैं। maven-javadoc-plugin स्क्रिप्ट के तहत स्क्रिप्ट के पीछे मददगार रूप से छोड़ देता है जब javadoc.exe प्रक्रिया विफल हो जाती है, और javadoc.exe में पारित होने वाली packages फ़ाइल में सूची को छीनकर आप अपमानजनक पैकेज ढूंढने में सक्षम थे।

दिलचस्प बात यह है कि समस्याग्रस्त कोड Google Protocol Buffers संकलक द्वारा उत्पन्न जावा स्रोत बन गया। यह भाग्यशाली था, क्योंकि पूरी तरह से जावडोक से प्रोटोबफ-जेनरेट किए गए स्रोत को बाहर निकालना स्वीकार्य है।

मैं निम्नलिखित परिभाषा जोड़ा, पोम के दोनों मेरी <build> और <reporting> वर्गों के तहत, और यह मेरी समस्या का समाधान:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-javadoc-plugin</artifactId> 
    <version>2.6.1</version> 
    <configuration> 
     <excludePackageNames>com.mycompany.myproject.proto</excludePackageNames> 
    </configuration> 
</plugin> 
+0

आपत्तिजनक वर्गों को खोजने के लिए आपने 'javadoc.bat' का उपयोग कैसे किया? –

+1

@ ThorbjørnRavnAndersen: यह कई साल पहले है इसलिए मुझे निश्चित रूप से याद नहीं है। लेकिन मुझे लगता है कि मैंने एक द्विआधारी खोज की है: पैकेजों का आधा हिस्सा छीन लिया और जब तक मुझे पैकेज में गलती नहीं मिली तब तक पुनः प्रयास किया गया। –

2

इसके लिए वर्कअराउंड साइट लक्ष्य के लिए एक अलग प्रोफ़ाइल बनाना होगा। ताकि आप विभिन्न लक्ष्यों के लिए अलग-अलग कंपाइलरों को परिभाषित कर सकें।

+0

दिलचस्प विचार! लेकिन मुझे यकीन नहीं है कि यह अच्छी तरह से काम करेगा - जावाडोक उपकरण पहले से ही 'जावैक' कंपाइलर का उपयोग करने के लिए हार्डकोड किया गया है। मुझे लगता है कि हमें यह सुनिश्चित करने के लिए हमेशा 'एमवीएन क्लीन साइट' का उपयोग करना होगा कि हमारे पास अन्य कंपाइलर से कोई बचे हुए '.class' फ़ाइलें नहीं हैं। –

+0

यह तब तक कोई समस्या नहीं होनी चाहिए जब तक आप वास्तव में पुराने पीसी पर एक बहुत बड़ी परियोजना नहीं बना रहे हों। – WeMakeSoftware

0

यह कोई जवाब नहीं हो सकता है, लेकिन केवल एक विचार प्रस्तावित करें।

अंतरिक्ष के बिना फ़ोल्डर में जेडीके स्थापित करने के बारे में (मैंने देखा कि यह सी: \ प्रोग्राम फ़ाइलें (x86) ...) है।जावा फ़ाइल नामों में रिक्त स्थान का समर्थन करता है, लेकिन शायद कुछ प्लगइन्स/टूल/लाइब्रेरी जो जावाडोक टूल्स बस इसका समर्थन नहीं करते हैं।

+0

दिलचस्प विचार, लेकिन मुझे नहीं लगता कि यह समस्या है, क्योंकि ग्रहण कंपाइलर पर स्विच करने से पहले सभी जावाडोक ठीक से उत्पन्न हो रहे थे। –

1

शायद javadoc.exe उसी जेआरई का उपयोग नहीं कर रहा है जो ग्रहण का उपयोग करता है। क्या उनके किसी भी अन्य जेआरई स्थापित हैं? Javadoc.exe प्रक्रिया को मैन्युअल रूप से चलाने का प्रयास करें और देखें कि यह वही काम करता है, तो आपको समस्या का वास्तविक स्टैकट्रैक मिल सकता है।

0

इम अनुमान लगा कि समस्या यह है कि javac है और ग्रहण अपने कोड

+1

ग्रहण कंपाइलर (ecj) जेडीके का बिल्कुल उपयोग नहीं करता है, यह एक पूरी तरह से अलग कार्यान्वयन है। यह सब जेआरई का उपयोग करता है। –

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