Gradle - Groovy и зависимость класса Java - компилировать
В моем проекте есть файлы Java (N) и Groovy (только 1 файл). Компиляция Java зависит от этого одиночного файла класса файлов Groovy для компиляции Java (задача compileJava для успеха).
Когда я не использую src/java в качестве одного из srcDir в основном разделе > groovy > sourceSet, я получаю сообщение об ошибке, в котором не найден класс/символ, который находится в файле/классе Groovy. В ANT легко, что мы сначала вызываем compile- groovy, прежде чем вызывать цель компиляции-java, но то же самое в Gradle - это то, что я пытаюсь найти.
Я прочитал несколько сообщений и обнаружил, что если я сделаю основной раздел > java NULL и задаю srcDir для main > java, который является src/java внутри основного разделa > groovy sourceSet, тогда он компилируется отлично.
Мое:
1. Есть ли другой способ? например, должно работать следующее:
compileJava {
dependsOn compileGroovy
}
хотя это относится к циклу infinte.
ИЛИ
как насчет использования doFirst для задачи compileJava:
compileJava {
doFirst {
compileGroovy
}
}
это тоже не работает.
build.gradle. Это работает, но compileJava в некотором смысле становится бесполезным здесь, хотя исходный код имеет N нет. java файлов в дереве src/java или src/java-test и т.д. Я знаю, что эта сборка script работает, но логически может привести к некоторой путанице с разработчиком, если он/она не знакомы, почему sourceSet для Groovy ДОЛЖЕН иметь "src/java" в качестве значения srcDir.
apply plugin: 'java'
apply plugin: 'groovy'
sourceSets {
main {
groovy {
srcDir 'src/groovy'
srcDir 'src/java'
}
java {
//The following needs to be commented out OR Gradle will always pick compileJava before compileGroovy
//srcDir 'src/java'
//srcDir 'src/java-test'
}
}
test {
groovy {
srcDir 'test/groovy'
}
java {
srcDir 'test/java'
}
resources {
srcDir 'test/resources'
srcDir 'conf'
}
}
integrationTest {
groovy {
srcDir 'src/groovy-test'
}
java {
srcDir 'src/java-test'
}
resources {
srcDir 'test/resources'
srcDir 'conf'
}
}
}
Другие ссылки:
Как сделать Gradle компилировать Groovy тесты перед испытаниями Java
Ответы
Ответ 1
Плагин Groovy (base) делает задачи GroovyCompile
зависеть от соответствующих задач JavaCompile
, потому что чаще всего вызывается из Groovy в Java, чем наоборот. Если вам это нужно наоборот (или в обоих направлениях), совместная компиляция является хорошим решением. Вот несколько улучшенной (над вашей версией) совместной настройки компиляции:
sourceSets {
main {
groovy {
// override the default locations, rather than adding additional ones
srcDirs = ['src/groovy', 'src/java']
}
java {
srcDirs = [] // don't compile Java code twice
}
}
}
Если вы предпочитаете отдельную компиляцию только с зависимостями Java → Groovy, то должно работать следующее:
// since you aren't using the default locations
sourceSets {
main {
groovy {
srcDirs = ['src/groovy']
}
java {
srcDirs = ['src/java']
}
}
}
// remove GroovyCompile->JavaCompile task dependencies
tasks.withType(GroovyCompile) {
dependsOn = []
}
// add JavaCompile->GroovyCompile task dependencies
tasks.withType(JavaCompile) { task ->
dependsOn task.name.replace("Java", "Groovy")
}
Поскольку задача JavaCompile
и ее соответствующая задача GroovyCompile
записываются в один и тот же выходной каталог, компиляция Java теперь будет иметь скомпилированный Groovy код в своем пути к классу компиляции.
PS: вызов задачи из другой задачи не поддерживается, и при попытке могут возникнуть проблемы. Вместо этого вы всегда должны работать с отношениями задач (dependsOn
, finalizedBy
, mustRunAfter
, shouldRunAfter
).