使用Property值作为Key从Properties文件中读取另一个值

时间:2014-09-08 10:33:10

标签: ant

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

p.buildpath=c:\production\build

d.buildpath=c:\development\build

我写了以下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:\&GT;蚂蚁

我得到以下输出:

  

Buildfile:C:\ build.xml

     

信息:       [输入]请输入服务器名称(p:生产,d:开发)? (p,d)
  p
           [echo]您的服务器类型:p
           [echo]新物业价值:p.buildpath
           [echo]构建路径:$ {$ {newProperty}}

     

建立成功的作用   总时间:2秒

我想回应一下&#34; Build Path&#34;值与p.buildpath值相同。 在上述情况下怎么办?

4 个答案:

答案 0 :(得分:3)

采用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:\production\build
d.buildpath=c:\development\build

你会得到类似的东西:

[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

解决的非常类似的问题

答案 1 :(得分:1)

你可以无需其他工具这样做(编辑/修订版):

<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被视为真,则第二个(如果不是)unlesss)。

针对名为buildstage.production的属性检查条件,该属性设置为属性键p.buildpath作为鉴别符。

使用“属性键”我引用属性文件中的键。这里有一堆“属性”可能令人困惑:)

顺便说一句:您需要在属性值中转义反斜杠,如下所示,否则它们将不会被回显:

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

答案 2 :(得分:0)

在这篇文章(http://ant.apache.org/faq#propertyvalue-as-name-for-property)中如何说明,没有任何外部帮助,这很棘手。

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

无论如何,同一篇文章还有其他选择。 希望它可以帮到你。

答案 3 :(得分:0)

有一种更简单的方法,不需要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}'"/>