这可能是一个 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/
放在我的项目根目录下。它没有这样的事情!
所以看起来还有更多的事情发生:
- JavaDoc 看不到我的第 3 方依赖项(例如 Spring、Camel 等);因此列出了数百个警告
- 它找不到我要记录的任何来源
再次,赏金给任何可以帮助我完成这项工作的人。再次感谢迄今为止的所有帮助!