捕获Ant <javadoc>任务输出</javadoc>

时间:2009-03-19 18:01:42

标签: ant javadoc

通过javadoc Ant任务运行时,是否可以捕获Javadoc打印的警告?我没有看到输出属性,例如任务中的输出属性。似乎有警告说Checkstyle只是没有抓住,并且在文件中阻止输出会很好。

似乎很奇怪,这是不可捕捉的,希望我错过了一些明显的东西。

〜*〜*〜*〜编辑(以下回答)〜*〜*〜*〜

它会出现Ant&lt; record&gt;任务正是我所寻找的。请参阅the Ant docs

<target name="generate.docs">
    <record name="javadoc.log" action="start"/>
    <javadoc ... />
    <record name="javadoc.log" action="stop"/>
<target/>

4 个答案:

答案 0 :(得分:1)

我认为之前的重定向答案是由于每次都通过build.xml脚本命令执行此操作的未声明要求而被拒绝投票。

是的。该功能似乎没有在任务中。一个更好的问题可能是:Ant中是否有任务/标签会重定向来自任何嵌套标签的所有输出?这样的任务/标记将保存System.out和/或System.err,将它们设置为创建或附加到文件,然后在块的末尾恢复它们。

类似的东西:

<redirect file='foo.txt' append='true'>
  <anytag you='want' />
</redirect>

答案 1 :(得分:1)

看起来这可能是使用<exec>标记(reference here)...这可能是一个王室的痛苦,但它可能会执行javadoc可执行文件并重建命令参数生成javadoc所必需的。但是,作为一个伟大的大喇叭打击,它似乎只使用你的自然shell重定向,所以在Win32和Linux上构建将需要一些特殊情况mojo。

write your own task做这项工作可能是值得的;要么像Roboprog上面提到的<redirect>标签,要么扩展Javadoc任务......

答案 2 :(得分:1)

您可以使用com.sun.tools.javadoc.Main类执行javadoc作为Java类,调用execute方法(它位于JDK中包含的tools.jar中),因此您可以包装一个java类,你从Ant java任务调用,它允许重定向输出。您将不得不自己重建javadoc命令行参数,而不是具有Ant任务的细节,但它应该可以工作。

答案 3 :(得分:1)

以防万一其他人仍然有兴趣-Ant javadoc任务可以很容易地通过选项outputFile进行改型,以存储生成的消息,例如到文件:

public class MyJavaDoc extends org.apache.tools.ant.taskdefs.Javadoc{

    private File _outFile;

    private Writer _writer;

    /**
     * The file to write error output to.
     */
    public void setOutputFile(File outFile) {
        _outFile = outFile;
    }

    @Override
    public void execute() throws BuildException {
        if (_outFile == null) {
            throw new BuildException("Missing 'outputFile' parameter.");
        }
        try (OutputStream out = new FileOutputStream(_outFile)) {
            _writer = new OutputStreamWriter(out);
            try {
                super.execute();
            } finally {
                _writer.close();
            }
        } catch (IOException ex) {
            throw new BuildException("Cannot write error output: " + ex.getMessage(), ex);
        }
    }

    @Override
    public void log(String msg, int msgLevel) {
        if (msgLevel <= Project.MSG_WARN) {
            try {
                _writer.write(msg);
                _writer.write("\n");
            } catch (IOException ex) {
                throw new IOError(ex);
            }
        }
        super.log(msg, msgLevel);
    }

}