2

これはドックレット実装固有の質問かもしれませんが、ここで扱っているのは本当にJavaDoc構成の問題だと思います。

yDoc UML Docletを機能させて、Antビルドの一部としてJavaアプリのUML図を生成しようとしています。私はプロジェクト(コミュニティ版)をダウンロードし、それらを適応させようとしましたが、それを完全に機能させること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して「verbose」モードでAntを実行していても、Ant Consoleでタスクが呼び出され、その後に「Generating Javadoc」というログステートメントが表示され、詳細出力から約20行が逆流します。paramsが返ってきたら、「Javadocの実行」という最終的なログメッセージが表示されます。次に、次の驚くほど漠然とした:-v[ydoc]yDocIOException

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(-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

さらに、正しく実行されていれば、すべてのJavaDocをuml-doclet/プロジェクトルートのディレクトリの下に配置する必要があります。そんなことはしません!

したがって、さらにいくつかのことが起こっているように見えます。

  1. JavaDocは、サードパーティの依存関係(Spring、Camelなど)を認識できません。したがって、何百もの警告のリスト
  2. 文書化するソースが見つかりません

繰り返しになりますが、賞金は私がこれを機能させるのを手伝ってくれる人に与えられます。これまでのすべての助けにもう一度感謝します!

4

3 に答える 3

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>。2番目のケースではjavadoc、パス名なしでのみ説明し、デバッグ出力には後で例外が表示されます。

あなたのケースは2番目のケースだと思いますが、チェックしてください!

Eclipse / Antが最初にあなたの場所を知らない場合はjavadoc、Eclipseを方程式から外して単純化する必要があります。コマンドラインを使用し、これらのコマンドを入力しても「コマンドが見つかりません」というメッセージが表示されないことを確認します。

java
javac
javadoc

最初のものはOKだと思います(結局、スタックトレースに示されているようにEclipseを実行できます)。2番目と3番目のコマンドが見つからない場合は、JDKはインストールされておらず、コンピューターにはJREのみがインストールされています。1つをインストールして、Eclipseを再起動します。

一方、javac見つかったが見つからjavadocなかった場合は、JDKが壊れています。

javacとの両方javadocが見つかった場合、Eclipseは単にそれを認識しません。ただし、Eclipseに戻る前に、コマンドシェルに最後のコマンドを入力します。

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

パスがあなたにreadlink与えることを忘れないでください。

Eclipseで、「ウィンドウ->設定->Java->インストールされたJRE」に移動します。リストでチェックボックスがオンになっているエントリを選択し、[編集]を押します。「JREhome」という行がパスで指定されたものと同じでない場合はreadlink、EclipseがローカルJREのみを使用し、インストールされているJDKは使用しないように構成されている可能性があります。

その場合は、[編集]ダイアログをキャンセルし、[追加]を押して[標準VM]を選択し、指定されたパスを入力しreadlinkます。そのパスを正しく入力すると、Eclipseは他のフィールドに入力する必要があるため、「OK」とだけ言うことができます。「インストール済み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 に答える
3

antがjavadocバイナリを見つけられないようです。antが定義されたPATHを使用してjavadocバイナリを見つけることはないと思います(ドキュメントには、antが使用するのと同じJDKを使用すると書かれています)。

私が試みることのいくつかは次のとおりです。

  • 実行可能属性をタスクに追加して、javadocバイナリをポイントします(これが正しい解決策であるとは言いませんが、機能する場合は、antがデフォルトで探している場所に問題があることを意味します)。
  • JAVA_HOMEとPATHがJREではなくJDKを指していることを確認してください
  • JAVA_HOMEが、PATHが指すのと同じJavaインストールを指していることを確認してください。
于 2012-09-30T13:39:08.593 に答える
0

build.xmlのこれらの行を変更します:

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