用ant读取属性文件中的属性不尊重顺序



用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

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文件中出现的顺序来构建它们??

正在按正确顺序读取属性文件。您可以通过简单地放入重复的属性来测试这一点,并查看定义了哪个属性。这是build.properties:

dup.prop = foo
dup.prop = bar

这是我的Ant脚本:

<project>
    <property file="build.properties"/>
    <echo>Dup.prop is set to "${dup.prop}".</echo>
</project>

运行这个,我会得到:

Dup.prop is set to "foo".

这是因为值foo首先在build.properies中定义,一旦定义了属性,就无法(轻松)更改它。

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

你提到了子项目,这些子项目必须按照特定的顺序构建。不幸的是,很难确切地说出问题所在,因为您没有给我们一个实际问题的概要以及项目和子项目的一些示例构建脚本。

首先,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>

在项目"B"的上述build.xml中,我依赖于项目"A"构建的一些jar文件,然后才能编译项目"B)。因此,我的compile任务依赖于build-jar,它将构建目标"A"的jar文件。为了防止这个任务反复构建项目"A"的jar,我使用<condition>作为测试,看看这个jar是否存在。如果它已经这样做了,我不会重建罐子。

在这种情况下:

  • 调用目标"compile"。目标意识到它依赖于目标的"构建jar"
  • 在执行目标"编译"之前。首先调用目标"build-jar"
  • 目标"构建jar"依赖于目标"test.if.jar.exists"
  • 在执行"build-jar"之前,它会调用Target"test.if.jar.exists"
  • 在Target"test.if.jar.exists"中,如果jar已经存在,则会设置属性jar.exists
  • 现在,Target"build-jar"处于活动状态,并查看是否设置了属性jar.exists。如果是,目标将不会执行
  • 最后,控件返回到Target"compile",然后执行

在这里,我不是直接执行命令。相反,我只指定了一个依赖层次结构,并让Ant准确地知道该做什么

如果依赖jar问题是一个大问题,您也可以查看Ivy。Ivy允许您创建Jar Repository。您的项目可以从这个存储库中获取所需的jar。这与Maven非常相似。事实上,Ant和Ivy可以使用Maven存储库。我们使用Artifactory,一个本地Maven存储库管理器,用于我们的Ant项目。

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

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

如果您声明要按顺序构建的那些"项目"反过来是Ant项目,那么您可能需要考虑将它们的任务转移到您的主构建文件中,只需使用正常的Ant依赖项来强制执行正确的构建顺序。

下面的代码将有助于对属性选择器标记生成的列表进行排序

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

相关内容

  • 没有找到相关文章

最新更新