2010-03-01 12 views
6

Tôi phải xây dựng Javadoc từ myCode.jar chứa cả nguồn và tệp lớp. Tôi có thể làm điều đó mà không cần lấy bình không?Làm cách nào để xây dựng javadoc từ các nguồn trong tệp .jar?

Theo http://java.sun.com/j2se/1.5.0/docs/tooldocs/windows/javadoc.html#classpath tôi sẽ có thể làm như vậy theo cách này: C:\>javadoc -d docs -classpath myCode.jar net\kem\jmx\CacheManagerMBean.java Tuy nhiên, tôi nhận được lỗi sau:

javadoc: error - File not found: "net\kem\jmx\CacheManagerMBean.java" 
[search path for source files: [myCode.jar]] 
[search path for class files: [C:\Program Files\Java\jdk1.5.0_17\jre\lib\rt.jar, C:\Program Files\Java\jdk1.5.0_17\jre\lib\jsse.jar, 
C:\Program Files\Java\jdk1.5.0_17\jre\lib\jce.jar, C:\Program Files\Java\jdk1.5.0_17\jre\lib\charsets.jar, C:\Program Files\Java\jd 
k1.5.0_17\jre\lib\ext\dnsns.jar, C:\Program Files\Java\jdk1.5.0_17\jre\lib\ext\localedata.jar, C:\Program Files\Java\jdk1.5.0_17\jre 
\lib\ext\sunjce_provider.jar, C:\Program Files\Java\jdk1.5.0_17\jre\lib\ext\sunpkcs11.jar, C:\Projects\RenderClusterController\WebCo 
ntent\WEB-INF\lib\makoRenderJMX.jar]] 
[done in 360 ms] 
1 error 

Dường như, javadoc không thể tìm thấy các tập tin nguồn trong jar. Tôi tự tin rằng các nguồn đang có.

Mọi đề xuất?

+0

Kiểm tra kỹ xem bình chứa có chứa các tệp nguồn không (mở nó dưới dạng mã zip) file) Bạn cũng có thể muốn thử điều chỉnh net \ kem ... thành các dấu chấm thay vì \ hoặc loại bỏ nó hoàn toàn – mikek3332002

Trả lời

3

Một số thử nghiệm đầu tiên cho thấy nó không hoạt động (ít nhất là trên OpenJDK 1.6.0_20, mà tôi có ở đây).

Vì vậy, tôi đã xem xét nguồn (có thể xem trong mercurial web-interface). Javadoc (trong phiên bản ở đó, có thể khác với phiên bản tôi có ở đây) sử dụng một số bit của Javac trong hoạt động của nó, và có vẻ như cả hai đều đang sử dụng giao diện javax.tools.JavaFileManager để thực hiện quyền truy cập vào tệp nguồn của họ, cụ thể là trong subinterface StandardJavaFileManager.

This interface tuyên bố để có thể truy cập vào mục file zip:

This file manager creates file objects representing regular files, zip file entries, or entries in similar file system based containers.

Nhưng ở đây như thế nào nó được sử dụng (trong JavaDocTool.getRootDocImpl()):

148     String name = it.head; 
    149     if (!docClasses && name.endsWith(".java") && new File(name).exists()) { 
    150      JavaFileObject fo = fm.getJavaFileObjects(name).iterator().next(); 
    151      docenv.notice("main.Loading_source_file", name); 
    152      JCCompilationUnit tree = parse(fo); 
    153      classTrees.append(tree); 
    154     } else if (isValidPackageName(name)) { 
    155      names = names.append(name); 
    156     } else if (name.endsWith(".java")) { 
    157      docenv.error(null, "main.file_not_found", name); 
    158     } else { 
    159      docenv.error(null, "main.illegal_package_name", name); 
    160     } 

Các trường hợp đầu tiên sẽ được áp dụng trong cuộc gọi của bạn với một .java tệp - nhưng vì tệp này không tồn tại dưới dạng tệp trong hệ thống tệp (new File(name).exists() trả về false), điều này không có tác dụng và bạn thay vào đó là trường hợp thứ ba có lỗi "không tìm thấy tệp".

Có vẻ như nó có thể làm việc khi thay thế tình trạng này bằng một phù hợp hơn (như !fm.getJavaFileObjects(name).isEmpty() - cung cấp bối cảnh được khởi tạo với một JavaFileManager mà trên thực tế trông trong các tập tin jar/zip, mà tôi đã không kiểm tra tại

.

Vì vậy, bạn sẽ có hoặc để giải nén bình nguồn của bạn, hoặc vá thực hiện javac của bạn (tốt nhất là đóng góp này vào nguồn javac chính)