Как сообщить 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.