시소당
javadoc Doclet 구현 하기....
Doclet은 javadoc 툴의 내용과 출력 형식을 기술하기위하여 Doclet API를 사용하는 자바 프로그램입니다. 디폴트로 javadoc 툴은 HTML 형식의 API 문서를 생성하기 위하여 Sun에서 제공하는 표준 doclet을 사용합니다.
그러나 필요에 따라 javadoc 출력을 변경하기위하여 커스터마이징 된 docket을 제공할 수도 있습니다.
Docket은 Doclet API를 이용하여 Doclet을 새로 구현하거나 기존에 작성된 doclet을 요구에 따라 수정하여 구현 할 수도 있습니다.
doclet API 클래스는 JDK 설치 디렉터리의 lib/tools.jar 파일에 포함되어 있습니다. 따라서 Doclet 컴파일 시에는 tools.jar이 CLASSPATH 환경 변수에 추가하거나 javac 명령행의 -classpath 옵션을 이용할 수 있습니다.
Doclet 구현 순서:
1. import com.sun.javadoc.*
2. extends Doclet
3. public static boolean start(RootDoc root) 메소드 구현
4. Doclet 컴파일
컴파일 시에는 lib/tools.jar가 클래스 패스에 설정되어 있어야
합니다.
5. -doclet startingclass 옵션으로 javadoc 툴 실행
예) javadoc -doclet ListClass -docletpath . MyClass.java
Doclet Class :
public abstract class Doclet
extends Object
{
/** Doclet이 지원하는 자바언어 버젼을 리턴합니다. */
static LanguageVersion languageVersion();
/** 옵션 인자의 갯수를 길이를 체크합니다.
* javadoc 툴은 optionLength에서 체크되지않은 옵션이 있을 경우 에러를 출력합니다.
* 리턴값은 옵션 이름을 포함한 옵션인자의 갯수입니다.
*
* javadoc에서 사용자 정의 인자를 추가 할 경우 구현 해야합니다.
*/
static int optionLength(String option);
/** javadoc 문서를 생성하는 메소드 : 대부분의 경우 start 메소드만 구현합니다. */
static boolean start(RootDoc root);
/** 옵션이 유효한지를 검증합니다. 옵션을 처리하는 코드를 작성하면 됩니다.
* javadoc에서 사용자 정의 인자를 추가 할 경우 구현 해야합니다.
*/
static boolean validOptions(String[][] options, DocErrorReporter reporter)
}
예제 소스 : SimpleDoclet
예제는 클래스 정보와 주석들을 간단한 택스트 파일로 출력합니다.
import java.io.File;
import java.io.FileWriter;
import java.util.Arrays;
import com.sun.javadoc.ClassDoc;
import com.sun.javadoc.ConstructorDoc;
import com.sun.javadoc.Doclet;
import com.sun.javadoc.FieldDoc;
import com.sun.javadoc.MethodDoc;
import com.sun.javadoc.RootDoc;
import com.sun.javadoc.Type;
/**
* 사용자정의 Doclet 셈플 코드
*/
public class SimpleDoclet extends Doclet
{
/**
* start메소드는 시작 메소드로 RootDoc 객체를 인자로 받아 JavaDoc 문서를 생성한다.
* RootDoc 클래스는 javadoc 실행시 모든 정보(패키지, 클래스, 메소드, etc)를
* 포함합니다.
*
* @return true 성공
* @return false 실패
*/
public static boolean start(RootDoc root)
{
FileWriter fwriter_ = null;
try
{
File file_ = new File("C:\\test.txt");
if(file_.exists()) file_.delete();
fwriter_ = new FileWriter(file_);
// RootDoc으로부터 클래스들을 얻어와서 각 클래스 별로 축력합니다.
ClassDoc[] classes = root.classes();
StringBuffer sb = new StringBuffer();
sb.append("\n---------------------------------------------------------\n");
sb.append(" Java Doc 출력 시작\n");
for (int i = 0; i < classes.length; ++i)
{
sb.append("\n---------------------------------------------------------\n");
ClassDoc cd = classes[i];
sb.append( printName(cd) );
sb.append( printFields(cd.fields()) );
sb.append( printConstructors(cd.constructors()) );
sb.append( printMethods(cd.methods()) );
}
fwriter_.write(sb.toString());
fwriter_.flush();
fwriter_.close();
}
catch(Exception e)
{
e.printStackTrace();
}
return true;
}
/**
* 클래스 명을 출력한다.
*
* @param cd 클래스 정보를 포함하는 ClassDoc 객체
*/
static String printName(ClassDoc cd)
{
StringBuffer sb_ = new StringBuffer("");
sb_.append("0. Class Information\n");
sb_.append("\tClass Name : " + cd.typeName());
sb_.append("\n");
sb_.append("\tModifier : " + cd.modifiers());
sb_.append("\n");
sb_.append("\tInterface or Class ? : " + (cd.isClass() ? " class " : " interface "));
sb_.append("\n");
sb_.append("\tClass Comment : " +cd.commentText());
sb_.append("\n");
return sb_.toString();
}
/**
* 클래스 맴버 변수 정보를 출력한다.
*
* @param fields 맴버 변수 정보를 포함하는 FieldDoc 객체
*/
static String printFields(FieldDoc fields[])
{
StringBuffer sb_ = new StringBuffer("");
sb_.append("\n2. Fields Detail");
sb_.append("\n");
if (fields.length > 0)
{
Arrays.sort(fields);
}
for (int i=0, n=fields.length; i<n; i++)
{
if(fields[i].commentText().length() > 0)
{
Type type = fields[i].type();
sb_.append("\tField Name : " + fields[i].name());
sb_.append("\n");
sb_.append("\tModifier : " + fields[i].modifiers());
sb_.append("\n");
sb_.append("\tType : " + type.qualifiedTypeName());
sb_.append("\n");
sb_.append("\tField Comment : " + fields[i].commentText());
sb_.append("\n\n");
}
}
return sb_.toString();
}
/**
* 생성자를 출력한다.
*
* @param cons 생성자 정보를 포함하는 ConstructorDoc 객체
*/
static String printConstructors(ConstructorDoc cons[])
{
StringBuffer sb_ = new StringBuffer("");
if (cons.length > 0)
{
sb_.append("\n1. Constructors Info\n");
Arrays.sort(cons);
}
for (int i=0, n=cons.length; i<n; i++)
{
if(cons[i].commentText().length() > 0)
{
sb_.append("\tMethod Name : " + cons[i].name());
sb_.append("\n");
sb_.append("\tModifier : " + cons[i].modifiers());
sb_.append("\n");
sb_.append("\tFlat Signature : " + cons[i].flatSignature());
sb_.append("\n");
sb_.append("\tMethod Comment : " + cons[i].commentText());
sb_.append("\n\n");
}
}
return sb_.toString();
}
/**
* 메소드 정보를 출력한다.
*
* @param methods 메소드 정보를 포함하는 MethodDoc 객체
*/
static String printMethods(MethodDoc methods[])
{
StringBuffer sb_ = new StringBuffer("");
if (methods.length > 0)
{
sb_.append("\n3. Methods Detail");
Arrays.sort(methods);
}
for (int i=0, n=methods.length; i<n; i++)
{
if(methods[i].commentText().length() > 0)
{
Type type = methods[i].returnType();
sb_.append("\tMethod Name : " + methods[i].name());
sb_.append("\n");
sb_.append("\tReturn Type : " + type.qualifiedTypeName());
sb_.append("\n");
sb_.append("\tModifier : " + methods[i].modifiers());
sb_.append("\n");
sb_.append("\tFlat Signature : " + methods[i].flatSignature());
sb_.append("\n");
sb_.append("\tMethod Comment : " + methods[i].commentText());
sb_.append("\n\n");
}
}
return sb_.toString();
}
public static void main(String[] args)
{
// 출력 디렉터리 생성
File htmlDirectory_ = new File("com/ymtech/examples/javadoc/html");
if(!htmlDirectory_.exists())
htmlDirectory_.mkdirs();
// 참조 : How do I run Javadoc from within a Java application?
// http://java.sun.com/j2se/javadoc/faq/index.html
com.sun.tools.javadoc.Main.execute("Sample Doclet",
"lim.ho.sun.tools.SimpleDoclet",
new String[] {"-private", "Friend.java"});
}
}
예제 소스 : SimpleDoclet
테스트 용 클래스 소스로 javadoc 입력 파일로 사용됩니다.
/**
* JavaDoc Doclet 태스트용 Friend 클래스 입니다.
* @author hslim
*
*/
public class Friend
{
/** 이름 */
private String name;
/** 생일 */
private String birthDay;
/**
* Friend 클래스 생성자 입니다.
*/
public Friend(){}
/**
* 이름을 리턴 합니다.
* @return 이름
*/
public String getName(){return "Hosun Lim";}
/**
* 생일을 리턴 합니다.
* @return 생일
*/
public String getBirthDay(){return "1972-5-22";}
/**
* 이름을 설정 합니다.
* @return 이름
*/
public void setName(String name){this.name = name;}
/**
* 생일을 설정 합니다.
* @return 생일
*/
public void setBirthDay(String birthDay){this.birthDay = birthDay;}
}
실행 콘솔 출력 :
Loading source file lim/ho/sun/tools/Friend.java...
Constructing Javadoc information...
실행 결과 파일 내용 :
-----------------------------------------------------------
Java Doc 출력 시작
-----------------------------------------------------------
0. Class Information
Class Name : Friend
Modifier : public
Interface or Class ? : class
Class Comment : JavaDoc Doclet 태스트용 Friend 클래스 입니다.
2. Fields Detail
Field Name : birthDay
Modifier : private
Type : java.lang.String
Field Comment : 생일
Field Name : name
Modifier : private
Type : java.lang.String
Field Comment : 이름
1. Constructors Info
Method Name : Friend
Modifier : public
Flat Signature : ()
Method Comment : Friend 클래스 생성자 입니다.
3. Methods Detail Method Name : getBirthDay
Return Type : java.lang.String
Modifier : public
Flat Signature : ()
Method Comment : 생일을 리턴 합니다.
Method Name : getName
Return Type : java.lang.String
Modifier : public
Flat Signature : ()
Method Comment : 이름을 리턴 합니다.
Method Name : setBirthDay
Return Type : void
Modifier : public
Flat Signature : (String)
Method Comment : 생일을 설정 합니다.
Method Name : setName
Return Type : void
Modifier : public
Flat Signature : (String)
Method Comment : 이름을 설정 합니다.
[출처] javadoc Doclet 구현 하기....|작성자 지원아빠
http://blog.naver.com/estern?Redirect=Log&logNo=110007338078