根据 tim_yates 的回答,以下是一个可行的解决方案,您可能必须根据配置 jaxb2 插件的方式对其进行自定义。
在使用以下配置gmaven-plugin
运行的生命周期早期(例如,在初始化阶段)配置执行...
从收集引用模式的 File 对象的函数开始(这是对 Tim 答案的改进):
def findRefs { f ->
def relPaths = new XmlSlurper().parse(f).depthFirst().findAll {
it.name()=='include'
}*.@schemaLocation*.text()
relPaths.collect { new File(f.absoluteFile.parent + "/" + it).canonicalFile }
}
将其包装在一个迭代结果的函数中,直到找到所有孩子:
def recursiveFindRefs = { schemaFiles ->
def outputs = [] as Set
def inputs = schemaFiles as Queue
// Breadth-first examine all refs in all schema files
while (xsd = inputs.poll()) {
outputs << xsd
findRefs(xsd).each {
if (!outputs.contains(it)) inputs.add(it)
}
}
outputs
}
当您解析 Maven 项目以确定要做什么时,真正的魔力就出现了。首先,找到 JAXB 插件:
jaxb = project.build.plugins.find { it.artifactId == 'jaxb2-maven-plugin' }
然后,解析该插件的每次执行(如果您有多个)。该代码假定每个执行集schemaDirectory
, schemaFiles
and staleFile
(即不使用默认值!)并且您没有使用schemaListFileName
:
jaxb.executions.each { ex ->
log.info("Processing jaxb execution $ex")
// Extract the schema locations; the configuration is an Xpp3Dom
ex.configuration.children.each { conf ->
switch (conf.name) {
case "schemaDirectory":
schemaDirectory = conf.value
break
case "schemaFiles":
schemaFiles = conf.value.split(/,\s*/)
break
case "staleFile":
staleFile = conf.value
break
}
}
最后,我们可以打开 schemaFiles,使用我们之前定义的函数解析它们:
def schemaHandles = schemaFiles.collect { new File("${project.basedir}/${schemaDirectory}", it) }
def allSchemaHandles = recursiveFindRefs(schemaHandles)
...并将它们的最后修改时间与陈旧文件的修改时间进行比较,必要时取消链接陈旧文件。
def maxLastModified = allSchemaHandles.collect {
it.lastModified()
}.max()
def staleHandle = new File(staleFile)
if (staleHandle.lastModified() < maxLastModified) {
log.info(" New schemas detected; unlinking $staleFile.")
staleHandle.delete()
}
}