Полное указание компилятора Eclipse из _within_ build.xml - PullRequest
8 голосов
/ 02 марта 2010

В качестве эксперимента мы хотим построить наши продукты с использованием Java-компилятора Eclipse (ecj-3.5.jar, загруженного с eclipse.org) на исполняемой версии Java 6 вместо JDK, и, насколько я понимаю, это добавление этого jar-файла в classpath ant и установка свойства build.compiler, указывающего на адаптер.

Включая

<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter" />

в моем build.xml и при вызове ant с помощью JRE я получаю ожидаемую ошибку, что адаптер не может быть найден, и, добавив ecj-3.5.jar в путь к классам на панели Eclipse, я могу скомпилировать свой код, как и ожидалось. Я полагаю, что та же функциональность будет доступна с "-lib foo.jar" из командной строки с современными муравьями.

Теперь я хочу указать из в build.xml, что я хочу, чтобы ecj-3.5.jar на моем пути к классам удовлетворял тем же, что и выше. Мы уже можем сделать это с помощью задач муравья, поэтому я считаю, что это возможно.

Таким образом, вопрос заключается в следующем: как я могу добавить к пути к классам, используемому javac для поиска компилятора только из build.xml?


Похоже, что в предстоящем ant4eclipse 1.0 будет включен компилятор Eclipse (для этого я и хотел использовать это), поэтому обновление до версии (с версии 0.5) должно решить проблему, которая у нас есть.


2010-09-24: Ant4Eclipse все еще находится на M4 без указания того, когда будет выпущен релиз.


2011-12-01: Мы перешли с муравья на мавена. Сценарии build.xml достигли уровня сложности, и потребовался новый подход. Любой, кому нужно выбрать, что делать - не идите по пути ant4eclipse, за исключением тривиальных проектов.


2012-11-30: Год спустя опыт maven все еще в основном хорош. Существует множество причуд и изменений в мышлении, но большинство имеет смысл в контексте. Maven может легко указать уровень компилятора для отдельных проектов. Мы рассматриваем использование ecj вместо javac (по нескольким причинам), но для большинства целей javac работает хорошо.

Ответы [ 2 ]

11 голосов
/ 02 марта 2010

Один из способов - указать ссылку на componentdef при использовании javac.

<componentdef name="ecj" 
              classname="org.eclipse.jdt.core.JDTCompilerAdapter" 
              classpath="ecj-3.7.1.jar" />

<javac ....>
  <ecj/>
</javac>

Другой вариант - установить build.compiler как у вас или атрибут компилятора для javac, а затем указать путь к компилятору для javac. Это обычная структура, похожая на путь для хранения пути к классам для загрузки вашего адаптера компилятора.

<javac compiler="org.eclipse.jdt.core.JDTCompilerAdapter" ....>
  <compilerclasspath>
     ...
  </compilerclasspath>
</javac>

Более подробную информацию смотрите в документации javac task в руководстве по Ant. Обратите внимание, что оба эти решения работают только с Ant 1.8 и выше.

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

Чтение Запуск Ant через Java . Я думаю, что вы можете написать простую оболочку, которая правильно установит путь к классу и добавит ваш jar-файл к полученному пути к классу.

Здесь я просто вырезаю и вставляю образец из вышеуказанной ссылки с добавлением интересующей вас библиотеки в classpath:

<java
        classname="org.apache.tools.ant.launch.Launcher"
        fork="true"
        failonerror="true"
        dir="${sub.builddir}"
        timeout="4000000"
        taskname="startAnt"
>
    <classpath>
        <pathelement location="${ant.home}/lib/ant-launcher.jar"/>
        <pathelement location="/path/to/ecj-3.5.jar"/>
    </classpath>
    <arg value="-buildfile"/>
    <arg file="${sub.buildfile}"/>
    <arg value="-Dthis=this"/>
    <arg value="-Dthat=that"/>
    <arg value="-Dbasedir=${sub.builddir}"/>
    <arg value="-Dthe.other=the.other"/>
    <arg value="${sub.target}"/>
</java>

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

...