我有一个带有一个名为" libs"
的元素的macrodef<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调用几个macrodef,包括&#34; deploy-libs&#34;。如果这个macrodef有一个元素&#34; libs&#34;那将是很好的。但是:
<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
解决方案可以是在&#34; init-glassfish&#34;中命名元素。以不同的方式:
<macrodef name="init-glassfish">
<element name="libraries"/>
<sequential>
<!-- other stuff -->
<deploy-libs>
<libs>
<libraries/>
</libs>
</deploy-libs>
<!-- other stuff -->
</sequential>
</macrodef>
有没有办法让两个macrodef以相同的方式命名元素?
答案 0 :(得分: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问题)解决了实际问题。如果能够找到与原始问题类似的东西,那将是一件好事。
答案 1 :(得分:0)
显然,解决方案是在原始调用中包含额外的<libs>
元素,具体取决于宏的嵌套深度。当然这是一个可怕的解决方案,因为它要求在调用时知道宏嵌套深度,例如:
<deploy-libs>
<libs>
<libs>
<include name="mysql-connector-*.jar"/>
<include name="junit-*.jar" />
<!-- .... -->
</libs>
</libs>
</deploy-libs>
Ant bug 29153很遗憾地解决了这个问题无效 :(。