Исходя из ответа tim_yates, следующее является работоспособным решением, которое вам, возможно, придется настраивать в зависимости от того, как вы конфигурируете плагин jaxb2.
Настройка gmaven-plugin
выполнения в начале жизненного цикла (например, на этапе инициализации), которое выполняется со следующей конфигурацией ...
Начните с функции для сбора объектов File ссылочных схем (это уточнение ответа Тима):
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()
}
}