【问题标题】:Capturing Ant <javadoc> task output捕获 Ant <javadoc> 任务输出
【发布时间】:2010-10-14 09:09:41
【问题描述】:

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

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

~*~*~*~ 编辑(下面回答)~*~*~*~

看来,Ant 任务正是我想要的。见the Ant docs

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

【问题讨论】:

  • 现在,你在用这个文件做什么?你有办法说拉出警告/错误消息来显示 - 就像 Maven 一样?
  • 差不多一样。 CI 服务器 Hudson 将解析这些消息并将它们作为报告放置。

标签: ant javadoc


【解决方案1】:

使用&lt;exec&gt; 标记 (reference here) 似乎可以做到这一点...这可能会很痛苦,但可以执行 javadoc 可执行文件并重建生成所需的命令参数文档。不过,作为一个巨大的反响,它似乎只使用您的自然 shell 重定向,因此在 Win32 和 Linux 上构建需要一些特殊情况的 mojo。

write your own task 做这项工作可能是值得的; Roboprog 上面提到的 &lt;redirect&gt; 标签,或者扩展 Javadoc 任务...

【讨论】:

    【解决方案2】:

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

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

    类似:

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

    【讨论】:

    • 我认为现在所有的酷孩子都在使用 Maven 插件,所以这可能不会很快发生。我,我还是想念“make” :-(
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      以防万一其他人仍然感兴趣 - 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);
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2014-03-09
        • 2019-10-14
        • 1970-01-01
        • 1970-01-01
        • 2011-04-20
        • 1970-01-01
        • 2011-02-02
        • 1970-01-01
        • 2014-04-11
        相关资源
        最近更新 更多