Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用特殊doclet运行Javadoc时出现异常_Java_Ant_Javadoc_Doclet - Fatal编程技术网

使用特殊doclet运行Javadoc时出现异常

使用特殊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

这可能是一个特定于doclet实现的问题,但我相信我在这里讨论的确实是一个JavaDoc配置问题

我正试图让它工作起来,这样它就可以为我的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
当我运行
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/
目录下。它没有这样的事

因此,看起来还有几件事在进行:

  • JavaDoc看不到我的第三方依赖项(如Spring、Camel等);因此出现了数百条警告
  • 它找不到我的任何来源来记录

  • 再一次,悬赏给任何能帮我工作的人。再次感谢迄今为止所有的帮助

    看起来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>