2013-07-12 8 views
7

は、ソースからのjarファイルを構築し、すべての非Javaリソースを含み、最小限のbuild.xmlフラグメントを考えてみましょうアリ複数のソースディレクトリが

上記のスクリプトを修正するにはどうすればよいですか? javacはうれしくディレクトリのリストを取得しますが、コピーするためには、文字列を除外してファイルセットのリストに変換するか、別の方法で見つける必要があります。

答えて

3

私は組み込みのAntタスクでそれを行う方法のか分からないが、あなたは簡単な解決策は、ちょうど同じ方法で、複数のファイルセットを指定することですant-contrib <for> task

<path id="src.path"> 
    <pathelement location="src" /> 
    <pathelement location="src-gen" /> 
</path> 

<target name="build"> 
    <javac destdir="bin"> 
     <src refid="src.path" /> 
    </javac> 
    <for param="dir"> 
     <path refid="src.path" /> 
     <sequential> 
      <copy includeemptydirs="false" todir="bin"> 
       <fileset dir="@{dir}"> 
        <exclude name="**/*.java" /> 
       </fileset> 
      </copy> 
     </sequential> 
    </for> 
    <jar destfile="dist/foo.jar" basedir="bin"/> 
</target> 
+0

これは私がやったことですが、参照によって再利用できる「複合」リソースの作成は許可されていません。 –

+0

また、https://ant.apache.org/manual/Tasks/script.htmlの末尾にあるディレクトリのリストから ''を使ってパスを作成する方法の例が考えられます –

8

通常は、単に一緒にそれらをすべてリスト:

<javac destdir="bin"> 
    <src path="${src.dir}"/> 
    <src path="${src2.dir}"/> 
    <src path="${src3.dir}"/> 
</javac> 

あなたは<sourcepath/>属性を試すことができます。私はそれを使ったことがないが、私は、さまざまなソースファイルのパスを定義するためにそれを使用し、それを使用することができると信じて:第二わから

<path id="source.path"> 
    <pathelement path="${src.dir}"/> 
    <pathelement path="${src2.dir}"/> 
    <pathelement path="${src4.dir}"/> 
</path> 

<javac destdir="bin"> 
    srcpathref="source.path"/> 

最初の意志の仕事ではなく、100%。

+0

「javac」はリストを直接受け入れるので簡単です。私の問題は 'copy'タスクです。 –

4

を使用することができます当然の

<target name="build" depends="init" description="Create the package"> 
     <javac destdir="${classes.dir}" includeantruntime="false"> 
     <src path="src/main1/java"/> 
     <src path="src/main2/java"/> 
     </javac> 

     <copy todir="${classes.dir}" includeemptydirs="false"> 
     <fileset dir="src/main1" excludes="**/*.java"/> 
     <fileset dir="src/main2" excludes="**/*.java"/> 
     <flattenmapper/> 
     </copy> 
    </target> 

これは期待するのは不合理ではないである、ソースコードの場所の数が固定されていることを前提としています。javacタスクの属性、複数の「SRC」をサポートしています

リストプロパティを使用して、これをドライブしたい場合は、(私はアリ-contribのを推奨するものではありません)、このリストを処理するために、ビルド内のスクリプトを埋め込むに頼らなければなりません。

<project name="demo" default="build"> 

    <property name="src.dirs" value="src/main1,src/main2"/> 
    <property name="build.dir" location="build"/> 
    <property name="classes.dir" location="${build.dir}/classes"/> 

    <target name="bootstrap"> 
     <mkdir dir="${user.home}/.ant/lib"/> 
     <get dest="${user.home}/.ant/lib/groovy-all.jar" src="http://search.maven.org/remotecontent?filepath=org/codehaus/groovy/groovy-all/2.1.6/groovy-all-2.1.6.jar"/> 
    </target> 

    <target name="init"> 
     <mkdir dir="${classes.dir}"/> 
    </target> 

    <target name="build" depends="init" description="Create the package"> 
     <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy"/> 

     <groovy> 
     def srcDirs = properties["src.dirs"].split(",") 

     ant.javac(destdir:properties["classes.dir"], includeantruntime:false) { 
      srcDirs.each { 
       src(path:"${it}/java") 
      } 
     } 

     ant.copy(todir:properties["classes.dir"], includeemptydirs:false) { 
      srcDirs.each { 
       fileset(dir:it, excludes:"**/*.java") 
      } 
      flattenmapper() 
     } 
     </groovy> 
    </target> 

    <target name="clean" description="Cleanup build dirs"> 
     <delete dir="${build.dir}"/> 
    </target> 

</project> 

注:

  • "ビルド"ターゲットを比較してください。 GroovyのソリューションはANTと同じように呼び出します。これは、私がgroovyのANTとの統合が本当に好きな理由です。
  • 例には、groovy jar依存関係をMaven Centralからダウンロードするための "ブートストラップ"ターゲットも含まれています。代わりに、あなたのビルドの依存関係を管理するためにivyを使用することもできます。
関連する問題