Я не мог использовать какие-либо функции языка groovy, когда мне нужно было изменить XML-файл POM. И мне пришлось полагаться на API напрямую, как ответ krzychu.
В противном случае закрытие xml не было применено, как я ожидал, сборка завершилась с ошибкой с некоторым предупреждением или закрытие было применено неправильно, что привело к недопустимому pom.
Но недавно, внимательно прочитав замыкание Groovy, я заметил, что можно применять resolutionStrategy
к замыкание, чтобы помочь среде выполнения найти правильный контекст (неявное this).
Стратегия разрешения по умолчанию — Closure.OWNER_FIRST
, что объясняет, почему я получил ошибки о закрытии, примененном к publications
в некоторых моих испытаниях. Из их документации я попытался установить стратегию на Closure.DELEGATE_FIRST
, и это сработало, как и ожидалось.
Однако обратите внимание, что закрытие должно применяться к Node
, поэтому .children()
возвращает список, .last()
возвращает Node
, на котором вы можете добавить еще один узел либо с помощью метода .plus(...)
, либо с помощью его псевдонима +
.
publishing {
publications {
core(MavenPublication) {
pom.withXml {
def dependenciesNode =
asNode().dependencyManagement
.first()
.dependencies
.first()
dependenciesNode.children().last().plus( {
resolveStrategy = Closure.DELEGATE_FIRST
dependency {
'groupId'('org.springframework.boot')
'artifactId'('spring-boot-dependencies')
'version'(rootProject.'spring-boot.version')
'type'('pom')
'scope'('import')
}
})
}
}
}
}
Поиск правильного синтаксиса был похож на поиск булавки в стоге сена, вот несколько ссылок (1), (2), (3), который мне помог, я нашел resolutionStrategy
.
person
Brice
schedule
21.10.2019
spring-test
,spring-batch-test
,jsonpath
, которые используются в модульной настройке базовым и зависимыми модулями. Поэтому было бы неплохо объявить их в базовом модуле в областиtest
так же, как, например.spring-context
объявлен в областиruntime
. - person Markus Pscheidt   schedule 03.03.2015