在eclipse中制作API参考文档
具体可参考IBM的文章:http://www.ibm.com/developerworks/cn/rational/07/0320_alupului/。
谈一下遇到的问题,首先是从工程里导出API的html文档,本次导出涉及133个插件工程,内存占用量高达630M,全部导完花去10-20分钟。
导出设置时注意以下配置:
分配内存最大值设为1024M,编码方式设为utf-8。
导完后,需要划分Topic,将这些Topic链接到API参考文档里,便于分工协作。所有的TOC文件都必须在plugin.xml里注册。为了避免手工进行Topic划分和Topic下的package注册,使用以下程序自动生成相关TOC文件并完成在plugin.xml里的注册和API参考文档里的link。
package org.autumn.doc.user.generate;import java.io.File;import java.io.FileNotFoundException;import java.io.IOException;import java.io.PrintWriter;import java.util.ArrayList;import java.util.List;import org.autumn.doc.user.Activator;/** * 1 - topics目录下生成TOC文件 <br/> * 2 - plugin.xml里注册TOC文件 <br/> * 3 - topics_Reference.xml里注册TOC文件 * * @author sunny * */public class GeneratePluginToc {public static final String DOC_DIR = "doc";public static final String TOPICS_DIR = "topics";public static final String WS_DIR = "E:\\Autumn BPM\\ws4bpm";public static final String TOPICS_FILE_EXTENSION = ".toc.xml";public static final String PLUGIN_XML = "plugin.xml";public static final String SUMMARY_HTML = "package-summary.html";public static final String TOPICS_REFERENCE_XML = "topics_Reference.xml";public static final String SEPRATOR = System.getProperty("file.separator");public static final String DOT = ".";private static List<String> plugins = new ArrayList<String>();static {plugins.add("org.autumn.action.core");plugins.add("org.autumn.action.interceptor.navigator");plugins.add("org.autumn.action.interceptor.spec");plugins.add("org.autumn.action.layout");plugins.add("org.autumn.action.model");plugins.add("org.autumn.ado.core");plugins.add("org.autumn.ado.spec");plugins.add("org.autumn.bpm.behavior");plugins.add("org.autumn.bpm.client");plugins.add("org.autumn.bpm.commons");plugins.add("org.autumn.bpm.core");plugins.add("org.autumn.bpm.data");plugins.add("org.autumn.bpm.engine");plugins.add("org.autumn.bpm.event.register");plugins.add("org.autumn.bpm.event.thrower");plugins.add("org.autumn.bpm.event.trigger");plugins.add("org.autumn.bpm.loadbalance");plugins.add("org.autumn.bpm.resource.service");plugins.add("org.autumn.bpm.runtime");plugins.add("org.autumn.builder");plugins.add("org.autumn.cluster");plugins.add("org.autumn.common.constraint");plugins.add("org.autumn.configuration.bpm");plugins.add("org.autumn.configuration.scheduler");plugins.add("org.autumn.core");plugins.add("org.autumn.database");plugins.add("org.autumn.entity");plugins.add("org.autumn.evaluation");plugins.add("org.autumn.expression.core");plugins.add("org.autumn.expression.defs");plugins.add("org.autumn.expression.expand");plugins.add("org.autumn.expression.json.factory");plugins.add("org.autumn.expression.json.render");plugins.add("org.autumn.expression.sql.factory");plugins.add("org.autumn.expression.sql.render");plugins.add("org.autumn.form.service");plugins.add("org.autumn.identity");plugins.add("org.autumn.logicview.core");plugins.add("org.autumn.logicview.expand");plugins.add("org.autumn.logicview.model");plugins.add("org.autumn.model.core");plugins.add("org.autumn.model.data");plugins.add("org.autumn.model.defs");plugins.add("org.autumn.model.editdomain");plugins.add("org.autumn.model.extension");plugins.add("org.autumn.model.loader");plugins.add("org.autumn.model.navigator.core");plugins.add("org.autumn.operator");plugins.add("org.autumn.scheduler.core");plugins.add("org.autumn.scheduler.engine");plugins.add("org.autumn.scheduler.model");plugins.add("org.autumn.sdo");plugins.add("org.autumn.type");plugins.add("org.autumn.ui.decorator");plugins.add("org.autumn.view.data");plugins.add("org.autumn.view.feature");plugins.add("org.autumn.viewspec.core");plugins.add("org.autumn.viewspec.expand");plugins.add("org.autumn.viewspec.model");}private static void generateAll() {generateTocs();regeisterPluginXML();regeisterTopicsReferenceXML();}private static void generateTocs() {File topicsDir = new File(getProjectPath() + SEPRATOR + TOPICS_DIR);for (File topic : topicsDir.listFiles()) {topic.delete();}for (String plugin : plugins) {File toc = new File(topicsDir + SEPRATOR + plugin+ TOPICS_FILE_EXTENSION);if (!toc.exists()) {try {toc.createNewFile();} catch (IOException e) {e.printStackTrace();}}try {PrintWriter writer = new PrintWriter(toc);writer.println("<?xml version="1.0" encoding="UTF-8"?>");writer.printf("<toc label="%s">%n", plugin);String docPath = getProjectPath() + SEPRATOR + DOC_DIR;File pluginDocDir = new File(docPath + SEPRATOR+ plugin.replaceAll("\" + DOT, "/"));printTopicLine(writer, plugin, pluginDocDir);writer.println("</toc>");writer.close();} catch (FileNotFoundException e) {e.printStackTrace();}}}private static void printTopicLine(PrintWriter writer, String plugin,File dir) {List<String> files = new ArrayList<String>();for (File f : dir.listFiles()) {files.add(f.getName());}for (File f : dir.listFiles()) {if (files.contains(SUMMARY_HTML)) {String path = dir.getPath().replace("\", "/");String uriLike = plugin.replace(DOT, "/");String label = path.substring(path.indexOf(uriLike));String href = DOC_DIR + "/" + label + "/" + SUMMARY_HTML;writer.printf("\t<topic href="%s" label="%s">%n", href,label.replaceAll("/", DOT));writer.println("\t</topic>");files.remove(SUMMARY_HTML);}if (f.isDirectory()) {printTopicLine(writer, plugin, f);}}}private static void regeisterTopicsReferenceXML() {File topicsReferenceXML = new File(getProjectPath() + SEPRATOR+ TOPICS_REFERENCE_XML);try {PrintWriter writer = new PrintWriter(topicsReferenceXML);writer.println("<?xml version="1.0" encoding="UTF-8"?>");writer.println("<?eclipse version="3.4"?>");writer.println("<toc label="API文档">");File topicsDir = new File(getProjectPath() + SEPRATOR + TOPICS_DIR);for (File file : topicsDir.listFiles()) {String plugin = file.getName().replace(TOPICS_FILE_EXTENSION,"");String href = DOC_DIR + "/" + plugin.replace(DOT, "/") + "/"+ SUMMARY_HTML;writer.printf("\t<topic href="%s" label="%s">%n", href,plugin);writer.printf("\t\t<link toc="%s">%n", TOPICS_DIR + "/"+ file.getName());writer.println("\t\t</link>");writer.println("\t</topic>");}writer.println("</toc>");writer.close();} catch (FileNotFoundException e) {e.printStackTrace();}}private static void regeisterPluginXML() {File pluginXML = new File(getProjectPath() + SEPRATOR + PLUGIN_XML);try {PrintWriter writer = new PrintWriter(pluginXML);writer.println("<?xml version="1.0" encoding="UTF-8"?>");writer.println("<?eclipse version="3.4"?>");writer.println("<plugin>");writer.println("\t<extension point="org.eclipse.help.toc">");writer.println("\t\t<toc file="toc.xml" primary="true">");writer.println("\t\t</toc>");writer.println("\t\t<index path="index">");writer.println("\t\t</index>");writer.println("\t</extension>");writer.println("\t<extension point="org.eclipse.help.toc">");writer.println("\t\t<toc file="topics_Guide.xml">");writer.println("\t\t</toc>");writer.println("\t</extension>");writer.println("\t<extension point="org.eclipse.help.toc">");writer.printf("\t\t<toc file="%s">%n", TOPICS_REFERENCE_XML);writer.println("\t\t</toc>");File topicsDir = new File(getProjectPath() + SEPRATOR + TOPICS_DIR);for (File file : topicsDir.listFiles()) {writer.printf("\t\t<toc file="%s">%n", TOPICS_DIR + "/"+ file.getName());writer.println("\t\t</toc>");}writer.println("\t</extension>");writer.println("</plugin>");writer.close();} catch (FileNotFoundException e) {e.printStackTrace();}}private static String getProjectPath() {return WS_DIR + SEPRATOR + Activator.PLUGIN_ID;}public static void main(String[] args) {GeneratePluginToc.generateAll();}}