2009-06-08 14 views
2

私はコマンドラインを使ってlinuxでantと作業しています。私はjavacで単純なビルドステップを持っています。これは正しくコンパイルされますが、私の名前空間のようなビルドの下にディレクトリ構造が作成されます。antの名前空間/ディレクトリ構造を使って作業する

すなわち:私は1つのディレクトリ(それはそれでJavaを呼び出す方が簡単です)には、この出力を取得できますか./build/com/crosse/samplespace/SampleProgram.class

私は

<target name="output" depends="compile"> 
      <copy todir="${output}"> 
        <fileset dir="${build}" includes="**/*.class"/> 
      </copy> 
</target> 

を試してみましたが、それは私の出力ディレクトリに同じことを繰り返します。 antを使用してすべてを単一のディレクトリに取得するにはどうすればよいですか?

別のファイルをそのパスのルートにコピーするにはどうすればよいですか(Apacheのコモン構成ファイル)?

編集:これは主に便利な要素です。プログラムを実行するために同じ3つのディレクトリをナビゲートするのに飽きてしまいます。

答えて

2

すべてのファイル(クラスおよびその他のリソース)を含むjarファイルを作成するとどうなりますか? jarには、defaultメソッドがあり、ユーザがダブルクリックするか、java -jar <jar-file>を使用して呼び出すときにmainメソッドが実行されます。 Ant jar taskを使用できます。

それに加えて、(jarの外に)ディレクトリ構造を保持することが重要です。そうしないと、Javaクラスローダーはこれらのクラスをロードする必要がなくなります。それともあなたの質問が間違っていましたか?

0

あなたはflattenmapperを使ってやりたいことを達成することができますが、私はそれを行うための正当な理由を理解することができません。

1

あなたの質問にお答えするには、careyが指摘しているようにflatten mapperを使用します。 copyタスクもそれのためのショートカットがあります。しかしを

<copy todir="${output}" flatten="yes"> 
    <fileset dir="${build}" includes="**/*.class"/> 
</copy> 

を、私はまた、あなたがこれを達成するために望んでいることを理解していません。 Javaランタイムは、クラスファイルがパッケージ構造を反映するディレクトリ構造内にあることを想定しています。トップクラスのディレクトリにクラスファイルをコピーすると、クラスがデフォルトパッケージに含まれていない限り(ファイルにはpackageステートメントがありません)機能しません。

手動でディレクトリを変更する必要がないようにするには、javaというタスクを適切なクラスパスと他のパラメータで呼び出すターゲットを、いつでもant buildファイルに追加することができます。例:

<target name="run" depends="compile"> 
    <java classname="com.crosse.samplespace.SampleProgram" 
      classpath=".:build"/> 
</target> 
関連する問題