刚刚上次弄完了一个坑爹的任务,这次我领导又给我一个让人脑瓜子疼的任务了。
基本上客户他在验收我们系统的时候,都会要求我们编写相关的文档,这次也不例外。
只是这次的客户要求我们给出接口文档。不仅是要整个controller的rest接口文档,还要给出service层的接口,连工具类都要有。这不是在为难我胖虎么。
想我辛辛苦苦给全部controller方法都加上了swagger注解,想我辛辛苦苦把整个项目全部方法都加上了完美的javadoc注释,想我关键代码都留了逻辑注释,
为什么还要我给你弄个word文档。
抱怨归抱怨,该干的活还是要干的,谁让这该死的钱真香。
但是要怎么弄呢?这是个很严重的问题,毕竟我的项目方法没一千都有一百,总不能一个个给他Ctrl C + Ctrl V吧,那我的弄到何年何月。
swagger的我可以找工具导出成word文档,可是service层的呢?我的工具类呢?
有没有现成的工具呢?问下度娘,~~~~~~~~~成功摸鱼半天,毫无收获
那能不能像上次那样用正则自己搞呢?试一哈 ~~~~~~~~~~~~~ 成功摸鱼半天,失败了,有些代码的文档注释太坑爹了,方法内用文档注释,搞事情吧,怎么还有部分前面的*号都没了。
idea不是可以导出javadoc文档么?能不能导出word呢?试一哈 ~~~~~~~~~~~~成功摸鱼半天,毫无办法,不过我找到了一个神奇的方法com.sun.tools.javadoc.Main.execute(initAgrs); 有没有觉得很眼熟,没错,这就是jdk自己的javadoc工具。
先让我们来膜拜下前辈的文章:
https://blog.csdn.net/10km/article/details/78252586
原理其实很简单,javadoc 这个jdk的 tools.jar 中的包的类已经帮我们解析好了java文件,我们需要做的仅仅是重写一个Doclet,然后在它里面处理下javadoc给我弄好的RootDoc就行,剩下就只剩操作RootDoc它了。
先看下javadoc这个包先
其中我们将直接用到com.sun.tools.javadoc.Main这个类
那我们需要做啥呢?最简单的就3步。
1、调用com.sun.tools.javadoc.Main.execute()这个方法,传入参数
2、写一个自己的Doclet类。
3、拿到数据后,自己解析class类型、方法名、类名、方法注释、类注释、字段注释、参数注释............然后爱生成HTML、爱生成Word、爱生成Excel,随你们喜欢。
大概怎么用说完了,展示下我的生成后的效果吧,我没调样式,毕竟用poi操作word真的是难受
上代码:
项目结构:(一定要有tools.jar,他在你们jdk的lib目录里,另外POI操作word的相关包要导齐全,不然各种坑)
pom.xml主要就是为了引入POI的包
4.0.0
com.hongcheng
javadoc_generator
0.0.1-SNAPSHOT
jar
javadoc_generator
http://maven.apache.org
UTF-8
1.8
1.8
1.8
org.apache.poi
poi-ooxml
4.0.0
org.apache.poi
poi-scratchpad
4.0.0
ClassComment.java用来保存类数据的实体
packagecom.hongcheng.javadoc_generator.entity;importjava.util.List;/*** java类的相关信息*/
public classClassComment {/**类的全类名*/
privateString className;/**类的简单类名*/
privateString simpleClassName;/**类注释*/
privateString classComment;/**字段相关信息*/
private Listfields;/**方法相关信息*/
private Listmethods;publicString getClassName() {returnclassName;
}publicString getSimpleClassName() {returnsimpleClassName;
}publicString getClassComment() {returnclassComment;
}public ListgetFields() {returnfields;
}public ListgetMethods() {returnmethods;
}public voidsetClassName(String className) {this.className =className;
}public voidsetSimpleClassName(String simpleClassName) {this.simpleClassName =simpleClassName;
}public voidsetClassComment(String classComment) {this.classComment =classComment;
}public void setFields(Listfields) {this.fields =fields;
}public void setMethods(Listmethods) {this.methods =methods;
}
@OverridepublicString toString() {return "{className: " + className + ", simpleClassName: " + simpleClassName + ", classComment: " +classComment+ ", fields: " + fields + ", methods: " + methods + "}";
}
}
FieldComment.java用来保存字段和参数的实体
packagecom.hongcheng.javadoc_generator.entity;/*** java类中字段的相关信息*/
public classFieldComment {/**字段类型*/
privateString clasz;/**类的简单类名*/
privateString simpleClassName;/**字段注释*/
privateString fieldComment;/**字段名*/
privateString fieldName;/**默认值,必须是final修饰的基本数据类型及其包装类*/
privateObject defaultValue;publicString getSimpleClassName() {returnsimpleClassName;
}public voidsetSimpleClassName(String simpleClassName) {this.simpleClassName =simpleClassName;
}publicString getClasz() {returnclasz;
}publicString getFieldComment() {returnfieldComment;
}publicString getFieldName() {returnfieldName;
}publicObject getDefaultValue() {returndefaultValue;
}public voidsetClasz(String clasz) {this.clasz =clasz;
}public voidsetFieldComment(String fieldComment) {this.fieldComment =fieldComment;
}public voidsetFieldName(String fieldName) {this.fieldName =fieldName;
}public voidsetDefaultValue(Object defaultValue) {this.defaultValue =defaultValue;
}
@OverridepublicString toString() {return "{clasz: " + clasz + ", simpleClassName: " + simpleClassName + ", fieldComment: " +fieldComment+ ", fieldName: " + fieldName + ", defaultValue: " + defaultValue + "}";
}
}
MethodComment.java用来保存方法数据的实体
packagecom.hongcheng.javadoc_generator.entity;importjava.util.List;/*** java类中方法的相关信息*/
public classMethodComment {/**方法注释*/
privateString methodComment;/**方法名*/
privateString methodName;/**参数*/
private Listparams;/**返回值*/
privateFieldComment returnEntity;publicString getMethodComment() {returnmethodComment;
}publicString getMethodName() {returnmethodName;
}public ListgetParams() {returnparams;
}publicFieldComment getReturnEntity() {returnreturnEntity;
}public voidsetMetho