2011-11-17 27 views
5

我有一种被称为元素“库”蚂蚁macrodefs和元素命名

<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> 

然后我有另一个macrodef它调用几个macrodefs包括“一个macrodef部署-库”。这将是很好,如果这macrodef有一个元素“库”太多,但:

<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> 

有没有办法有两个macrodefs以同样的方式被命名为元素?

回答

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问题)解决实际问题解决了原来的问题。如果知道与原始问题类似的东西是否可能,仍然会很高兴。

0

显然,解决方案是在原始调用中包装额外的<libs>元素,具体取决于宏嵌套的深度。当然,这是一个可怕的解决方案,因为它要求宏嵌套深度上调用,例如:

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

Ant bug 29153解决这个问题很不幸解析为无效 :(。