Подтвердить что ты не робот

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

4b9b3361

Ответ 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).