2011-11-18 35 views
11

Tóm tắt:

tôi đã chạy vào một vấn đề thú vị, và tôi không hoàn toàn chắc chắn làm thế nào để Sleuth nó:Sử dụng trình biên dịch Eclipse thay vì kết quả javac trong vụ tai nạn javadoc

  • dự án chúng tôi đã được xây dựng tốt cho tháng
  • tôi đã thay đổi maven-compiler-plugin sử dụng trình biên dịch eclipse thay vì javac
  • Bây giờ khi tôi chạy mvn site, maven-javadoc-plugin không
  • Theo dấu vết ngăn xếp, có vẻ công cụ Javadoc đang gặp sự cố trên tệp lớp được tạo bởi trình biên dịch Eclipse

Có cách nào để sửa lỗi này không? Nếu không, có ít nhất cách nào để gỡ lỗi thêm không?

Chi tiết đầy đủ:

Tôi đang sử dụng Java 1.6.0_27 và Maven 3.0.2.

Tôi đã sử dụng trình biên dịch javac để xây dựng codebase của mình, nhưng tôi muốn thử trình biên dịch Eclipse, vì nó tạo ra cảnh báo tốt hơn nhiều (và có thể cấu hình theo nhiều cách khác).

Vì vậy, tôi đã thay đổi định nghĩa của maven-compiler-plugin trong pom.xml để:

<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> 

Trong phần <reporting> tôi, tôi có:

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

Cho đến nay, như vậy tốt. Tôi đã làm một mvn clean install và mọi thứ đều tốt đẹp, tất cả các bài kiểm tra đều trôi qua, và mọi thứ đều tuyệt vời.

Nhưng khi tôi cố gắng chạy mvn site, khi nó được báo cáo Javadoc, nó không thành công với những gì dường như là một tai nạn Javadoc:

[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 

Câu hỏi của tôi:

OK, vì vậy những gì đã thay đổi ? Tất cả trang Javadoc và Maven đều được xây dựng tốt khi tôi sử dụng javac, nhưng ngay sau khi tôi chuyển sang trình biên dịch Eclipse, Javadoc bị treo.

Tệ hơn nữa, nó thậm chí còn không cho tôi biết lớp nào gây ra sự cố, vì vậy tôi thậm chí không biết bắt đầu gỡ lỗi ở đâu.

Rõ ràng, trong thời gian này có nghĩa là tôi sẽ không sử dụng trình biên dịch Eclipse, và tôi sẽ gắn bó với javac. Nhưng tôi tò mò là lý do tại sao điều này đang xảy ra và những gì tôi có thể làm để khắc phục hoặc khắc phục sự cố.

+0

Đây là số lẻ. Có lẽ đó là một vấn đề "mặc định" --- bạn có thể chạy javac với các đối số rõ ràng không? – jayunit100

+0

@ jayunit100: Tôi thực sự không gọi javac chút nào. Dường như công cụ Javadoc đang sử dụng (phần của) javac trong nội bộ, nhưng theo như tôi biết tôi không kiểm soát được điều đó. (Nếu bạn biết một cách, bằng mọi cách, hãy đăng câu trả lời đó!) –

+0

Làm thế nào về việc sử dụng mvnDebug để tìm ra chuỗi ký tự nào đang bừa bộn? Điều đó có thể cho một số đầu mối. –

Trả lời

3

cuối cùng tôi đã có một số thời gian để nhìn vào điều này một lần nữa. Các maven-javadoc-plugin giúp đỡ một cách hữu ích để lại một kịch bản javadoc.bat dưới target/site/apidocs khi quá trình javadoc.exe không thành công và tôi có thể tìm thấy gói vi phạm bằng cách cắt tỉa danh sách trong tệp packages được chuyển vào javadoc.exe.

Điều thú vị là mã vấn đề hóa ra là nguồn Java được tạo bởi trình biên dịch Google Protocol Buffers. Điều này thật may mắn vì có thể chấp nhận đơn giản là loại trừ nguồn protobuf được tạo ra hoàn toàn khỏi Javadoc.

tôi đã thêm các định nghĩa sau đây, theo cả tôi <build><reporting> phần của POM, và điều này giải quyết vấn đề của tôi:

<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

Bạn đã sử dụng 'javadoc.bat' như thế nào để tìm các lớp vi phạm? –

+1

@ ThorbjørnRavnAndersen: Đó là những năm trước đây vì vậy tôi không nhớ chắc chắn. Nhưng tôi nghĩ rằng tôi đã làm một tìm kiếm nhị phân: cắt tỉa một nửa các gói và thử lại cho đến khi tôi tìm thấy các gói lỗi. –

2

Giải pháp cho việc này là tạo hồ sơ riêng cho mục tiêu trang web. Vì vậy, bạn có thể xác định các trình biên dịch khác nhau cho các mục tiêu khác nhau.

+0

Ý tưởng thú vị! Nhưng tôi không chắc chắn rằng nó sẽ làm việc tốt - công cụ Javadoc đã được hardcoded để sử dụng trình biên dịch 'javac'. Tôi cho rằng chúng ta sẽ phải luôn luôn sử dụng 'mvn clean site' để chắc chắn rằng chúng ta không có bất kỳ tệp' .class' còn sót lại nào từ trình biên dịch khác. –

+0

Đây không phải là một vấn đề, trừ khi bạn đang xây dựng một dự án thực sự lớn trên một máy tính thực sự cũ. – WeMakeSoftware

0

Đây có thể không phải là câu trả lời nhưng chỉ đề xuất ý tưởng.

Cách cài đặt JDK trong thư mục không có dấu cách (tôi thấy nó là C: \ Program Files (x86) ...).Java hỗ trợ không gian trong tên tệp, nhưng có lẽ một số plugin/công cụ/thư viện mà các công cụ javadoc không hỗ trợ nó.

+0

Ý tưởng thú vị, nhưng tôi không nghĩ đó là vấn đề, bởi vì tất cả javadoc đã được tạo ra tốt trước khi tôi chuyển sang trình biên dịch Eclipse. –

1

Có thể javadoc.exe không sử dụng cùng một JRE mà Eclipse sử dụng. Có bất kỳ JRE nào khác được cài đặt không? Hãy thử chạy quá trình javadoc.exe theo cách thủ công và xem nó có làm điều tương tự không, bạn có thể nhận được stacktrace thực sự của vấn đề.

0

Im đoán rằng vấn đề là javac đó và che khuất đang sử dụng phiên bản JDK khác nhau để biên dịch mã của bạn

+1

Trình biên dịch Eclipse (ecj) không sử dụng JDK chút nào, nó là một triển khai hoàn toàn riêng biệt. Tất cả những gì nó sử dụng là JRE. –

Các vấn đề liên quan