在从Ant运行的javascript中,如何获得参数值?

时间:2013-04-19 04:48:30

标签: java javascript ant

我在Ant中定义了一个macrodef,并使用javascript来完成工作。在这种情况下,我要验证timezone

<macrodef name="validateTimeZone">
    <attribute name="zone" />
    <sequential>
        <echo>result: ${envTZResult}</echo>
        <echo>  validating timezone: @{zone}</echo>
        <script language="javascript"><![CDATA[
            importClass(java.util.TimeZone);
            importClass(java.util.Arrays);
            var tz = project.getProperty("zone");
            println("    got attribute: " + tz);
            var result = Arrays.asList(TimeZone.getAvailableIDs()).contains(tz); //testing if timezone is known
            project.setProperty("zoneIsValid", result);
        ]]> 
        </script>
    </sequential>
</macrodef>

问题是project.getProperty()没有检索传递属性的值。有人知道如何从javascript中获取属性的值吗?

2 个答案:

答案 0 :(得分:11)

原来我使用了错误的标签类型。要使用脚本来定义ant任务,我应该使用scriptdef而不是macrodef。使用scriptdef,可以使用预定义的对象来访问任务中的属性和嵌套元素。

这适用于从Ant中访问javascript中的属性:

<scriptdef name="validateTimeZone" language="javascript">
    <attribute name="zone" />
    <![CDATA[
        importClass(java.util.TimeZone);
        importClass(java.util.Arrays);
        var tz = attributes.get("zone"); //get attribute defined for scriptdef
        println("    got attribute: " + tz);
        var result = Arrays.asList(TimeZone.getAvailableIDs()).contains(tz); //testing if timezone is known
        project.setProperty("zoneIsValid", result);
    ]]> 
</scriptdef>

答案 1 :(得分:5)

最好是创建一个属性为值的属性,即

<macrodef name="validateTimeZone">
    <attribute name="zone" />
    <sequential>
        <echo>result: ${envTZResult}</echo>
        <echo>  validating timezone: @{zone}</echo>
        <!-- edit use local with ant 1.8.x -->
        <local name="zone"/>
        <property name="zone" value="@{zone}"/>
        <script language="javascript"><![CDATA[
            importClass(java.util.TimeZone);
            importClass(java.util.Arrays);
            var tz = project.getProperty("zone");
            println("    got attribute: " + tz);
            var result = Arrays.asList(TimeZone.getAvailableIDs()).contains(tz); //testing if timezone is known
            project.setProperty("zoneIsValid", result);
        ]]> 
        </script>
    </sequential>
</macrodef>