4

javadoc是否可以捕获通过Ant 任务运行时 Javadoc 打印的警告?我没有看到任务中的输出属性。似乎有警告说 Checkstyle 没有捕捉到,最好在文件中捕获该输出。

似乎很奇怪,这将无法捕获,希望我遗漏了一些明显的东西。

~*~*~*~编辑(下面的答案)~*~*~*~

看来 Ant <record> 任务正是我想要的。请参阅Ant 文档

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

4 回答 4

1

我假设以前的重定向答案被否决,因为每次都通过 build.xml 脚本命令执行此操作的未说明要求。

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

就像是:

<redirect file='foo.txt' append='true'>
  <anytag you='want' />
</redirect>
于 2009-03-20T01:04:28.903 回答
1

看起来这可以使用<exec>标签(参考这里)......这可能会很痛苦,但它可能可以执行 javadoc 可执行文件并重建生成 javadoc 所需的命令参数。然而,作为一个巨大的反响,它似乎只使用你的自然 shell 重定向,所以在 Win32 和 Linux 上构建需要一些特殊情况的 mojo。

编写自己的任务来完成这项工作可能是值得的;或者<redirect>上面提到的 Roboprog 的标签,或者扩展 Javadoc 任务......

于 2009-03-20T02:50:15.810 回答
1

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

于 2009-03-20T13:44:06.800 回答
1

以防万一其他人仍然感兴趣 - Antjavadoc任务可以很容易地通过选项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);
    }

}
于 2020-06-03T13:50:57.680 回答