0

次のディレクトリ構造を持つプロジェクトを Ant にコンパイルさせようとしています。

MyProject/
    src/main/java/
        com/
            <The rest of my source>
    gen/
        bin/
            main/
                <Where I want all Java sources compiled to>
    lib/
        main/
            <All of my dependencies>
    build.xml
    build.properties

これが私のAntタスクです:

<path id="src.main.java.path">
    <fileset dir="src/main/java">
        <include name="**.*java"/>
    </fileset>
</path>

<path id="lib.main.path">
    <fileset dir="lib/main">
        <include name="**.*jar"/>
    </fileset>
</path>

<target name="compile">
    <javac includeantruntime="true" srcdir="src/main/java" destdir="gen/bin/main">
        <!--
        Define a new classpath composed of all main Java sources and main Java dependencies,
        and use them for this compilation.
        -->
        <classpath>
            <pathelement path="src.main.java.path"/>
            <pathelement path="lib.main.path"/>
        </classpath>
    </javac>
</target>

build.xmlこれはプロジェクトのルート ディレクトリにあり、そのbasedir属性は"."(プロジェクトのルート ディレクトリ) に設定されていることに注意してください。

「コンパイル」タスクを実行すると、プロジェクトの依存関係 (Guice、Joda-Time、XStream など) が見つからないという 100 以上のコンパイラ エラーが発生します。

compile:
    [javac] Compiling 53 source files to /<path-to-my-project-root>/MyProject/gen/bin/main
    [javac] /<path-to-my-project-root>/MyProject/src/main/java/org/me/Widget.java:37: package com.google.inject does not exist
    [javac] import com.google.inject.AbstractModule;
    [javac]                         ^
    [javac] /<path-to-my-project-root>/MyProject/src/main/java/org/me/MyWidget.java:45: cannot find symbol
    [javac] symbol: class AbstractModule
    [javac] public class AppUziContext extends AbstractModule {
    [javac]            

BUILD FAILED
/<path-to-my-project>/MyProject/build.xml:51: Compile failed; see the compiler error output for details.

...リストは、すべてこのように見える100以上のエラーですが、検出できない依存関係ごとに異なります。

問題は、構成して内部で参照しているパスのどこかにあると思いますjavac/classpathが、Ant ドキュメントを読んだ後、どこが間違っているのかわかりません。前もって感謝します!

4

1 に答える 1

3

ターゲットでこれを試してください:

<classpath>
    <path refid="src.main.java.path"/>
    <path refid="lib.main.path"/>
</classpath>

通常、ターゲットの完全なクラスパスを作成してから、ターゲット内でワンライナー クラスパスを使用します。

<path id="target.class.path">
    <path refid="src.main.java.path"/>
    <path refid="lib.main.path"/>
</path>

次に、ターゲットで:

<classpath refid="target.class.path"/>

pathelement十分に文書化されていませんが、これは ant サイトから得られる最高のものです。これらの例では、<pathelement path=は常にプロパティと共に使用されることに注意してください。それ以外の場合は<pathelement location、実際のフォルダー名 (プロパティの場合もあります) が使用されます。

于 2012-10-01T14:54:57.083 に答える