Статьи

Больше Groovy Magic с файлами Maven Pom

В прошлый раз я представил некоторую новую поддержку Groovy, доступную в Maven 3, и посмотрел, как вы сможете писать свои файлы pom в Groovy или в других нотациях XML. В этой статье мы подробнее рассмотрим, что можно сделать с помощью файла Maven pom, написанного на Groovy.

Джейсон Диллон, парень, который принес нам GMaven , усердно работает над расширением возможностей сценариев Groovy pom и предлагает несколько замечательных новых возможностей. В прошлой статье мы увидели, как Groovy DSL делает зависимости более краткими, с объявлениями зависимостей в следующих строках:

    dependencies {
dependency { groupId 'junit'; artifactId 'junit'; version '4.7'; scope 'test' }
}

На самом деле, вы можете сделать даже лучше, чем это. Сокращенная запись для зависимостей позволяет определять зависимости в одной строке. Так

<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.5</version>
      <scope>test</scope>
    </dependency

будет выглядеть так:

    dependency('junit:junit:4.5:test')

Это также работает для родительского проекта, плагинов, модулей и многих других элементов. Например, вы можете написать следующее:

project {
parent('tweeter:co.nz.codingdojo.tweeter:1.0.0-SNAPSHOT')
...
}

Эта сокращенная запись также работает с исключениями зависимостей. Вот реальный пример из самого проекта graven:

dependencies {
dependency('org.codehaus.groovy:groovy:1.7-beta-2') {
exclusions('junit:junit', 'org.apache.ant:ant', 'org.apache.ant:ant-launcher')
}
}

Вот более полный пример, показывающий эту запись в действии в родительском элементе, а также в зависимостях и плагинах:

project(modelVersion: '4.0.0') {
parent('tweeter:co.nz.codingdojo.tweeter:1.0.0-SNAPSHOT')
artifactId 'tweeter-web'
packaging 'war'
name 'Tweeter Web Application'

dependencies {
dependency('javax.servlet:jstl:1.2')
dependency('junit:junit:4.7:test')
}

build {
plugins {
plugin('org.mortbay.jetty:maven-jetty-plugin:6.1.21') {
configuration {
port '9090'
scanIntervalSeconds '5'
stopPort '9966'
stopKey 'foo'
}
executions {
execution(id: 'start-jetty', phase: 'pre-integration-test') {
goals('run')
configuration {
scanIntervalSeconds '0'
daemon 'true'
}
}
}
}
}
}
}

Вы также можете связать скрипты Groovy с различными фазами жизненного цикла с минимальными усилиями. Например, вы сможете интегрировать код Groovy непосредственно в разные моменты жизненного цикла. На этом этапе синтаксис использует
макрос
$ execute и выглядит примерно так:

project {
build {
$execute(id: 'test1', phase: 'validate') {
println "foo"
}

$execute(id: 'test2', phase: 'compile') {
println "bar"
}
...
}

В закрытии Groovy вы сможете получить доступ к обычной переменной pom, такой как $ project и $ settings, как вы можете с GMaven.

Вы также можете использовать Groovy в самом файле pom, чтобы сделать сам файл pom более динамичным и лаконичным. Например, в этом примере (взятом из файла graven pom) модули проекта определены в центральном списке и используются как в разделе управления зависимостями (чтобы избежать дублирования номера версии для каждого модуля), так и в элементе modules:

project {
...
def mods = ['pmaven-common','pmaven-cli','pmaven-maven-plugin',
'pmaven-groovy','pmaven-yaml','pmaven-jruby']
...
dependencyManagement {
dependencies {
mods.each { artifact ->
dependency {
groupId 'org.sonatype.pmaven'
artifactId "$artifact"
version '1.0-SNAPSHOT'
}
}
}
...
modules(*mods)
}

Это действительно лучшее из обоих миров. Если вам нужна гибкость, вы можете добавить скрипты Groovy, чтобы делать все, что вы хотите. Однако он остается в структуре жизненного цикла сборки Maven. Мы не будем возвращаться к анархии, подобной Ant, для сценариев сборки, созданных из произвольных целей и зависимостей задач: например, «mvn verify» все равно будет делать то, что вы ожидаете.

Некоторые читатели, похоже, были обеспокоены тем, что это просто добавит еще одну запись для изучения, и это правильно! Обеспечение поддержки вашего кода является неотъемлемой частью хорошей практики разработки! Тем не менее, это не совсем новый формализм — это скорее транскрипция формата XML pom с несколькими довольно интуитивными ярлыками. Для тех, кто знаком с Groovy и Maven, файл pom, написанный на Groovy, очень легко читать и понимать.

 

В самом деле, файлы pom преобразуются в канонический формат XML pom, который мы все знаем и любим. Когда артефакт развертывается в репозитории Maven (будь то локальный или официальный центральный репозиторий), файл Pom будет в стандартном каноническом формате XML. Поддержка многоязычных pom-файлов явно предназначена для того, чтобы облегчить вам жизнь в вашей организации при написании и поддержании pom-файлов в удобном для вас формате, а не для превращения центрального хранилища в Вавилонскую башню.

Что касается поддержки инструментов, стандартная интеграция m2eclipse будет прекрасно работать с любым форматом файлов POM, поскольку m2eclipse использует канонический формат XML под капотом. Тем не менее, поддержка Groovy в Eclipse является тем, чем она является, редактору pom, вероятно, потребуется некоторое время, прежде чем вы получите все прекрасные функции автозаполнения, которые вы в настоящее время получаете в формате XML. Тем не менее, для опытного разработчика, этот новый формат POM является большим шагом вперед.

 

С http://weblogs.java.net/blog/johnsmart