Как я могу передать список источников для компиляции в задачу javac? - PullRequest
1 голос
/ 11 марта 2010

Как я могу заставить задачу javac использовать существующий набор файлов?В моем build.xml я создал несколько наборов файлов, которые будут использоваться в разных местах файла сборки.Вот как они были определены:

<fileset dir = "${src}"  
    id       = "java.source.all">  
 <include name =  "**/*.java" />  
</fileset>  

<fileset dir = "${src}"  
    id       = "java.source.examples">  
  <include name = "**/Examples/**/*.java" />  
</fileset>  

<fileset dir = "${src}"  
    id       = "java.source.tests">  
  <include name = "**/Tests/*.java" />
</fileset>

<fileset dir = "${src}"
    id       = "java.source.project">
  <include name = "**/*.java"             />
  <exclude name = "**/Examples/**/*.java" />
  <exclude name = "**/Tests/**/*.java"    />
</fileset>

Я также использовал macrodef для компиляции java-файлов, поэтому задачу javac не нужно повторять несколько раз.Макрос выглядит так:

<macrodef name="compile">
  <attribute name="sourceref"/>
  <sequential>
    <javac srcdir         = "${src}"
        destdir           = "${build}"
        classpathref      = "classpath"
        includeantruntime = "no"
        debug             = "${debug}">
      <filelist dir="." files="@{sourceref}" />  <-- email is about this
   </javac>
 </sequential>

Я пытаюсь скомпилировать только те классы, которые необходимы для конкретных целей, а не все цели в исходном дереве.И делать это без необходимости указывать файлы каждый раз.Вот как определяются цели:

<target name = "compile-examples"
    depends  = "init">
  <compile sourceref = "${toString:java.source.examples}" />
</target>

<target name = "compile-project"
    depends  = "init">
  <compile sourceref = "${toString:java.source.project}" />
</target>

<target name = "compile-tests"
    depends  = "init">
  <compile sourceref = "${toString:java.source.tests}" />
</target>

Как видите, каждая цель указывает java-файлы, которые должны быть скомпилированы в виде списка абсолютных имен файлов, разделенных символом двоеточия.Единственная проблема в том, что javac не поддерживает список файлов.Он также не поддерживает набор файлов, путь или набор путей.Я пытался использовать, но он рассматривает список как одно имя файла.Еще я попробовал отправить ссылку напрямую (без использования toString) и использовать, но include, не имеет атрибута ref.

ТАК ВОПРОС: Как вы получаете задачу javac для использования ссылки на набор файлов?это было определено в другой части файла сборки?Я не заинтересован в решениях, которые заставляют меня иметь несколько задач javac.Полностью переписать макрос можно.Изменения в целях также допустимы при условии, что избыточный код между целями поддерживается на минимуме.

ps Другая проблема заключается в том, что набор файлов хочет получить список через запятую.Я только сделал краткий поиск способа преобразования точек с запятой в запятые и не нашел способа сделать это.

pps Извините за вопли, но некоторые люди слишком быстры, чтобы публиковать ответы, не относящиеся к теме.

Ответы [ 3 ]

1 голос
/ 12 марта 2010

Если я правильно понимаю ваш вопрос, то комбинация antcall и pathconvert задач должна сработать.

Pathconvert может использоваться для разделения запятых в списке включенных файлов. (Я не понимаю, что за точка с запятой вы упоминаете при прохождении, но вы, вероятно, можете настроить вызов pathconvert для решения этой проблемы.) Использование antcall в макросе позволяет передавать разные ссылочные идентификаторы наборов файлов для каждой компиляции.

Вот пример, который иллюстрирует:

<fileset id="file.set1" dir="." includes="TestT*.java" />
<fileset id="file.set2" dir="." includes="TestF*.java" />

<macrodef name="compile">
  <attribute name="sourceref"/>
  <sequential>
    <antcall target="compile_inner">
      <reference refid="@{sourceref}" torefid="inner.file.set" />
    </antcall>
  </sequential>
</macrodef>

<target name="comp">
  <compile sourceref="file.set1" />
  <compile sourceref="file.set2" />
</target>

<target name="compile_inner">
  <pathconvert pathsep=" " property="file.list" refid="inner.file.set">
    <map from="${basedir}/" to="" />
  </pathconvert>
  <javac srcdir         = "${src}"
      destdir           = "${build}"
      includeantruntime = "no"
      includes          = "${file.list}"
      debug             = "${debug}"
      listfiles         = "yes">
  </javac>
</target>

Запуск цели comp с файлами

TestFive.java TestFour.java TestOne.java TestSix.java TestThree.java TestTwo.java

в директории ${src}:

comp:

compile_inner:
    [javac] Compiling 2 source files to /Users/mc/stack_overflow/ant/javac
    [javac] /Users/mc/stack_overflow/ant/javac/TestThree.java
    [javac] /Users/mc/stack_overflow/ant/javac/TestTwo.java

compile_inner:
    [javac] Compiling 2 source files to /Users/mc/stack_overflow/ant/javac
    [javac] /Users/mc/stack_overflow/ant/javac/TestFive.java
    [javac] /Users/mc/stack_overflow/ant/javac/TestFour.java

BUILD SUCCESSFUL
0 голосов
/ 29 марта 2018

Может быть, иногда проще использовать свойства для определенных каталогов, а затем patternset, в которые «группы» включают / исключают.Тогда можно использовать тот же patternset через refid в других задачах - например, javac или javadoc.

<patternset id="source_patterns">
    <include name="**/*.java"/>
    <exclude name="excluded_path/*.java" unless="some_prop"/>
</patternset>

<target name="compile">
    <javac srcdir="${sources_dir}">
       <patternset refid="source_patterns"/>
    </javac>
</target>

<target name="doc">
    <javadoc ...>
       <fileset dir="${sources_dir}">
           <patternset refid="source_patterns"/>
       </fileset>
    </javadoc>
</target>
0 голосов
/ 13 марта 2010

Спасибо! PathConvert решил проблему. Изменение тела макроса на это позволило передать список файлов в:

<sequential>
  <local name = "sources" />
  <pathconvert refid = "@{sourceref}"
      property       = "sources"
      pathsep        = "," />
  <javac srcdir         = "${src}"
      destdir           = "${build}"
      classpathref      = "classpath"
      includes          = "${sources}"
      includeantruntime = "no"
      debug             = "${debug}" />
</sequential>  

С этим я мог бы также сбросить toString в вызове макроса и передать ссылку напрямую. Обратите внимание, что toString превращает ссылку в список, разделенный точкой с запятой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...