File 使用ant读取属性文件中的属性不遵守顺序

File 使用ant读取属性文件中的属性不遵守顺序,file,ant,properties,task,File,Ant,Properties,Task,使用ant读取属性文件中的属性不遵守顺序 该命令未得到遵守: 例如: <property file="build.properties" prefix="prefix."/> <propertyselector property="cases" match="prefix.project\.(.*)" select="\1"/> <for list="${cases}" param="pr"> <sequential> <echo messa

使用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: ${prefix.project.@{pr}}"/>
</sequential>
</for>
获取:

(结果似乎是随机变化的)
我必须按照build.properties文件中显示的顺序构建它们???

确实如此。Java属性用
Java.util.Hashtable
表示,您肯定知道,哈希表不保持顺序。您根本无法对属性文件执行所需的操作


如果你要按顺序构建的那些“项目”依次是ANT项目,那么你可能需要考虑将他们的任务移到主构建文件中,而只是使用正常的蚂蚁依赖性来执行适当的构建顺序。Java属性用

Java.util.Hashtable
表示,您肯定知道,哈希表不保持顺序。您根本无法对属性文件执行所需的操作


如果您希望按顺序构建的那些“项目”依次是ANT项目,那么您可能需要考虑将任务移到主构建文件中,并且只需使用正常的AND依赖性来执行适当的构建顺序。

< P>下面的代码将有助于对由属性选择器TAG < /P>生成的列表进行排序。
<sortlist property="my.sorted.list" value="${my.list}"
             delimiter="," />
<echo message="${my.sorted.list}" />

下面的代码将有助于对propertyselector标记生成的列表进行排序

<sortlist property="my.sorted.list" value="${my.list}"
             delimiter="," />
<echo message="${my.sorted.list}" />

正在以正确的顺序读取属性文件。您可以通过简单地输入重复的属性来测试这一点,并查看定义了哪个属性。下面是
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.properties
中首先定义的,一旦定义了属性,就不能(轻松地)更改它

您试图做的是按照定义的顺序访问属性。这并不能保证,因为属性存储在散列中

您提到了子项目,这些子项目必须按特定顺序构建。不幸的是,由于您没有向我们提供实际问题的概要以及项目和子项目的一些示例构建脚本,因此很难准确地说出问题的具体内容

首先,Ant是一种构建矩阵语言,这意味着它有一个依赖层次结构。开发人员面临的最大问题是试图强制构建矩阵语言按特定顺序执行。您应该在build.xml文件中指定一个依赖层次结构(依赖层次结构越少,Ant就越容易做正确的事情)

如果子项目“B”依赖于子项目“a”中的jar文件,那么它应该在子项目“B”的Ant脚本中依赖于子项目“a”的jar构建

<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>

...
. Ivy允许您创建Jar存储库。构建其他项目所依赖的jar的项目可以从此存储库获取所需的jar。这与Maven非常相似。事实上,Ant和Ivy可以使用Maven存储库。我们在Ant项目中使用了一个本地Maven存储库管理器


您还可以尝试该任务,该任务允许您指定一个构建路径,该路径允许您在子项目“B”之前说构建子项目“a”。您可以在另一个Ant XML文件中定义构建路径,该文件可能依赖于客户,然后使用
导入该项目的构建路径。

正在以正确的顺序读取属性文件。您可以通过简单地输入重复的属性来测试这一点,并查看定义了哪个属性。下面是
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.properties
中首先定义的,一旦定义了属性,就不能(轻松地)更改它

您试图做的是按照定义的顺序访问属性。这并不能保证,因为属性存储在散列中

您提到了子项目,这些子项目必须按特定顺序构建。不幸的是,由于您没有向我们提供实际问题的概要以及项目和子项目的一些示例构建脚本,因此很难准确地说出问题的具体内容

首先,Ant是一种构建矩阵语言,这意味着它有一个依赖层次结构。开发人员面临的最大问题是试图强制构建矩阵语言按特定顺序执行。您应该在build.xml文件中指定一个依赖层次结构(依赖层次结构越少,Ant就越容易做正确的事情)

如果子项目“B”依赖于子项目“a”中的jar文件,那么它应该在子项目“B”的Ant脚本中依赖于子项目“a”的jar构建

<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>

...
. Ivy允许您创建Jar存储库。构建其他项目所依赖的jar的项目可以从此存储库获取所需的jar。这与Maven非常相似。事实上,Ant和Ivy可以使用Maven存储库。我们在Ant项目中使用了一个本地Maven存储库管理器


您还可以尝试该任务,该任务允许您指定一个构建路径,该路径允许您在子项目“B”之前说构建子项目“a”。您可以在另一个Ant XML文件中定义构建路径,该文件可能依赖于客户,然后使用
导入该项目的构建路径。

此主要Ant任务是我的打包项目,它调用其他Ant子项目构建,但我无法在其级别移动它们的任务,因为这取决于客户,有些项目将不得不建造,其他的则不然。然而,我不明白这是如何阻止你移动任务的。如果你有一个包含所有任务的构建文件,你可以简单地调用它来构建你想要的任务,具体取决于客户。例如,我只有一个主项目,它必须先构建,所以在我的主ant中,必须在我的列表上迭代两次:首先只检测是否将这个主项目声明到属性文件中(如果是,则调用它的b