2009-05-30 1 views
0

でパッケージ名に基づいてJARファイルを生成します。問題は、build.xmlのは、それぞれの新しいパッケージのために修正されなければならないということであるなど...動的に私の現在のビルドファイルには、次の反復作業があるANT

<jar jarfile="${build.lib}/${prefix}-foo.jar"> 
    <fileset dir="${build.classes}"> 
     <include name="com/a/c/foo/**"/> 
    </fileset> 
</jar> 
<jar jarfile="${build.lib}/${prefix}-bar.jar"> 
    <fileset dir="${build.classes}"> 
     <include name="com/a/c/bar/**"/> 
    </fileset> 
</jar> 

を新しいサブプロジェクトごとに作成します。これは私が働く頻繁な発生です。

"root"パッケージに基づいてJARとそのファイル名を動的に生成するロジックに置き換えたいと思います。たとえば、ルートパッケージをcom/a/cに設定すると、そのパッケージの直下にあるすべてのパッケージが独自のJARを取得します。 "foo"または "bar"の下にあるすべてのパッケージは単に "foo.jar"または "bar.jar"の一部であることに注意してください。

私はANTのループロジックタスクを探しました。私はそれぞれのant-contribとJWare/AntXtrasで1つを見つけましたが、希望通りに動作することができませんでした。

+0

。単一の瓶があなたの目的に合わない理由をさらに詳しく知ることができますか? – Jherico

+0

私は同意します、それは間違いなく左のフィールドの外です。我々はすべての共通のapisのための "ベースジャー"を持っています。そこから、各JARをベースjarとは別のlinux環境に置くことができます。さらに、ほとんどのお客様は、すべてを置き換えるのではなく、アプリケーションの小さな部分を含む1つまたは2つのジャーを交換したいだけです。 –

答えて

4

私はループを繰り返してすべてのパッケージ名を見つけることについて知らないが、マクロを使用してコードの重複を避けることができます。

私はこれを試していないが、それはどのようにこの程度

<macrodef name="build_jar"> 
    <attribute name="name"/> 
    <sequential> 
     <jar jarfile="${build.lib}/${prefix}[email protected]{name}.jar"> 
      <fileset dir="${build.classes}"> 
       <include name="com/a/c/@{name}/**"/> 
      </fileset> 
     </jar> 
    </sequential 
</macrodef> 

<target name="build_foo"> 
    <build_jar name="foo"/> 
</target> 

<target name="build_bar"> 
    <build_jar name="bar"/> 
</target> 
1

を仕事ができる:これは奇妙な要件の一種のように思える

<project name="dynjar" default="jar" basedir="."> 
    <property name="build.classes" value="${basedir}/classes"/> 
    <property name="build.lib" value="${basedir}/lib"/> 
    <property name="prefix" value="prefix"/> 
    <property name="root" value="com/a/c"/> 

    <target name="jar"> 
     <!-- ${ant.file} is the name of the current build file --> 
     <subant genericantfile="${ant.file}" target="do-jar"> 

      <!-- Pass the needed properties to the subant call. You could also use 
       the inheritall attribute on the subant element above to pass all 
       properties. --> 
      <propertyset> 
       <propertyref name="build.classes"/> 
       <propertyref name="build.lib"/> 
       <propertyref name="prefix"/> 
       <propertyref name="root"/> 
      </propertyset> 

      <!-- subant will call the "do-jar" target for every directory in the 
       ${build.classes}/${root} directory, making the subdirectory the 
       basedir. --> 
      <dirset dir="${build.classes}/${root}" includes="*"/> 
     </subant> 
    </target> 

    <target name="do-jar"> 
     <!-- Get the basename of the basedir (foo, bar, etc.) --> 
     <basename file="${basedir}" property="suffix"/> 

     <jar jarfile="${build.lib}/${prefix}-${suffix}.jar"> 
      <fileset dir="${build.classes}"> 
       <include name="${root}/${suffix}/**"/> 
      </fileset> 
     </jar> 
    </target> 
</project> 
+0

私はこれを使って瓶を作っていますが、問題があります。私を助けることができます[ここ](http://stackoverflow.com/questions/23075813/adding-packages-to-jars)? –

関連する問題