5

我有一个带有名为“libs”的元素的宏定义

<macrodef name="deploy-libs">
    <element name="libs"/>
    <sequential>
        <copy todir="${glassfish.home}/glassfish/domains/domain1/lib">              
            <fileset dir="${lib}">
                <libs/>
            </fileset>
        </copy>
    </sequential>
</macrodef>

然后被调用为

<deploy-libs>
    <libs>
        <include name="mysql-connector-*.jar"/>
        <include name="junit-*.jar" />
        <!-- .... -->
    </libs>
</deploy-libs>

然后我有另一个宏定义,它调用几个宏定义,包括“deploy-libs”。如果这个宏定义也有一个元素“libs”,那就太好了,但是:

<macrodef name="init-glassfish">
    <element name="libs"/>
    <sequential>

        <!-- other stuff -->

        <deploy-libs>
            <libs>
                <libs/>
            </libs>
        </deploy-libs>

        <!-- other stuff -->

    </sequential>
</macrodef>

显然不起作用(因为<libs><libs/></libs>):

Commons/ant-glassfish-server.xml:116: unsupported element include

一个解决方案可能是以不同的方式命名“init-glassfish”中的元素:

<macrodef name="init-glassfish">
    <element name="libraries"/>
    <sequential>

        <!-- other stuff -->

        <deploy-libs>
            <libs>
                <libraries/>
            </libs>
        </deploy-libs>

        <!-- other stuff -->

    </sequential>
</macrodef>

有没有办法让两个宏定义以相同的方式命名元素?

4

2 回答 2

0

我找到了我的问题的解决方案,它使用路径 id 解决了原始问题

<macrodef name="deploy-libs">

    <attribute name="libraries-path-refid"/>

    <sequential>
         <copy todir="${glassfish.home}/glassfish/domains/domain1/lib">             
            <path refid="@{libraries-path-refid}"/>
         </copy>
    </sequential>
</macrodef>

现在这并不能解决嵌套元素标签的问题,但(XY 问题)解决了实际问题。很高兴知道是否有可能与原始问题类似。

于 2011-11-17T14:32:41.100 回答
0

显然,解决方案是<libs>根据宏嵌套的深度在原始调用中包装其他元素。当然,这是一个可怕的解决方案,因为它要求在调用时知道宏嵌套深度,例如:

<deploy-libs>
  <libs>
    <libs>
      <include name="mysql-connector-*.jar"/>
      <include name="junit-*.jar" />
      <!-- .... -->
    </libs>
  </libs>
</deploy-libs>

解决此问题的Ant 错误 29153不幸被解决为无效:(。

于 2014-08-01T08:00:33.010 回答