2014-12-02 2 views
1

Я бы назвал макрос внутри элемента другого макроса. Давайте предположим, что у меня есть следующий макрос:ant nesting macro call

<macrodef name="jc"> 
    <attribute name="name" /> 
    <attribute name="destdir" /> 
    <element name="fileset-list" optional="false" /> 
    <sequential> 
     <jar destfile="@{destdir}${file.separator}@{name}.jar" update="false"> 
      <fileset-list /> 
      <manifest> 
       <attribute name="Manifest-Version" value="1.0" />  
      </manifest> 
     </jar> 
    </sequential> 
</macrodef> 

и другой макрос

<macrodef name="defaultfs" description="Defines the default fileset"> 
    <attribute name="path" /> 
    <sequential> 
     <fileset dir="${dir.build.classes}"> 
      <include name="@{path}/**/*.class" /> 
     </fileset> 
     <fileset dir="${src.ehs}"> 
      <include name="@{path}/**/icons/**" /> 
      <include name="@{path}/**/sounds/**" /> 
      <include name="@{path}/**/*.gif" /> 
      <include name="@{path}/**/*.png" /> 
      <include name="@{path}/**/*.wav" /> 
      <include name="@{path}/**/*.jpg" /> 
      <include name="@{path}/**/*.properties" /> 
      <include name="@{path}/**/*.xml" /> 
      <include name="@{path}/**/jaxb.index" /> 
     </fileset> 
    </sequential> 
</macrodef> 

Я использую эти макросы следующим образом:

<jc destdir="${dir.build.jar}" name="thejar"> 
    <fileset-list> 
     <defaultfs path="org/path/inner" /> 
    </fileset-list> 
</jc> 

Что я получаю следующее сообщение об ошибке:

jar doesn't support the nested "defaultfs" element. 

Что не так?

+0

Задача ANT «jar» не была написана для поддержки XML-элемента «defaultfs». Макросы в ANT - это нечто иное, они больше похожи на шаблоны. –

+0

Вы правы, но мое требование - использовать jc более широким образом, и у меня есть jar, которые строятся с похожим набором файлов. Являются ли макросы оценены только один раз? – landal79

+0

У меня есть аналогичный случай, когда я хочу использовать макрос внутри (неявного) элемента для макроса. Пока не выяснили, как - или если это возможно - получить внутренний макрос, который был оценен перед внешним макросом. Если вы можете найти ответ на этот вопрос, я определенно заинтересован! (И нет, объединение двух макросов не является ответом - я хочу, чтобы каждый из них действовал независимо, как если бы это была обычная задача Ant, без того, чтобы пользователи знали, что это макросы.) – keshlam

ответ

0

Вы могли бы попробовать сделать вызов макроса в главной макро «JC» и передать FileSet путь рассматривать как дополнительный атрибут

<macrodef name="jc"> 
    <attribute name="name" /> 
    <attribute name="destdir" /> 
    <attribute name="fileset.path.to.consider" /> 
    <sequential> 
     <jar destfile="@{destdir}${file.separator}@{name}.jar" update="false"> 
      <defaultfs path="@{fileset.path.to.consider}"/> 
      <manifest> 
       <attribute name="Manifest-Version" value="1.0" /> 
      </manifest> 
     </jar> 
    </sequential> 
</macrodef> 

И тогда ваш главный Макровызов может выглядеть следующим образом:

<jc destdir="${dir.build.jar}" name="thejar" fileset.path.to.consider="org/path/inner"/> 

(не тестировалось, вы могли бы попробовать)

+0

Спасибо, но это не то, что я хочу. – landal79