2012-02-03 15 views
0

プロパティファイルでプロパティを読み込みます。プロパティファイルのプロパティをantで尊重しないでください。

順番が尊重されていません。

例:

<property file="build.properties" prefix="prefix."/> 
<propertyselector property="cases" match="prefix.project\.(.*)" select="\1"/> 
<for list="${cases}" param="pr"> 
<sequential> 
<echo message="Project: @{pr} Version: ${[email protected]{pr}}"/> 
</sequential> 
</for> 

で:

build.properties

project.1 = 1.2.3 
project.8 = 5.9.4 
project.4 = 3.5.0 

取得:

Project: 8 Version 5.9.4 
Project: 1 Version 1.2.3 
Project: 4 Version 3.5.0 

(結果はランダムに変わるようです) build.propertiesファイルに表示されている順番でビルドする必要がありますか?

答えて

2

propertyselectorタグによって生成されたリストをソートするのに役立ちます。これをテストするには、重複したプロパティを入れて、どれが定義されているかを確認します。ここbuild.propertiesです:

dup.prop = foo 
dup.prop = bar 

そして、ここに私のAntスクリプトは次のとおりです。

これを実行する
<project> 
    <property file="build.properties"/> 
    <echo>Dup.prop is set to "${dup.prop}".</echo> 
</project> 

、私が買ってあげる:

fooのbuild.properiesで最初に定義されているため
Dup.prop is set to "foo". 

プロパティが定義されると、(簡単に)変更することはできません。

あなたがしようとしているのは、定義されている順序でプロパティにアクセスすることです。プロパティはハッシュに格納されるため、これは保証されません。

あなたはサブプロジェクトについて言及しており、それらのサブプロジェクトは特定の順序で作成する必要があります。残念ながら、実際の問題の概要や、プロジェクトやサブプロジェクト用のサンプルビルドスクリプトを提供してくれなかったため、何が問題になるのかを正確に伝えるのは難しいです。

最初に、Antはビルドマトリックス言語です。つまり、依存関係の階層を持っています。開発者が抱えている最大の問題は、マトリックス言語を特定の順序で実行するよう強制しようとしていることです。 build.xmlファイルには依存関係の階層を指定する必要があります(存在する数が少ないほど、Antが物事を正しく取得するのが容易になります)。

サブプロジェクト "B"がサブプロジェクト "A"のjarファイルに依存する場合、サブプロジェクト "B"のAntスクリプトでサブプロジェクト "A" jarビルドに依存する必要があります。プロジェクトの「B」のための上記build.xml

<project name="proj-b"/> 
    ... 
    <target name="build-jar" 
     depends="test.if.jar.exists" 
     unless="jar.exist"> 
     <ant directory="${proj.a.dir}" 
      target="build.depend.jar"/> 
    </target> 

    <target name="test.if.jar.exists"> 
     <condition property="jar.exists"> 
      <available file="${proj.a.dir}/dist/${dend.jar.file}"/> 
     </condition> 
    </target> 

    <target name="compile" 
     depends="build-jar"> 
     .... 
    </target> 
    ... 
</project> 

、私はプロジェクト「B」をコンパイルする前に、プロジェクトは「」構築するいくつかのjarファイルに依存しています。したがって、私のcompileタスクは、ターゲット "A"のjarファイルを構築するbuild-jarに依存します。このタスクがProject Aのjarファイルを何度も作成するのを防ぐために、このjarが存在するかどうかを調べるためのテストとして<condition>を使用します。それが既にある場合、私は瓶を再構築しません。この場合

  • ターゲットは "コンパイル" が呼ばれています。そのターゲットはターゲット「ビルド・ジャー」に依存していることを認識します。
  • Before Target "compile"が実行されます。ターゲット "build-jar"が最初に呼び出されます。
  • ターゲット "build-jar"は、ターゲット "test.if.jar.exists"に依存します。前
  • は「-jarファイルをビルドする」実行され、それはjarファイルがすでに存在する場合、プロパティjar.existsがなる、「test.if.jar.exists」ターゲット「test.if.jar.exists」で
  • ターゲットを呼び出しますセット。
  • ターゲット "build-jar"がアクティブになり、プロパティーjar.existsが設定されているかどうかを確認します。そうであれば、ターゲットは実行されません。
  • 最後に、制御はターゲット "コンパイル"に戻り、次に実行されます。

ここでは、直接注文することはありません。代わりに、私が指定した依存関係階層を持つだけで、Antには何をすべきか正確に把握させました。

依存するjarの問題が大きな問題である場合は、Ivyを参照することもできます。 Ivyでは、のJarリポジトリを作成できます。残りのプロジェクトが依存しているjarをビルドするプロジェクトは、このリポジトリから必要なjarファイルを取得できます。これはMavenと非常によく似ています。実際に、IvyのAntはMavenリポジトリを使用できます。我々は、AntプロジェクトのためにローカルのMavenリポジトリマネージャーArtifactoryを使用します。

はまた、あなたがサブ・プロジェクト「B」前ビルドサブプロジェクト「A」と言うことができるでしょうビルドパスを指定することができない<subant>タスクを試すことができます。 ビルドパスを別のAnt XMLファイルに定義することができます。このファイルは顧客に依存する可能性があり、<import>を使用してそのプロジェクトのビルドパスをインポートします。

1

実際。 Javaのプロパティはjava.util.Hashtableで表され、わかっているように、ハッシュテーブルは順序を保持しません。あなたは単にプロパティファイルであなたが望むことをすることはできません。

あなたが順番にビルドしたいと言っている「プロジェクト」が順番にAntプロジェクトである場合は、タスクをメインのビルドファイルに移動し、通常のAnt依存関係。

+0

この主なAntタスクは、他のantサブプロジェクトをビルドするパッケージングプロジェクトですが、顧客に応じていくつかのプロジェクトをビルドする必要があるため、他のプロジェクトをビルドする必要がありません。 – itomorow

+0

しかし、あなたがタスクを動かすのを妨げる方法はわかりません。すべてのタスクを含むビルドファイルが1つある場合は、それを呼び出して顧客に応じて必要なタスクを作成するだけです。 – Dolda2000

+0

例としては、メインプロジェクトが1つしかありません。これは他のビルドの前にビルドする必要があります。したがって、私のメインのアリでは、リストに2回反復する必要があります。 このメインプロジェクトがプロパティファイルそうであればビルドタスクを呼び出す)、for-loopで別のビルドタスクを呼び出すことができます。それはスマートな解決策ではありませんが、他のプロジェクトが宣言され、このプロジェクトは他のプロジェクトの前に2番目の位置に構築されなければなりません... もし私が望むことができれば、この2番目のプロジェクトのlitte部分はAPIの最初の部分はありますが、私はこの決定をすることはできません。 – itomorow

0

次のコードは、プロパティファイルが正しい順序で読み込まれている

<sortlist property="my.sorted.list" value="${my.list}" 
      delimiter="," /> 
<echo message="${my.sorted.list}" /> 
関連する問題