2010-01-26 4 views
4

Мне нужно написать объект Ant, который добавляет вместе (с разделителями-запятыми) список имен файлов «.jar» из папки в переменную, которая позже будет использоваться в качестве входных данных для внешней утилиты. Я сталкиваюсь с барьерами масштаба и неизменности. У меня есть доступ к ant-contrib, но, к сожалению, в версии, с которой я застрял, нет доступа к задаче «для». Вот то, что я до сих пор:Как создать список имен файлов?

<target name="getPrependJars"> 
    <var name="prependJars" value="" /> 
    <foreach param="file" target="appendJarPath"> 
     <path> 
      <fileset dir="${project.name}/hotfixes"> 
       <include name="*.jar"/> 
      </fileset> 
     </path>   
    </foreach> 

    <echo message="result ${prependJars}" /> 
</target> 


<target name="appendJarPath"> 
    <if> 
     <equals arg1="${prependJars}" arg2="" /> 
     <then> 
      <var name="prependJars" value="-prependJars ${file}" /> 
     </then> 
     <else> 
      <var name="prependJars" value="${prependJars},${file}" /> 
     </else> 
    </if>  
</target> 

кажется, что «appendJarPath» только модифицирует «prependJars» в пределах своей собственной области. В качестве теста я попытался использовать «antcallback», который работает для одного целевого вызова, но не очень помогает мне в моем списке файлов.

Я понимаю, что я немного работаю против зерна, и лексический охват желателен в подавляющем большинстве случаев, но я действительно хотел бы, чтобы это работало так или иначе. У кого-нибудь есть творческие идеи для решения этой проблемы?

ответ

9

Вы можете быть в состоянии использовать pathconvert task, который позволяет указать разделитель в виде запятой.

<target name="getPrependJars"> 
    <fileset id="appendJars" dir="${project.name}/hotfixes"> 
     <include name="*.jar" /> 
    </fileset> 
    <pathconvert property="prependJars" refid="appendJars" pathsep="," /> 

    <echo message="prependJars: ${prependJars}" /> 
</target> 
+0

это прекрасно! Спасибо! – AndreiM

2

Я просто написал пользовательскую задачу на Java, которая (1) принимает имя папки, (2) собирает строку результатов и (3) сохраняет ее в свойство $ {prependJars}.

В ant вы просто определяете задачу (taskdef) и используете как и все остальные задачи после этого.

Я сделал это один раз, когда столкнулся с проблемой simliar и обнаружил, что это очень и очень просто.

Вот tutorial.

2

Если формат системы путь полезен для вас, вы можете использовать следующее:

<target name="getPrependJars"> 
    <path id="prepend.jars.path"> 
     <fileset dir="${project.name}/hotfixes"> 
      <include name="*.jar"/> 
     </fileset> 
    </path>   
    <property name="prependJars" value="${toString:prepend.jars.path}" /> 

    <echo message="result ${prependJars}" /> 
</target> 
+0

is '$ {toString: jars.path}' опечатка? Должно ли это вместо '$ {toString: prepend.jars.path}'? – tresf

+1

@QZПоддержка, похоже, что это :) хороший улов. – rsp