Javadocのカスタムドックレットの簡単なサンプルを作ってみました。
クラス毎にメソッドの一覧、ソースファイル名、ソース行数を標準出力へ出力します。
ソース行数まで出せるとはなかなか面白いです。
ちなみにコンパイルにはJAVA_HOME\lib\tools.jarが必要なので、ビルドパスに通しておくこと。
DocletTest.java
package jp.co.doclet; import java.io.IOException; import java.util.Arrays; import com.sun.javadoc.ClassDoc; import com.sun.javadoc.Doclet; import com.sun.javadoc.LanguageVersion; import com.sun.javadoc.MethodDoc; import com.sun.javadoc.Parameter; import com.sun.javadoc.RootDoc; import com.sun.javadoc.SourcePosition; import com.sun.javadoc.Type; public class DocletTest extends Doclet { /** * 処理開始 */ public static boolean start(RootDoc rootDoc){ try { DocletTest test = new DocletTest(); test.printOption(rootDoc); test.printDoclet(rootDoc); }catch (Exception e) { e.printStackTrace(); return false; } return true; } /** * 起動オプションの表示 */ private void printOption(RootDoc rootDoc) { System.out.println("Options:"); for (String[] param : rootDoc.options()) { System.out.format("\t%s\r\n", Arrays.toString(param)); } } /** * Docletの表示 */ private void printDoclet(RootDoc rootDoc) throws IOException { for (ClassDoc classDoc : rootDoc.classes()) { System.out.format("Class: %s\r\n", classDoc.name()); for (MethodDoc methodDoc : classDoc.methods()) { //ソース位置 SourcePosition position = methodDoc.position(); int line = position.line(); String path = position.file().getCanonicalPath(); //修飾子 String modifiersName = methodDoc.modifiers(); //戻り値 Type returnType = methodDoc.returnType(); String returnName = returnType.typeName(); if (returnType.dimension()!=null) { returnName += returnType.dimension(); } //メソッド名 String methodName = methodDoc.name(); //パラメータ String paramName = ""; for (Parameter parameter : methodDoc.parameters()) { paramName += "".equals(paramName) ? parameter.toString() : ", " + parameter.toString(); } System.out.format("\t[%s:%03d]", path, line); System.out.format("%s %s %s(%s)\r\n", modifiersName, returnName, methodName, paramName); } } } /** * JDKバージョンの指定 */ public static LanguageVersion languageVersion() { return LanguageVersion.JAVA_1_5; } }
build.xml
<?xml version="1.0" encoding="Shift_JIS"?> <project name="DocletTest" default="javadoc" basedir="."> <target name="clean"> <delete dir="classes" /> <delete dir="javadoc" /> </target> <target name="compile" depends="clean"> <mkdir dir="classes" /> <javac srcdir="src" destdir="classes"/> </target> <target name="default_javadoc" depends="compile"> <javadoc destdir="javadoc"> <fileset dir="src"/> </javadoc> </target> <target name="javadoc" depends="compile"> <javadoc doclet="jp.co.doclet.DocletTest" docletpath="classes" access="private" additionalparam="-J-Dparam1=value1 -J-Dparam2=value2"> <sourcepath> <pathelement location="src"/> </sourcepath> </javadoc> </target> </project>
実行結果
Buildfile: C:\eclipse3.3\workspace\DocletTest\build.xml clean: [delete] Deleting directory C:\eclipse3.3\workspace\DocletTest\classes compile: [mkdir] Created dir: C:\eclipse3.3\workspace\DocletTest\classes [javac] Compiling 2 source files to C:\eclipse3.3\workspace\DocletTest\classes javadoc: [javadoc] Generating Javadoc [javadoc] Javadoc execution [javadoc] パッケージ jp.co.doclet のソースファイルを読み込んでいます... [javadoc] Javadoc 情報を構築しています... [javadoc] Options: [javadoc] [-doclet, jp.co.doclet.DocletTest] [javadoc] [-docletpath, C:\eclipse3.3\workspace\DocletTest\classes] [javadoc] [-private] [javadoc] [-classpath, C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-antlr.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-apache-bcel.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-apache-bsf.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-apache-log4j.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-apache-oro.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-apache-regexp.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-apache-resolver.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-commons-logging.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-commons-net.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-jai.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-javamail.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-jdepend.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-jmf.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-jsch.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-junit.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-launcher.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-netrexx.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-nodeps.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-starteam.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-stylebook.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-swing.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-trax.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-weblogic.jar;C:\eclipse3.3\configuration\org.eclipse.osgi\bundles\17\1\.cp\lib\remoteAnt.jar;C:\Program Files\Java\jdk1.6.0_05\lib\tools.jar;C:\eclipse3.3\plugins\org.eclipse.swt.win32.win32.x86_3.3.3.v3349.jar] [javadoc] [-sourcepath, C:\eclipse3.3\workspace\DocletTest\src] [javadoc] Class: DocletTest [javadoc] [C:\eclipse3.3\workspace\DocletTest\src\jp\co\doclet\DocletTest.java:020]public static LanguageVersion languageVersion() [javadoc] [C:\eclipse3.3\workspace\DocletTest\src\jp\co\doclet\DocletTest.java:027]public static boolean start(RootDoc rootDoc) [javadoc] [C:\eclipse3.3\workspace\DocletTest\src\jp\co\doclet\DocletTest.java:043]private void printOption(RootDoc rootDoc) [javadoc] [C:\eclipse3.3\workspace\DocletTest\src\jp\co\doclet\DocletTest.java:054]private void printDoclet(RootDoc rootDoc) BUILD SUCCESSFUL Total time: 1 second