Как сообщить ant для сборки с использованием конкретного исполняемого файла javac?

Как я могу сказать ant использовать конкретный исполняемый файл javac из командной строки?

У меня есть установка gcj, встроенная как часть gcc, в библиотеку, которую мы распространяем, и я хотел бы иметь конкретную часть программного обеспечения Java, построенного против этого. Тем не менее, похоже, что используется system-gcc, и такие параметры, как "-Dbuild.compiler", похоже, хотят, чтобы я указывал какой-то класс Java, а не путь к файлу.

Я надеялся на что-то подобное CC в Make файлах.

Я уверен, что это действительно просто, и я просто глуп.


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

Ответ 1

Если вы используете Ant 1,6 или выше, вы можете установить атрибут javac fork="yes". Это дает вам возможность указать путь к исполняемому файлу при использовании jikes, jvc, gcj, sj или любой другой версии javac, которую вы используете.

  <javac srcdir="${src}"
         destdir="${build}"
         fork="yes"
         executable="/opt/java/jdk1.1/bin/javac"
         compiler="javac1.1"
  />

Ответ 2

Аргумент -D при вызове ant будет использовать свойство из командной строки внутри ant script. Форма, в которой он используется:

ant -Dmyvar=true

Где myvar - это имя свойства, а true - это значение, которое вы хотите использовать в script.

Самый простой способ - использовать свойство для исполняемых атрибутов javac.

 <target name="compile">  
   <javac srcdir="${src}"
     destdir="${build}"
     fork="${fork}"
     executable="${javac.executable}"
     compiler="${compiler}"/>  
 </target>

а затем в командной строке вы можете позвонить:

ant compile -Djavac.executable=/usr/bin/local/jdk/javac -Dsrc=/home/src -Dbuild=/home/build -Dcompiler=javac1.6 -Dfork=true

Ответ 3

На странице javac task:

Можно использовать разные компиляторы. Это можно определить либо установив глобальное свойство build.compiler, что повлияет все задачи во всей сборке, установив компилятор атрибут, специфичный для текущей задачи, или с помощью вложенного элемент любого типизированного или компонентного типа, который реализует org.apache.tools.ant.taskdefs.compilers.CompilerAdapter. Допустимые значения для свойства build.compiler или атрибута компилятора:

  • classic (стандартный компилятор JDK 1.1/1.2) - javac1.1 и javac1.2 могут использоваться как псевдонимы.
  • modern (стандартный компилятор JDK 1.3/1.4/1.5/1.6/1.7) - javac1.3 и javac1.4 и javac1.5 и javac1.6 и javac1.7 (поскольку Ant 1.8.2 ) могут использоваться как псевдонимы.
  • jikes (компилятор Jikes).
  • jvc (компилятор командной строки из Microsoft SDK для Java/Visual J ++) - microsoft можно использовать как псевдоним.
  • kjc (компилятор kopi).
  • gcj (компилятор gcj из gcc).
  • sj (компилятор Symantec java) - symantec может использоваться как псевдоним.
  • extJavac (запускается либо современная, либо классическая в собственном JVM).

Как я это прочитал, вам нужно написать класс, который реализует CompilerAdapter и использует ваш компилятор. Затем typedef эту задачу и использовать ее в атрибуте javac компилятора.

Ответ 4

Я сделал что-то подобное раньше, используя задачу Ant Exec. См. http://ant.apache.org/manual/Tasks/exec.html

Позволяет вам вызвать определенную системную команду. В нашем случае нам нужно было вызвать Delphi (не спрашивать), чтобы создать некоторую DLL для конкретного проекта. Команда exec также позволяет вам вызывать gcj вместо javac.