0

jaxb で生成されたオブジェクトをビルドするためのカスタム defind xjc タスクを使用してマルチプロジェクトの Gradle ビルドを行っていますが、正しい順序でビルドする手順に問題があります。

common、ref、product の 3 つのプロジェクトがあります。ref は common に依存し、product は ref と common に依存します。gradle はアルファベット順に物事を行うように見え、問題に影響を与えないため、他の依存関係をいくつか取り除いたので、命名は私の問題にとって重要です。

各プロジェクト内では、jaxb、java コンパイル、scala コンパイルの順序である必要があります。

最上位の 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ファイルで(参照に類似しています)

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

そして、私が指定した3つのプロジェクトすべてで

compileJava.dependsOn(jaxb)

製品プロジェクトでパブリッシュ (または jar) を実行すると、次の出力が表示されます。

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

製品の xsd が ref を参照しており、ref が jaxb を実行していないため、ref のエピソード バインディング ファイルがなく、製品がインポートされたクラスを間違ったパッケージ名で再生成するため、エラーが発生します。

ref jaxb が製品 jaxb の前に実行されるようにするにはどうすればよいですか?

4

1 に答える 1