2

可能是一个 doclet-implementation-specific 问题,但我相信它确实是我正在处理的 JavaDoc 配置问题。

我正在尝试让yDoc UML Doclet工作,以便它将为我的 Java 应用程序生成 UML 图,作为 Ant 构建的一部分。我下载了该项目(社区版)并尝试对其进行调整,build-sample.xml但无法使其正常工作。

这是我的项目目录结构:

MyProject/
    src/main/java/
        <All the Java sources I want documented and diagrammed>
    bin/main
        <Compiled binaries of src/main/java/>
    lib/
        styleed.jar
        ydoc.jar
    resources/
        <All the yDoc resources that came with the download>
    umldoclet/
        <Where I want all JavaDocs to go>
    build.xml

这是build.xml

<project name="MyProject" default="ydoc" basedir="." xmlns:ivy="antlib:org.apache.ivy.ant" xmlns:jacoco="antlib:org.jacoco.ant">

    <!-- The "compile" task and all its dependencies omitted for brevity,
         but they all absolutely work 100% and "compile" places compiled
         CLASS files under bin/main. -->

    <target name="ydoc" depends="compile">
        <property name="ydoc.home" value="${basedir}"/>

        <javadoc source="1.5" destdir="./umldoclet" additionalparam="-breakiterator">
            <packageset dir="src/main">
                <include name="java/**"/>
            </packageset>
            <doclet name="ydoc.doclets.YStandard" path="${ydoc.home}/lib/ydoc.jar;${ydoc.home}/resources">
                <param name="-author"/>
                <param name="-generic"/>
                <param name="-umlautogen"/>
                <param name="-filterpath" value="./lib/ydoc.jar"/>
                <param name="-filter" value="ydoc.filters.ExcludeFilter"/>
                <param name="-tag" value="y.precondition"/>
                <param name="-tag" value="y.postcondition"/>
                <param name="-tag" value="y.complexity"/>
                <param name="-tag" value="param"/>
                <param name="-tag" value="return"/>
                <param name="-tag" value="see"/>
                <param name="-tag" value="y.uml"/>
            </doclet>
        </javadoc>
    </target>
</project>

当我运行ydoc任务时,即使使用-v参数在“详细”模式下运行 Ant,我看到[ydoc]任务在 Ant 控制台中被调用,然后是一条日志语句,内容为“生成 Javadoc”,以及来自详细输出的大约 20 行反刍yDoc参数返回给我,然后是最后一条日志消息,上面写着“Javadoc 执行”。然后,以下令人震惊的模糊IOException

BUILD FAILED
<my-eclipse-home>/MyProject/build.xml:200: Javadoc failed: java.io.IOException: Cannot run program "javadoc": java.io.IOException: error=2, No such file or directory
    at org.apache.tools.ant.taskdefs.Javadoc.execute(Javadoc.java:1765)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
    at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.Target.execute(Target.java:392)
    at org.apache.tools.ant.Target.performTasks(Target.java:413)
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399)
    at org.apache.tools.ant.Project.executeTarget(Project.java:1368)
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
    at org.eclipse.ant.internal.launching.remote.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
    at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
    at org.eclipse.ant.internal.launching.remote.InternalAntRunner.run(InternalAntRunner.java:424)
    at org.eclipse.ant.internal.launching.remote.InternalAntRunner.main(InternalAntRunner.java:138)
Caused by: java.io.IOException: Cannot run program "javadoc": java.io.IOException: error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:475)
    at java.lang.Runtime.exec(Runtime.java:610)
    at org.apache.tools.ant.taskdefs.Execute$Java13CommandLauncher.exec(Execute.java:862)
    at org.apache.tools.ant.taskdefs.Execute.launch(Execute.java:481)
    at org.apache.tools.ant.taskdefs.Execute.execute(Execute.java:495)
    at org.apache.tools.ant.taskdefs.Javadoc.execute(Javadoc.java:1759)
    ... 15 more
Caused by: java.io.IOException: java.io.IOException: error=2, No such file or directory
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:164)
    at java.lang.ProcessImpl.start(ProcessImpl.java:81)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:468)
    ... 20 more

有什么方法可以从 Ant 中获取更多详细信息?要找出它在异常中引用的文件或目录?以前有任何 JavaDoc/yDoc 大师遇到过这种情况吗?我的项目目录结构是否设置不正确,或者与 Ant 构建所寻找的不同?我相信我的doclet/path属性设置正确,并使用了正确的路径分隔符(我在 Ubuntu Linux 上)。对于我的一生,我无法弄清楚从这里去哪里,或者如何诊断这里的潜在问题!提前致谢!

编辑/更新

感谢大家到目前为止的建议。我完全取消了 Eclipse(就构建而言,只是从命令行运行 Ant;现在这很好。当我这样做时,我得到了一个成功的构建(所以 Eclipse 至少部分是罪魁祸首),但是仍然没有 yDoc 生成。

现在,当我使用 verbos ( ) 选项从终端运行 Ant 时-v,我看到的是:

数百个看起来相同但类别不同的​​警告:

[javadoc] Constructing Javadoc information...
[javadoc] /<path-to-my-project>/MyProject/src/main/java/com/some/pkg/SomeObject.java:11: package org.springframework.beans.factory.annotation does not exist
[javadoc] import org.springframework.beans.factory.annotation.Autowired;
[javadoc]                                                    ^

在数百个之后,我得到以下输出(我的源代码树中的每个包都有一个输出):

[javadoc] javadoc: warning - No source files for package java.com.some.pkg.<whatever>

最后,详细构建输出的最后一部分:

[javadoc] Valid license file found.
[javadoc] Registered Filter ydoc.filters.ExcludeFilter ...
[javadoc] Registered Taglet for tag @y.complexity ...
[javadoc] Registered Taglet for tag @y.precondition ...
[javadoc] Registered Taglet for tag @y.postcondition ...
[javadoc] Registered Taglet for tag @y.author ...
[javadoc] 1 error
[javadoc] 109 warnings
[javadoc] javadoc: error - No public or protected classes found to document.

BUILD SUCCESSFUL
Total time: 6 seconds

此外,如果它正确执行,它应该将所有 JavaDocsuml-doclet/放在我的项目根目录下。它没有这样的事情!

所以看起来还有更多的事情发生:

  1. JavaDoc 看不到我的第 3 方依赖项(例如 Spring、Camel 等);因此列出了数百个警告
  2. 它找不到我要记录的任何来源

再次,赏金给任何可以帮助我完成这项工作的人。再次感谢迄今为止的所有帮助!

4

3 回答 3

3

看起来 ant 找不到 javadoc 二进制文件。我不认为 ant 使用定义的 PATH 来查找 javadoc 二进制文件(文档说它使用与 ant 相同的 JDK)。

我会尝试的一些事情是:

  • 可执行属性添加到任务中,以指向 javadoc 二进制文件(我并不是说这是一个正确的解决方案,但如果它有效,则意味着默认情况下 ant 查找的位置存在问题)。
  • 确保您的 JAVA_HOME 和 PATH 指向 JDK 而不是 JRE
  • 确保您的 JAVA_HOME 指向您的 PATH 指向的同一个 java 安装。
于 2012-09-30T13:39:08.593 回答
3

如果您执行 ant ,-verbose -debug您将看到以下行:

Setting project property: ydoc.home -> /var/tmp/ydoc-test
  [javadoc] scanning /var/tmp/ydoc-test/src/main for packages.
dirset: Setup scanner in dir /var/tmp/ydoc-test/src/main with patternSet{ includes: [java/**] excludes: [] }
  [javadoc] Generating Javadoc
  [javadoc] Executing '/usr/lib/jvm/java-7-openjdk-amd64/bin/javadoc' with arguments:
  [...]

或者你会看到这些行:

Setting project property: ydoc.home -> /var/tmp/ydoc-test
  [javadoc] scanning /var/tmp/ydoc-test/src/main for packages.
dirset: Setup scanner in dir /var/tmp/ydoc-test/src/main with patternSet{ includes: [java/**] excludes: [] }
  [javadoc] Generating Javadoc
  [javadoc] Executing 'javadoc' with arguments:

在第一种情况下,Eclipse/Ant 找到了一个有效的javadoc命令并在行中告诉你[javadoc] Executing >FULL_PATHNAME_TO_JAVADOC>。在第二种情况下,它只谈论javadoc没有任何路径名,调试输出稍后会显示您的异常。

我假设您的情况是第二个,但请检查一下!

如果 Eclipse / Ant 不知道javadoc您的位置,首先应该通过将 Eclipse 排除在等式之外来简化事情:使用命令行并检查键入这些命令是否不会导致“找不到命令”消息:

java
javac
javadoc

我假设第一个没问题(毕竟你可以运行 Eclipse,如堆栈跟踪中所示)。如果没有找到第二个和第三个命令,则您的计算机上没有安装 JDK,而仅安装了 JRE。安装一个并重新启动 Eclipse。

另一方面,如果javac找到但javadoc没有找到,那么您的 JDK 已损坏。

如果两者javacjavadoc找到了,那么 Eclipse 根本不知道它。但在返回 Eclipse 之前,在命令 shell 中键入最后一个命令:

readlink -m $(which javadoc)/../..

记住路径readlink给你。

在 Eclipse 中,转到“Window -> Preferences -> Java -> Installed JREs”。在列表中选择带有选中复选框的条目,然后按“编辑”。如果“JRE home”行与readlink给你的路径不同,那么很可能你的 Eclipse 被配置为只使用本地 JRE 而不是你安装的 JDK。

如果是这种情况,请取消“编辑”对话框,按“添加”,选择“标准 VM”并输入readlink给您的路径。正确输入该路径后,Eclipse 应该为您填写其他字段,因此您可以说“OK”。回到“Installed JRE”列表中的新项目上打勾。

之后,javadoc任务本身应该开始。

编辑

但是,您需要进行更多调整:

第一:在这部分:

       <packageset dir="src/main">
            <include name="java/**"/>
        </packageset>

您正在混合源目录和包部分。它应该是:

       <packageset dir="src/main/java">
       </packageset>

javadoc喜欢访问引用的类。因此,您应该向 javadoc 添加与编译代码相同的类路径。所以在 . 之后添加一个适当的<classpath>部分</packageset>。这将处理“包 xyz 不存在”警告。

于 2012-10-01T11:09:10.343 回答
0

我会在您的 build.xml 中更改这些行:

<packageset dir="src/main/java">
    <include name="**" />
</packageset>
于 2012-10-02T21:54:02.740 回答