这可能是一个特定于doclet实现的问题,但我相信这实际上是我在这里处理的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
参数的"verbose"模式下运行Ant,我也会看到[ydoc]
任务在Ant控制台中被调用,后面是一条写着"Generating Javadoc"的日志语句,大约20行的详细输出将yDoc
参数返回给我,然后是一条说"Javadoc execution"的最终日志消息。然后,以下令人震惊的模糊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
有没有办法从蚂蚁那里获得更多的细节?要找出它在异常中引用的文件或目录吗?以前有JavaDoc/yDoc大师遇到过这种情况吗?我的项目目录结构是否设置错误,或者与Ant构建所寻找的不同?我相信我已经正确设置了doclet/path
属性,并使用了正确的路径分隔符(我在Ubuntu Linux上)。就我的一生而言,我不知道该何去何从,也不知道如何在这里诊断根本问题!提前感谢!
编辑/更新:
感谢大家的建议。我完全取消了Eclipse(就构建而言,只是从命令行运行Ant;这目前还可以。当我这样做时,我得到了一个成功的构建(所以Eclipse至少是部分罪魁祸首),但仍然没有生成yDoc。
现在,当我使用verbos(-v
)选项从终端运行Ant时,我看到的是:
数百条看起来相同但类别不同的警告:
[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] ^
在数百次之后,我得到了以下输出(其中1次用于我的源树中的每个包):
[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
此外,如果它执行正确,它应该将所有JavaDocs放在我的项目根目录中的uml-doclet/
目录下。它没有这样的事!
因此,看起来还有几件事在发生:
- JavaDoc看不到我的第三方依赖项(如Spring、Camel等);因此列出了数百条警告
- 它找不到我的任何来源来记录
再次,奖金将发放给任何能帮助我完成这项工作的人。再次感谢到目前为止所有的帮助!
如果使用-verbose -debug
执行ant,您将看到以下行:
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排除在等式之外来简化事情:使用命令行并检查键入这些命令是否不会导致"command not found"消息:
java
javac
javadoc
我认为第一个是可以的(毕竟,您可以运行Eclipse,如stacktraces中所示)。如果找不到第二个和第三个命令,则说明您的计算机上没有安装JDK,而只安装了JRE。安装一个并重新启动Eclipse。
另一方面,如果找到了javac
,但没有找到javadoc
,那么JDK就坏了。
如果同时找到了javac
和javadoc
,那么Eclipse根本不知道
readlink -m $(which javadoc)/../..
记住readlink
给你的路径。
在Eclipse中转到"窗口->首选项->Java->已安装的JRE"。在列表中,选中选中复选框的条目,然后按"编辑"。如果"JRE home"行与readlink
提供的路径不同,那么您的Eclipse很可能被配置为仅使用本地JRE,而不使用已安装的JDK。
如果是这种情况,请取消"编辑"对话框,按"添加",选择"标准VM"并输入readlink
给您的路径。在正确输入该路径后,Eclipse应该为您填写其他字段,因此您可以只说"OK"。返回"Installed JRE"(已安装的JRE)列表,勾选新项目。
之后,javadoc
任务本身应该启动。
编辑
然而,你需要更多的调整:
第一:在本部分中:
<packageset dir="src/main">
<include name="java/**"/>
</packageset>
您正在混合源directoy和程序包部分。它应该是:
<packageset dir="src/main/java">
</packageset>
此外,javadoc
喜欢访问引用的类。因此,您应该向javadoc添加与编译代码时相同的类路径。因此,在</packageset>
之后添加适当的<classpath>
部分。这将处理"包xyz不存在"警告。
看起来ant找不到javadoc二进制文件。我不认为ant使用定义的PATH来查找javadoc二进制文件(文档说它使用与ant相同的JDK)。
我会尝试的一些事情是:
- 将可执行文件属性添加到任务中,以指向javadoc二进制文件(我并不是说这是一个正确的解决方案,但如果它有效,则意味着蚂蚁默认查找的位置有问题)
- 确保您的JAVA_HOME和PATH指向JDK而不是JRE
- 确保您的JAVA_HOME指向PATH所指向的JAVA安装
我会更改build.xml中的这些行:
<packageset dir="src/main/java">
<include name="**" />
</packageset>