Заказ сборки заказа в Gradle

У меня есть мультипроектная сборка Gradle с пользовательским определением xjc для создания объектов, сгенерированных jaxb, и у меня возникают проблемы с построением шагов в правильном порядке.

У меня 3 проекта, общий, реф и продукт. Ссылка зависит от общего и продукт зависит от ссылки и общего. Имена имен важны для моей проблемы, так как кажется, что gradle работает в алфавитном порядке, и я удалил некоторые другие зависимости, поскольку они не влияют на проблему.

В каждом проекте порядок должен быть jaxb, java compile и затем scala compile.

В верхнем уровне build.gradle я задаю задачу jaxb:

task jaxb() {
    description 'Converts xsds to classes'
    def jaxbTargetFile = file( generatedSources )
    def jaxbSourceFile =  file ( jaxbSourceDir )
    def jaxbEpisodesFile =  file ( jaxbEpisodeDir )
    def bindingRootDir =  file ( rootDir.getPath() + '/')

    inputs.dir jaxbSourceDir
    outputs.dir jaxbTargetFile
    doLast {
        ant.taskdef(name: 'xjc', classname: 'com.sun.tools.xjc.XJCTask', classpath: configurations.jaxb.asPath)

        jaxbTargetFile.mkdirs()
        jaxbEpisodesFile.mkdirs()

        for ( xsd in bindingsMap) {
            if (!episodeMap.containsKey(xsd.key)) {
                ant.fail( "Entry no found in the episodeMap for xsd $xsd.key" )
            }
            def episodeFile = projectDir.getPath() + '/' + jaxbEpisodeDir + '/' + episodeMap.get(xsd.key)
            println( "Processing xsd $xsd.key with binding $xsd.value producing $episodeFile" )
            ant.xjc(destdir: "$jaxbTargetFile", extension: true, removeOldOutput: true) {
                    schema(dir:"$jaxbSourceFile", includes: "$xsd.key")
                    binding(dir:"$bindingRootDir" , includes: "$xsd.value")
                    arg(value: '-npa')
                    arg(value: '-verbose')
                    arg(value: '-episode')
                    arg(value: episodeFile)
            }
        }
    }
}

В отдельном файле build.gradle для продукта я указываю (с аналогичным в ref)

dependencies {
     compile project(':common')
     compile project(':ref')
}

и во всех трех проектах я указываю

compileJava.dependsOn(jaxb)

когда я запускаю publish (или jar) в проекте продукта, я вижу следующий вывод:

common:jaxb
common:compileJava
common:compileScala
common:jar
product:jaxb
ref:jaxb
refcompileJava
ref:compileScala
ref:jar
product:compileJava
product:compileScala

Это дает мне ошибку, потому что xsd в product ссылается на ref и ref не запускает jaxb, но для ref нет файлов привязки эпизодов, и product регенерирует импортированные классы с неверным именем пакета.

Как я могу убедиться, что ref jaxb работает до продукта jaxb?

1 ответ

Решение

Если задачи jaxb вашего продукта зависят от задач jaxb для ref и common, вы должны определить эту зависимость:

product build.gradle)

task jaxb(dependsOn: [':common:jaxb', ':ref:jaxb']) {
...
}

Установить такую ​​же зависимость вида в ref (на commmon)

Другие вопросы по тегам