ant replaceregexp,与变量/属性匹配

时间:2014-06-10 07:37:51

标签: xml regex ant

这应该是一个常见的问题,但我无法弄清楚如何去做,希望能在这里提供一些指导。

问题:

我需要使用ant替换一组XML配置文件(weblogic config.xml文件)中的一些但不是所有应用程序版本(ant-contrib也可以使用)。

我有一个应该有新版本集的应用程序列表,以及它们应该具有的版本,并且我有需要替换的配置文件。

到目前为止我走的道路:

我创建了一个带三个参数的宏;应用程序名称,应用程序版本和配置文件

这将从循环中调用。

这就是我现在所拥有的:

<macrodef name="update-template-config-file">
  <attribute name="application-name" />
  <attribute name="application-version" />
  <attribute name="config-file-name" />

  <sequential>

    <local name="match-string"/>
    <local name="replace-string"/>
    <property name="match-string" value="@{application-name}#[0-9](\.[0-9])*"/>
    <property name="replace-string" value="@{application-name}#@{application-version}"/>

    <echo>match ${match-string} replace: ${replace-string} in @{config-file-name}</echo>

    <replaceregexp file="@{config-file-name}"
      match="${match-string}"
      replace="${replace-string}"
      byline="true"/>
  </sequential>

</macrodef>

所以这个问题是,replaceregexp的匹配部分被解释为正则表达式(正确),我想知道是否有办法使用&#39; match-string&#39的值;财产而不是它的名称。

解决方法:

从ant脚本中,通过回显每个循环的替换指令来创建一个新的ant脚本,然后调用创建的ant文件来执行替换。

为了完整性,请调用宏的目标

<target name="update-template-config-files">
  <for param="config-file">
     <path>
       <fileset dir="${RP_CONTENT_ROOT_DIR}/domain_templates" includes="**/config.xml"/>
     </path>
    <sequential>
      <for param="application-file">
        <path>
          <fileset dir="${STAGE_ROOT}/applications" includes="*.*"/>
        </path>
        <sequential>
          <local name="filename"/>
          <basename property="filename" file="@{application-file}"/>
          <update-template-config-file application-name="${filename}" application-version="5.1.0.3.0" config-file-name="@{config-file}" />
        </sequential>
      </for>
    </sequential>
  </for>
</target>

1 个答案:

答案 0 :(得分:0)

我的脚本出错,忘了从应用程序名称中删除后缀。

感谢vio1331让我再一次看回声线。

查找以下更新的代码段(但仅适用于ear文件)

<target name="update-template-config-files">
  <for param="config-file">
     <path>
       <fileset dir="${RP_CONTENT_ROOT_DIR}/domain_templates" includes="**/config.xml"/>
     </path>
    <sequential>
      <for param="application-file">
        <path>
          <fileset dir="${STAGE_ROOT}/wlng/applications" includes="*.ear"/>
        </path>
        <sequential>
        <local name="filename"/>
        <basename property="filename" file="@{application-file}" suffix=".ear"/>
        <update-template-config-file application-name="${filename}" application-version="5.1.0.3.0" config-file-name="@{config-file}" />
        </sequential>
      </for>
    </sequential>
  </for>
</target>