【问题标题】:list from <propertyselector> does not work with <for><propertyselector> 中的列表不适用于 <for>
【发布时间】:2014-08-08 09:12:25
【问题描述】:

我很难让以下 Apache Ant 脚本正常工作。这个想法是将属性值从具有特定前缀的属性复制到没有前缀的属性。

<project name="scp.result.files">
    <taskdef resource="net/sf/antcontrib/antlib.xml" />

    <property name="prop.a.sub1" value="a" />
    <property name="prop.b.extra2" value="b" />
    <property name="prop.c.foo" value="c" />
    <property name="prop.d.foo" value="not selected" />

    <target name="prep-props">
        <!-- Select all interesting properties. -->
        <propertyselector property="prop.list"
                          delimiter=","
                          match="prop\.(a|b|c)\..+"
                          casesensitive="false"
                          override="true" />
        <echo message="matched properties: ${prop.list}" />

        <!-- For each selected property, set a property without the "prop." prefix. -->
        <for param="prop" list="${prop.list}" delimiter="," trim="true">
            <propertyregex property="dest.prop"
                           input="@{prop}"
                           regex="prop\.((a|b|c)\..+)"
                           select="\1"
                           overrride="true" />
            <propertycopy name="${dest.prop}"
                          from="prop.${dest.prop}"
                          override="true" />
            <propertycopy name="_pval" from="${dest.prop}" override="true" />
            <echo message="${dest.prop} is ${_pval}" />
        </for>
    </target>
</project>

不幸的是,上面的脚本为我产生了以下错误。

BUILD FAILED
C:\test.xml:19: Invalid type class net.sf.antcontrib.property.RegexTask used in For task, it does not have a public iterator method
        at net.sf.antcontrib.logic.ForTask$ReflectIterator.<init>(ForTask.java:450)
        at net.sf.antcontrib.logic.ForTask.add(ForTask.java:411)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.apache.tools.ant.IntrospectionHelper$13.create(IntrospectionHelper.java:1552)
        at org.apache.tools.ant.IntrospectionHelper$Creator.create(IntrospectionHelper.java:1329)
        at org.apache.tools.ant.UnknownElement.handleChild(UnknownElement.java:574)
        at org.apache.tools.ant.UnknownElement.handleChildren(UnknownElement.java:358)
        at org.apache.tools.ant.UnknownElement.configure(UnknownElement.java:204)
        at org.apache.tools.ant.UnknownElement.maybeConfigure(UnknownElement.java:163)
        at org.apache.tools.ant.Task.perform(Task.java:347)
        at org.apache.tools.ant.Target.execute(Target.java:435)
        at org.apache.tools.ant.Target.performTasks(Target.java:456)
        at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1393)
        at org.apache.tools.ant.Project.executeTarget(Project.java:1364)
        at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
        at org.apache.tools.ant.Project.executeTargets(Project.java:1248)
        at org.apache.tools.ant.Main.runBuild(Main.java:851)
        at org.apache.tools.ant.Main.startAnt(Main.java:235)
        at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
        at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)

可以解决这个问题吗?是否有任何其他方法可以迭代选定的属性列表并获取无前缀的属性集?

【问题讨论】:

    标签: ant ant-contrib


    【解决方案1】:

    for 的每次迭代要执行的任务列表需要放在 sequential 元素内,否则 propertyregex 将被视为 for 任务将迭代的“列表”。 propertyregex 也使用 regexp 而不是 regex(查看其文档)。

    <for param="prop" list="${prop.list}" delimiter="," trim="true">
        <sequential>
            <propertyregex property="dest.prop"
                       input="@{prop}"
                       regexp="prop\.((a|b|c)\..+)"
                       select="\1"
                       overrride="true" />
            <propertycopy name="${dest.prop}"
                       from="prop.${dest.prop}"
                       override="true" />
            <propertycopy name="_pval" from="${dest.prop}" override="true" />
            <echo message="${dest.prop} is ${_pval}" />
        </sequential>
    </for>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-08
      • 1970-01-01
      • 2020-07-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      • 1970-01-01
      • 2023-03-02
      相关资源
      最近更新 更多