Как я могу использовать компилятор JDT с Gradle 1.0-m9?

Я предпочитаю компилятор Eclipse JDT javac, а с gradle-1.0-m7 и старше он работает следующим образом:

compileJava {
    options.compiler = "org.eclipse.jdt.core.JDTCompilerAdapter"
    options.encoding = 'utf-8'
    options.define(compilerArgs: ["-warn:+${warnings.join(',')}"])
    doFirst {
        ClassLoader antClassLoader = org.apache.tools.ant.Project.class.classLoader
        configurations.ecj.each { File f ->
            antClassLoader.addURL(f.toURI().toURL())
        }
    }
}

Но с gradle-1.0-milestone-9 я получил следующее предупреждение (но все еще работает):

Свойство CompileOptions.compiler было устарело и будет удалено в следующей версии Gradle. Чтобы использовать альтернативный компилятор, установите «CompileOptions.fork» в «true» и «CompileOptions.forkOptions.executable» в путь к исполняемому файлу компилятора.

В нем говорится, что CompileOptions.forkOptions.executable — это новый способ использования альтернативного компилятора. Однако компилятор JDT не имеет исполняемого файла и предназначен для использования с ant. (я прав?)

Итак, я хотел бы знать, как правильно использовать компилятор JDT с gradle 1.0-m9?

Спасибо.


Обновлено 27 марта,

Я нашел способ запустить исполняемый файл компилятора JDT, фактически, запустив исполняемый файл java

compileJava.doFirst {
    def ecjJar = configurations.ecj.singleFile

    options.fork = true
    options.fork executable: 'java', jvmArgs: [ '-cp', ecjJar.path, 'org.eclipse.jdt.internal.compiler.batch.Main' ]
    options.define compilerArgs: [
        '-encoding', 'utf-8',
        '-source', sourceCompatibility,
        '-target', targetCompatibility,
        "-warn:+${warnings.join(',')}"
    ]
}

Это работает, но выглядит немного странно:

  1. исполняемый файл компилятора - "java"
  2. Я должен перенаправить все параметры компиляции в разветвленный исполняемый файл, как параметры командной строки

Я хотел бы найти более заводной способ, по крайней мере, способ сделать это.


Обновлено 31 марта,

Покопавшись в кодах gradle, я обнаружил, что options.compiler — это единственный способ использовать альтернативный компилятор с ant (в gradle), поскольку AntJavaCompiler создаст новый экземпляр AntBuilder перед компиляцией, поэтому свойство ant build.compiler здесь не будет действовать. .

Итак, я применю приведенное выше решение «исполняемый файл Java», прежде чем будет найден лучший способ.

И я опубликовал это решение в виде плагина Gradle на GitHub, надеюсь, оно поможет.


person xinthink    schedule 25.03.2012    source источник
comment
Я бы предположил, что это означает, что он компилируется дважды. Сначала с помощью adt-компилятора, а затем стандартного компилятора. Однако ничего не остается делать. Другая проблема может возникнуть с любыми плагинами, которые присоединяются к doFirst на compileJava, но возникают после вашей компиляции.   -  person thoredge    schedule 27.03.2012
comment
Нет, он не будет компилироваться дважды. На этапе doFirst нет компиляции, options.fork=true указывает gradle использовать альтернативный компилятор. Я поместил его в doFirst только потому, что не могу получить путь к ecj.jar на этапе настройки.   -  person xinthink    schedule 27.03.2012
comment
Отличный плагин, спасибо! Наконец, горячая замена кода работает при использовании внутренних классов.   -  person Michael Böckling    schedule 15.10.2012


Ответы (1)


Похоже, он будет заточен только против внешних исполняемых компиляторов. Может быть, вы могли бы просто переопределить всю задачу compileJava?

task compileJava(overwrite: true) << {
    ant. ... (run your ant JDT compiler)
}

Я немного не уверен, будут ли какие-либо побочные эффекты от этого.

person thoredge    schedule 26.03.2012
comment
Спасибо, я попробую. Объект CompileOptions имеет свойство «useAnt», но я не знаю, как указать муравью использовать JDT без использования свойства «компилятор». - person xinthink; 26.03.2012