javadoc导出成word⽂档
更新说明:
    2021-10-14    增加⽂字说明,增加注意事项说明
刚刚上次弄完了⼀个坑爹的任务,这次我领导⼜给我⼀个让⼈脑⽠⼦疼的任务了。
基本上客户他在验收我们系统的时候,都会要求我们编写相关的⽂档,这次也不例外。
只是这次的客户要求我们给出接⼝⽂档。不仅是要整个controller的rest接⼝⽂档,还要给出service层的接⼝,连⼯具类都要有。这不是在为难我胖虎么。
想我⾟⾟苦苦给全部controller⽅法都加上了swagger注解,想我⾟⾟苦苦把整个项⽬全部⽅法都加上了完美的javadoc注释,想我关键代码都留了逻辑注释,
为什么还要我给你弄个word⽂档。
抱怨归抱怨,该⼲的活还是要⼲的,谁让这该死的钱真⾹。
但是要怎么弄呢?这是个很严重的问题,毕竟我的项⽬⽅法没⼀千都有⼀百,总不能⼀个个给他Ctrl C +
Ctrl V吧,那我的弄到何年何⽉。swagger的我可以⼯具导出成word⽂档,可是service层的呢?我的⼯具类呢?
有没有现成的⼯具呢?问下度娘,~~~~~~~~~成功摸鱼半天,毫⽆收获
那能不能像上次那样⽤正则⾃⼰搞呢?试⼀哈 ~~~~~~~~~~~~~ 成功摸鱼半天,失败了,有些代码的⽂档注释太坑爹了,⽅法内⽤⽂档注释,搞事情吧,怎么还有部分前⾯的*号都没了。
idea不是可以导出javadoc⽂档么?能不能导出word呢?试⼀哈 ~~~~~~~~~~~~成功摸鱼半天,毫⽆办法,不过我到了⼀个神奇的⽅法ls.ute(initAgrs); 有没有觉得很眼熟,没错,这就是jdk⾃⼰的javadoc⼯具。
先让我们来膜拜下前辈的⽂章:
原理其实很简单,javadoc 这个jdk的 tools.jar 中的包的类已经帮我们解析好了java⽂件,我们需要做的仅仅是重写⼀个Doclet,然后在它⾥⾯处理下javadoc给我弄好的RootDoc就⾏,剩下就只剩操作RootDoc它了。
先看下javadoc这个包先
其中我们将直接⽤到ls.javadoc.Main这个类
那我们需要做啥呢?最简单的就3步。
1、创建⼀个新项⽬。
2、写⼀个⾃⼰的Doclet类。
3、写个main⽅法,⾥⾯调⽤ls.ute()这个⽅法,传⼊参数
4、拿到数据后(也就是RootDoc对象),⾃⼰解析class类型、⽅法名、类名、⽅法注释、类注释、字段注释、参数注释............然后爱⽣成HTML、爱⽣成Word、爱⽣成Excel,随你们喜欢(可以在MyDoclet.start()⽅法⾥⾯编写导出功能)。
⼤概怎么⽤说完了,展⽰下我的⽣成后的效果吧,我没调样式,毕竟⽤poi操作word真的是难受
上代码:
项⽬结构:(⼀定要有tools.jar,他在你们jdk的lib⽬录⾥,另外POI操作word的相关包要导齐全,不然各种坑)
<project xmlns="/POM/4.0.0"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hongcheng</groupId>
<artifactId>javadoc_generator</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>javadoc_generator</name>
<url></url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
<mavenpiler.source>1.8</mavenpiler.source>
<mavenpiler.target>1.8</mavenpiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>4.0.0</version>
</dependency>
</dependencies>
</project>
ClassComment.java⽤来保存类数据的实体
package com.hongcheng.ity;
import java.util.List;
/**
* java类的相关信息
*/
public class ClassComment {
/** 类的全类名 */
private String className;
/** 类的简单类名 */
private String simpleClassName;
/** 类注释 */
private String classComment;
/** 字段相关信息 */
private List<FieldComment> fields;
/
** ⽅法相关信息 */
private List<MethodComment> methods;
public String getClassName() {
return className;
}
public String getSimpleClassName() {
return simpleClassName;
}
public String getClassComment() {
return classComment;
}
public List<FieldComment> getFields() {
return fields;
}
public List<MethodComment> getMethods() {
return methods;
}
public void setClassName(String className) {
this.className = className;
}
public void setSimpleClassName(String simpleClassName) {
this.simpleClassName = simpleClassName;
}
public void setClassComment(String classComment) {
this.classComment = classComment;
}
public void setFields(List<FieldComment> fields) {
this.fields = fields;
}
public void setMethods(List<MethodComment> methods) {
}
@Override
public String toString() {
return "{className: " + className + ", simpleClassName: " + simpleClassName + ", classComment: " + classComment                + ", fields: " + fields + ", methods: " + methods + "}";
}
}
FieldComment.java⽤来保存字段和参数的实体
package com.hongcheng.ity;
/**
* java类中字段的相关信息
*/
public class FieldComment {
/** 字段类型 */
private String clasz;
/** 类的简单类名 */
private String simpleClassName;
/** 字段注释 */
private String fieldComment;
/** 字段名 */
private String fieldName;
/** 默认值,必须是final修饰的基本数据类型及其包装类 */
private Object defaultValue;
public String getSimpleClassName() {
接口文档怎么看return simpleClassName;
}
public void setSimpleClassName(String simpleClassName) {
this.simpleClassName = simpleClassName;
}
public String getClasz() {
return clasz;
}
public String getFieldComment() {
return fieldComment;
}
public String getFieldName() {
return fieldName;
}
public Object getDefaultValue() {
return defaultValue;
}
public void setClasz(String clasz) {
this.clasz = clasz;
}
public void setFieldComment(String fieldComment) {
this.fieldComment = fieldComment;
}
public void setFieldName(String fieldName) {
this.fieldName = fieldName;
}
public void setDefaultValue(Object defaultValue) {
this.defaultValue = defaultValue;
}
@Override
public String toString() {
return "{clasz: " + clasz + ", simpleClassName: " + simpleClassName + ", fieldComment: " + fieldComment                + ", fieldName: " + fieldName + ", defaultValue: " + defaultValue + "}";
}
}
MethodComment.java⽤来保存⽅法数据的实体
package com.hongcheng.ity;
import java.util.List;
/**
* java类中⽅法的相关信息
*/
public class MethodComment {
/** ⽅法注释 */
private String methodComment;
/**  ⽅法名 */
private String methodName;
/
**  参数 */
private List<FieldComment> params;
/**  返回值 */
private FieldComment returnEntity;
public String getMethodComment() {
return methodComment;
}
public String getMethodName() {
return methodName;
}
public List<FieldComment> getParams() {
return params;
}
public FieldComment getReturnEntity() {
return returnEntity;
}
public void setMethodComment(String methodComment) {
}
public void setMethodName(String methodName) {
}
public void setParams(List<FieldComment> params) {
this.params = params;
}
public void setReturnEntity(FieldComment returnEntity) {
}
@Override
public String toString() {
return "{methodComment: " + methodComment + ", methodName: " + methodName + ", params: " + params                + ", returnEntity: " + returnEntity + "}";
}
}
MyDoclet.java很关键的类
package com.hongcheng.javadoc_generator;
import com.sun.javadoc.Doclet;
import com.sun.javadoc.RootDoc;
/**
*    ⽤来获取javadoc解析完成后⽣成的语法树根节点
* */
public class MyDoclet extends Doclet {
/**
*    静态对象,⽤于接收javadoc解析完成后⽣成的语法树根节点<br>
*    在后⾯我们会⽤他来获取我们需要的数据
* */
private static RootDoc root;
/**
*    在javadoc解析完java⽂件后,⽣成语法树,然后就会调⽤这个⽅法去让Doclet⽣成doc⽂档
* */
public static boolean start(RootDoc rootDoc) {
< = rootDoc;
return true;
}
/**
*    获取语法树的根节点
* */
public static RootDoc getRoot() {
return root;
}
}
Modifier.java⽤来处理下哪些⽅法和字段才是我们需要的
package com.hongcheng.javadoc_generator;
/**
*    可见性修饰符
* */
public enum Modifier{
PUBLIC,PROTECTED,PRIVATE;
}
RootClassParser.java⽤来解析RootDoc,转成我们⾃⼰的那三个实体类
package com.hongcheng.javadoc_generator;
import java.util.LinkedList;
import java.util.List;
import com.hongcheng.ity.ClassComment;
import com.hongcheng.ity.FieldComment;
import com.hongcheng.ity.MethodComment;
import com.sun.javadoc.ClassDoc;
import com.sun.javadoc.FieldDoc;
import com.sun.javadoc.MethodDoc;
import com.sun.javadoc.ParamTag;
import com.sun.javadoc.Parameter;
import com.sun.javadoc.RootDoc;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。