2014-09-04 64 views
2

我正在使用輸入任務來收集特定的屬性值,我想將它們連接成一個引用我的屬性文件的屬性值。在Ant中,我如何動態地構建引用屬性文件的屬性?

我可以生成屬性的格式,但在運行時將它視爲字符串而不是屬性引用。

實施例的屬性文件:

# build.properties 

# Some Server Credentials 
west.1.server = TaPwxOsa 
west.2.server = DQmCIizF 
east.1.server = ZCTgqq9A 

實施例建立的文件:

<property file="build.properties"/> 
<target name="login"> 
<input message="Enter Location:" addproperty="loc" />  
<input message="Enter Sandbox:" addproperty="box" /> 
<property name="token" value="\$\{${loc}.${box}.server}" /> 
<echo message="${token}"/> 
</target> 

當我打電話登錄並提供輸入值 「西」, 「1」,回聲將打印$ {西.1.server}但它不會從屬性文件中檢索屬性值。

如果我硬編碼消息中的屬性值:

<echo message="${west.1.server}"/> 

則Ant會盡職盡責地檢索從屬性文件中的字符串。

我該如何讓Ant接受動態生成的屬性值並將其視爲要從屬性文件中檢索的屬性?

+0

見螞蟻常見問題爲構建在現有屬性的新屬性=> http://ant.apache.org/faq.html#propertyvalue-as-name- for-property Ian的答案使用了propertycopy macrodef中提到的hack。 – Rebse 2014-09-04 22:42:54

+0

查看https://github.com/apache/ant-antlibs-props查看道具antlib的來源 - 儘管build.xml不起作用,但../antunit文件夾中有一些例子可以幫助您。這裏有一個可能的下載=> http://www.java2s.com/Code/JarDownload/ant-props/ant-props-1.0Alpha.jar.zip - 否則搜索互聯網的那個罐子或使用nexus。道具antlib工作正常。 – Rebse 2014-09-04 22:51:20

+0

感謝您的好鏈接,FAQ正是解決方案,從下載中抓取了.jar,並獲得了嵌套屬性,可以按需要工作! – AlwaysThinkin 2014-09-09 23:13:04

回答

1

附加例子。
需要Ant> = 1.8.0(適用於最新的Ant版本1.9.4) 和Props antlib二進制文件。

官方Props antlib GIT Repository(或here)當前的build.xml不起作用開箱:

BUILD FAILED 
Target "compile" does not exist in the project "props". 

獲取的props antlib的來源和文件系統解壓。
獲取的antlibs-common來源和解壓內容../ant-antlibs-props-master/common
運行ant antlib建設的jar:

[jar] Building jar: c:\area51\ant-antlibs-props-master\build\lib\ant-props-1.0Alpha.jar 

否則從MVNRepositoryhere

得到的二進制文件

../antunit中的示例非常有用。 對於嵌套屬性請看nested-test.xml
將ant-props.jar放在ant類路徑上。

<project xmlns:props="antlib:org.apache.ant.props"> 

<!-- Activate Props antlib --> 
<propertyhelper> 
    <props:nested/> 
</propertyhelper> 

<property file="build.properties"/> 

<input message="Enter Location:" addproperty="loc" />  
<input message="Enter Sandbox:" addproperty="box" /> 
<property name="token" value="${${loc}.${box}.server}"/> 

<echo message="${token}"/> 

</project> 

輸出:

Buildfile: c:\area51\ant\tryme.xml 
    [input] Enter Location: 
west 
    [input] Enter Sandbox: 
1 
    [echo] TaPwxOsa 

BUILD SUCCESSFUL 
Total time: 4 seconds 
6

props antlib爲此提供了支持,但據我所知目前還沒有二進制版本,所以您必須從源代碼構建它。

另一種方法將是使用一個macrodef:使用Props antlib

<macrodef name="setToken"> 
    <attribute name="loc"/> 
    <attribute name="box"/> 
    <sequential> 
    <property name="token" value="${@{loc}[email protected]{box}.server}" /> 
    </sequential> 
</macrodef> 
<setToken loc="${loc}" box="${box}"/>