不积跬步,无以至千里

java文档生成之doclet


前几天想着写一个文档生成的工具,输入参数是待生成的接口类名和方法名,输出为按照指定模板生成的markdown文档。
既然是接口文档,不可缺少的就是注释了,所以我采取的方案是:注释说明部分通过文档解析,类的其他方法或域这些通过反射获得。那么既然是反射,不可避免的需要对类做编译,为了使用方便,我首先采用了动态编译的方案,无奈问题是对其中引入的jar包中的类,在做编译的时候会报找不到类的错,导致编译失败。最终采用的妥协方案是:把要生成的类文件拷贝到项目指定目录后生成。

以上解决方案依旧不太优雅,在尝试过各种方法之后,我决定换个方向来做这个文档生成的功能。了解到java的javadoc命令是可以自定义生成文档的格式的,于是对这部分做了个了解。

    1. 使用自定义类

首先,javadoc命令可以指定doclet类,使用方法如下: javadoc -doclet ${docletClass} -docletpath ${targetPath} *.java 这种方式只能生成public域,如果需要生成private域,需要在命令后添加-private.${docletClass}指自定义的doclet的全类名(包含包名),${targetPath}指项目生成class文件的路径名,在使用命令前,需要先对项目做build以生成class文件,另外*.java表示生成当前路径下的所有的类的文档,同时也可以指定要生成的类的类名。最后,需要进入到自定义doclet.java的路径下执行这个命令,否则会出现找不到类定义的错误。

    1. 自定义类

接下来就开始实现自己的自定义类了,在继承了com.sun.javadoc.Doclet之后,需要做的只剩下实现start方法了。在折腾了两个下午了解com.sun.javadoc包下的各个类的API之后,终于完成了对一个接口文档需要的信息的解析之后,在写入的时候再次遇到了问题:

  1. 我需要按照指定的模板来生成文档,因此需要引入第三方的jar包,然而在执行javadoc命令的时候报错,也就是无法自动加载第三方jar包
  2. 即使在命令行中手工引入指定jar包,为了解决我的第一方案中的问题,我需要将生成的doclet的class文件和java文件拷贝至待生成的目录下,然后通过java调用shell命令来执行javadoc命令,此又是一番功夫

所以这篇文档就是doclet从入门到放弃的过程。私下了解了也有其他自定义实现的java文档生成的方案,但考虑到移植的复杂度以及实现成本,研究也就点到为止了。。。