我有一个多项目Gradle构建,它带有一个自定义的defj xjc任务来构建jaxb生成的对象,我遇到了以正确顺序构建步骤的问题。
我有3个项目,普通,参考和产品。 ref取决于常见和产品取决于ref和common。命名对我的问题很重要,因为看起来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引用了ref,而ref没有运行jaxb但是没有用于ref的episode绑定文件,产品使用错误的包名重新生成导入的类。
如何确保ref jaxb在产品jaxb之前运行?
答案 0 :(得分:0)
如果你的产品的jaxb任务依赖于ref和common的jaxb任务,你应该定义这个依赖:
(在product
build.gradle中)
task jaxb(dependsOn: [':common:jaxb', ':ref:jaxb']) {
...
}
在ref
(commmon
)