使用属性值作为键从属性文件中读取另一个值



对于Ant脚本,我有以下myBuild.properties文件

p.buildpath=c:productionbuild
d.buildpath=c:developmentbuild

我写了以下build.xml:

<?xml version="1.0"?>
<project name="Test Project" default="info">
    <property file="myBuild.properties"/>
      <target name="info">
        <input
            message="Please enter the Server Name(p: production, d: development)?"
            validargs="p,d"
            addproperty="do.Server"
        />
    <echo>Your Server type: ${do.Server} </echo>
    <property name="myserv.buildpath" value="${do.Server}.buildpath" />
    <property name="newProperty" value="${myserv.buildpath}" />
    <echo>New Property Value: ${newProperty}</echo>
    <!-- Following is an incorrect syntax -->
    <echo>Build Path: ${${newProperty}}</echo>
  </target>
</project>

当我使用运行它时

c: 蚂蚁

我得到以下输出:

构建文件:C:\build.xml

信息:[input]请输入服务器名称(p:production,d:development)?(p,d)
p
[echo]您的服务器类型:p
[echo]新属性值:p.buildpath
[echo]构建路径:${${newProperty}}

成功构建
总时间:2秒

我想回显与p.buildpath值相同的"构建路径"值。在上面的情况下怎么可能呢?

根据Ant Faq的macrodef建议,您不需要像antcontrib这样的Ant插件,这是万无一失的:

<project>
  <macrodef name="cp_property">
   <attribute name="name"/>
   <attribute name="from"/>
   <sequential>
    <property name="@{name}" value="${@{from}}"/>
   </sequential>
  </macrodef>
  <property file="myBuild.properties"/>
   <input
    message="Please enter the Server Name(p: production, d: development)?"
    validargs="p,d"
    addproperty="do.Server"
   />
    <echo>Your Server type: ${do.Server}</echo>
   <cp_property name="myserv.buildpath" from="${do.Server}.buildpath"/>  
   <echo>$${myserv.buildpath} : ${myserv.buildpath}</echo>
</project>

输出:

[input] Please enter the Server Name(p: production, d: development)? (p, d)
p
[echo] Your Server type: p
[echo] ${myserv.buildpath} : c:/production/build

顺便说一句。在您的属性文件中,您需要将路径分隔符更改为unix style '/'(当打开windows时,蚂蚁会正确处理)或double '\',否则使用:

p.buildpath=c:productionbuild
d.buildpath=c:developmentbuild

你会得到这样的东西:

[input] Please enter the Server Name(p: production, d: development)? (p, d)
p
[echo] Your Server type: p
[echo] ${myserv.buildpath} : c:productionbuild

另请参阅https://stackoverflow.com/a/25681686/130683对于用Props antlib 解决的一个非常相似的问题

您可以通过这种方式(编辑/修订版)在不使用其他工具的情况下执行

<project name="Test Project" default="info">
    <property file="myBuild.properties"/>
        <target name="info">
            <input
                message="Please enter the Server Name(p: production, d: development)?"
                validargs="p,d"
                addproperty="do.Server"
            />
        <echo>Your Server type: ${do.Server} </echo>
        <property name="buildstage.production" value="p.buildpath" />
        <property name="myserv.buildpath" value="${do.Server}.buildpath" />
        <echo>New Property Value: ${myserv.buildpath}</echo>
        <condition property="isProduction">
            <equals arg1="${buildstage.production}" arg2="${myserv.buildpath}" />
        </condition>
        <antcall target="production" />
        <antcall target="development" />
    </target>
    <target name="production" if="${isProduction}">
        <echo>Build Path: ${p.buildpath}</echo>
    </target>
    <target name="development" unless="${isProduction}">
        <echo>Build Path: ${d.buildpath}</echo>
    </target>
 </project>

核心思想使用<conditional>任务对选定的属性密钥进行测试,并调用两个名为productiondevelopment的任务,其中第一个任务在属性isProduction为true时运行,第二个任务在不为true时(unlesss)运行。

对照名为buildstage.production的属性检查该条件,该属性被设置为属性关键字p.buildpath作为鉴别器。

通过"属性键",我引用了属性文件中的键。这里的一堆"属性"可能会令人困惑:)

顺便说一句:您需要按如下方式转义属性值中的反斜杠,否则它们将不会被响应:

p.buildpath=c:\production\build
d.buildpath=c:\development\build

这篇文章是怎么说的(http://ant.apache.org/faq#propertyvalue-作为属性的名称),在没有任何外部帮助的情况下,这很棘手。

使用AntContrib(外部任务库),您可以执行<propertycopy name="prop" from="${anotherprop}"/>

不管怎样,在同一篇文章中还有其他选择。希望它能帮助你。

有一种更简单的方法不需要macrodef或antcontrib:

<property name="a" value="Hello"/>
<property name="newProperty" value="a"/>
<loadresource property="b">
    <propertyresource name="${newProperty}"/>
</loadresource>
<echo message="a='${a}'"/>
<echo message="b='${b}'"/>

相关内容

  • 没有找到相关文章