tim_yatesの回答に基づいて、以下は実行可能なソリューションです。これは、jaxb2プラグインの構成方法に基づいてカスタマイズする必要がある場合があります。
次の構成でgmaven-plugin
実行される実行をライフサイクルの早い段階(初期化フェーズなど)で構成します。
参照されるスキーマのファイルオブジェクトを収集する関数から始めます(これは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
し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()
}
}