2010-03-01 9 views
6

Je dois construire Javadoc à partir de myCode.jar qui contient à la fois des sources et des fichiers de classe. Puis-je le faire sans extraire le pot?Comment créer javadoc à partir de sources dans un fichier .jar?

Selon http://java.sun.com/j2se/1.5.0/docs/tooldocs/windows/javadoc.html#classpath je devrais être en mesure de le faire de cette façon: C:\>javadoc -d docs -classpath myCode.jar net\kem\jmx\CacheManagerMBean.java Cependant, je reçois l'erreur suivante:

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 

Il semble, javadoc ne peut pas trouver les fichiers source dans le pot. Je suis confiant que les sources sont là.

Des suggestions?

+0

Double Vérifiez que le fichier contient bien les fichiers source (ouvrez-le en tant que fichier zip fichier) Vous pouvez également essayer d'ajuster le net \ kem ... aux points au lieu de \ ou de le supprimer complètement – mikek3332002

Répondre

3

Certains premiers tests indiquent que cela ne fonctionne pas (au moins sur OpenJDK 1.6.0_20, que j'ai ici). Donc, j'ai regardé dans la source (navigable dans un mercurial web-interface). Javadoc (dans la version ici, qui peut différer de celle que j'ai ici) utilise un peu de Javac dans son pour l'opération, et il semble que les deux utilisent l'interface javax.tools.JavaFileManager pour implémenter l'accès à leurs fichiers source, en particulier dans le sous-interface StandardJavaFileManager.

This interface prétend être en mesure d'accéder à des entrées de fichier zip:

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

Mais ici comment il est utilisé (en 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     } 

Le premier cas s'appliquerait dans votre appel avec un .java fichier - mais comme il n'existe pas en tant que fichier dans le système de fichiers (new File(name).exists() renvoie false), cela n'aide pas, et vous obtenez à la place le troisième cas avec une erreur "fichier introuvable".

Il semble que cela pourrait fonctionner pour remplacer cette condition par un autre plus approprié (comme !fm.getJavaFileObjects(name).isEmpty() - à condition que le contexte est initialisé avec un JavaFileManager qui semble en fait dans un pot/fichiers zip, que je n'ai pas vérifié maintenant

.

Donc, vous devrez décompresser votre fichier jar source, ou patcher votre implémentation javac (de préférence en l'ajoutant à la source javac principale)