使用特殊doclet运行Javadoc时出现异常
这可能是一个特定于doclet实现的问题,但我相信我在这里讨论的确实是一个JavaDoc配置问题 我正试图让它工作起来,这样它就可以为我的Java应用程序生成UML图,作为Ant构建的一部分。我下载了这个项目(社区版),并尝试了修改他们的使用特殊doclet运行Javadoc时出现异常,java,ant,javadoc,doclet,Java,Ant,Javadoc,Doclet,这可能是一个特定于doclet实现的问题,但我相信我在这里讨论的确实是一个JavaDoc配置问题 我正试图让它工作起来,这样它就可以为我的Java应用程序生成UML图,作为Ant构建的一部分。我下载了这个项目(社区版),并尝试了修改他们的build sample.xml,但无法使其正常工作 以下是我的项目目录结构: MyProject/ src/main/java/ <All the Java sources I want documented and diagra
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
当我运行ydoc
任务时,即使在带有-v
参数的“verbose”模式下运行Ant,我也会看到[ydoc]
任务在Ant控制台中被调用,后面是一条log语句,该语句读取“Generating Javadoc”,并将ydoc
参数从详细输出中返回给我大约20行,最后一条日志消息是“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
经过数百次之后,我得到了以下输出(我的源代码树中的每个包都有一个输出):
此外,如果它执行正确,则应该将所有javadoc放在我的项目根目录中的umldoclet/
目录下。它没有这样的事
因此,看起来还有几件事在进行:
再一次,悬赏给任何能帮我工作的人。再次感谢迄今为止所有的帮助 看起来ant无法找到javadoc二进制文件。我不认为ant使用定义的路径来查找javadoc二进制文件(文档说它使用的JDK与ant使用的JDK相同) 我会尝试以下几点:
- 将可执行文件属性添加到任务中,指向javadoc二进制文件(我并不是说这是一个正确的解决方案,但如果它起作用,则意味着ant默认查看的位置有问题)
- 确保JAVA_主页和路径指向JDK而不是JRE
- 确保JAVA_主页指向路径指向的同一JAVA安装
-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:
或者您将看到以下几行:
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\u PATHNAME\u TO\u javadoc>
行中告诉您。在第二种情况下,它只讨论javadoc
,没有任何路径名,调试输出稍后将显示您的异常
我想你的案子是第二个,但请检查一下
如果Eclipse/Ant不知道javadoc
的位置,您首先应该通过将Eclipse从等式中去掉来简化事情:使用命令行并检查键入这些命令不会导致出现“command not found”(命令未找到)消息:
我假设第一个是可以的(毕竟您可以运行Eclipse,如图1所示)。如果未找到第二个和第三个命令,则表示您的计算机上没有安装JDK,只有JRE。安装一个并重新启动Eclipse
另一方面,如果找到了javac
,但没有找到javadoc
,那么您的JDK就被破坏了
如果同时找到了javac
和javadoc
,那么Eclipse根本不知道这一点。但在返回Eclipse之前,请在命令shell中键入最后一个命令:
readlink -m $(which javadoc)/../..
记住readlink
提供给您的路径
在Eclipse中转到“窗口->首选项->Java->已安装的JRE”。在列表中,选中复选框,然后按“编辑”。如果行“JRE home”与readlink
提供给您的路径不同,那么您的Eclipse很可能配置为仅使用本地JRE,而不使用已安装的JDK
如果是这种情况,则取消“编辑”对话框,按“添加”,选择“标准虚拟机”,然后输入提供给您的路径readlink
。正确输入该路径后,Eclipse应该为您填写其他字段,因此您可以只说“OK”。在“已安装的JRE”列表中,勾选新项目
在此之后,javadoc
任务本身应该启动
编辑
但是,您需要进行更多调整:
第一:本部分:
<packageset dir="src/main">
<include name="java/**"/>
</packageset>
您正在混合源directoy和包部件。应改为:
<packageset dir="src/main/java">
</packageset>
而且
javadoc
喜欢访问引用的类。因此,您应该向javadoc添加与编译代码相同的类路径。因此,在
之后添加适当的
部分。这将处理“程序包xyz不存在”警告。我将更改build.xml中的以下行:
<packageset dir="src/main/java">
<include name="**" />
</packageset>
您的$PATH上有javadoc本身吗?有什么快速检查方法吗?!?在命令shell中键入javadoc
。当我键入javadoc
时,我得到javadoc:error-没有指定任何包或类。
然后是一个很长的使用选项列表,所以它看起来是在路径上。您是从控制台还是从ide运行ant?@4herpsand7derpsago:我已经为下一个障碍更新了解决方案。
<packageset dir="src/main">
<include name="java/**"/>
</packageset>
<packageset dir="src/main/java">
</packageset>
<packageset dir="src/main/java">
<include name="**" />
</packageset>