Tworzenie wtyczek Maven 2 w Groovy

Z Jacek Laskowski - Wiki Projektanta Java EE

Jakiś czas temu planowałem stworzenie wtyczki Apache Maven 2 dla wzbogacenia możliwości Apache OpenEJB. W międzyczasie zainteresowałem się językami skryptowymi, szczególnie Groovy oraz JRuby, więc kiedy natrafiłem na wtyczkę Maven 2 wspomagającą tworzenie wtyczek Maven 2 w Groovy - groovy-maven-plugin wiedziałem, że to jest właśnie ten moment. I nie myliłem się. Prostota tworzenia wtyczek w Groovy uwidacznia się już przy bardzo trywialnych wtyczkach, jaką będzie nasza wtyczka, kiedy to nie jest konieczne deklarowanie wyjątków czy typów parametrów (chociaż jest to zalecane). Zobaczmy to w działaniu.

Spis treści

Oprogramowanie

Na potrzeby artykułu konieczne jest zainstalowanie Apache Maven 2. Wybór zintegrowanego środowiska programowania (IDE), które wspomaga tworzenie aplikacji w Groovy i które dodatkowo wspiera projekty Maven 2 składam na Twoje barki. W zasadzie większość z popularnych narzędzi IDE ma obie te funkcjonalności.

Kompletny projekt powitanie-maven-plugin gotowy do uruchomienia, dostępny jest do pobrania jako powitanie-maven-plugin.zip.

Utworzenie projektu wtyczki - powitanie-maven-plugin

Utworzenie projektu wykonujemy przy pomocy wtyczki-archetypu org.codehaus.mojo.groovy.groovy-maven-archetype.

mvn archetype:create \
  -DarchetypeGroupId=org.codehaus.mojo.groovy \
  -DarchetypeArtifactId=groovy-maven-archetype \
  -DgroupId=pl.jaceklaskowski.maven \
  -DpackageName=pl.jaceklaskowski.maven.plugins \
  -DartifactId=powitanie-maven-plugin

W ten sposób utworzyliśmy podstawową strukturę projektową dla wtyczki powitanie-maven-plugin.

Kolejne polecenia będą wykonywane z poziomu katalogu powitanie-maven-plugin.

Konfiguracja projektu - pom.xml

Zgodnie z dokumentem Guide to Developing with Maven 2 and Groovy konieczne są pewne zmiany w konfiguracji projektu - pom.xml. Ostatecznie plik pom.xml powinien prezentować się następująco.

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>pl.jaceklaskowski.maven</groupId>
  <artifactId>powitanie-maven-plugin</artifactId>
  <name>Example Groovy Module - powitanie-maven-plugin</name>
  <packaging>maven-plugin</packaging>
  <version>1.0</version>
  <url>http://www.jaceklaskowski.pl/wiki/Tworzenie_wtyczek_Maven_2_w_Groovy</url>
  <dependencies>
    <dependency>
      <groupId>org.codehaus.mojo.groovy.runtime</groupId>
      <artifactId>groovy-runtime-default</artifactId>
      <version>1.0-beta-3</version>
    </dependency>
    <dependency>
      <groupId>org.codehaus.mojo.groovy</groupId>
      <artifactId>groovy-mojo-support</artifactId>
      <version>1.0-beta-3</version>
    </dependency>
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-project</artifactId>
      <version>2.0.5</version>
    </dependency>
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-artifact</artifactId>
      <version>2.0.5</version>
    </dependency>
    <dependency>
      <groupId>org.apache.maven.shared</groupId>
      <artifactId>file-management</artifactId>
      <version>1.1</version>
    </dependency>
  </dependencies>
  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.codehaus.mojo.groovy</groupId>
          <artifactId>groovy-maven-plugin</artifactId>
          <configuration>
            <providerSelection>default</providerSelection>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo.groovy</groupId>
        <artifactId>groovy-maven-plugin</artifactId>
        <extensions>true</extensions>
      </plugin>
      <plugin>
        <groupId>org.codehaus.mojo.groovy</groupId>
        <artifactId>groovy-maven-plugin</artifactId>
        <executions>
          <execution>
            <goals>
              <goal>generateStubs</goal>
              <goal>compile</goal>
              <goal>generateTestStubs</goal>
              <goal>testCompile</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

Kod źródłowy wtyczki - PowitajMojo.groovy

Kod źródłowy wtyczki domyślnie szukany jest w katalogu src/main/groovy. Nie został on utworzony podczas tworzenia projektu, więc należy stworzyć go samodzielnie.

W katalogu src/main/groovy zakładamy kolejny podkatalog pl/jaceklaskowski/maven/plugins, w którym będzie znajdowała się nasza wtyczka.

package pl.jaceklaskowski.maven.plugins

import org.codehaus.mojo.groovy.GroovyMojo

/**
 * Powitaj uzytkownika
 *
 * @goal powitaj
 */
class PowitajMojo extends GroovyMojo
{
    void execute() {
        log.info('Witaj uzytkowniku!')
    }
}

Cały katalog src/main/java usuwamy jako niepotrzebny.

Uruchomienie wtyczki

Zanim przejdziemy do uruchomienia wtyczki należy ją zbudować poleceniem mvn clean install.

jlaskowski@dev /cygdrive/c/powitanie-maven-plugin
$ mvn clean install
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building Example Groovy Module - powitanie-maven-plugin
[INFO]    task-segment: [clean, install]
[INFO] ------------------------------------------------------------------------
...
[INFO] [plugin:updateRegistry]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------

Poprawne zbudowanie wtyczki i jej instalacja w lokalnym repozytorium umożliwia wykonanie kolejnego kroku - uruchomienia wtyczki za pomocą polecenia mvn pl.jaceklaskowski.maven::powitanie-maven-plugin::powitaj.

jlaskowski@dev /cygdrive/c/powitanie-maven-plugin
$ mvn pl.jaceklaskowski.maven::powitanie-maven-plugin::powitaj
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building Example Groovy Module - powitanie-maven-plugin
[INFO]    task-segment: [pl.jaceklaskowski.maven::powitanie-maven-plugin::powitaj]
[INFO] ------------------------------------------------------------------------
[INFO] [powitanie:powitaj]
[INFO] Witaj uzytkowniku!
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------

Pojawienie się komunikatu Witaj uzytkowniku! świadczy o poprawnym wykonaniu wtyczki. I to kończy pierwszą część tworzenia wtyczki. Kolejna będzie rozbudowywała ją o obsługę parametrów konfiguracyjnych.

Parametr konfiguracyjny wtyczki - imie

Dodanie prywatnego pola imie z adnotacją @parameter wprowadza obsługę parametrów konfiguracyjnych dla wtyczki. Domyślnie wartość parametru to uzytkowniku zgodnie z elementem default-value, podczas gdy możliwa jest jej zmiana za pomocą zmiennej powitaj.imie podanej z linii poleceń (element expression).

package pl.jaceklaskowski.maven.plugins

import org.codehaus.mojo.groovy.GroovyMojo

/**
 * Powitaj uzytkownika
 *
 * @goal powitaj
 */
class PowitajMojo extends GroovyMojo
{
    /**
     * Imie uzytkowika
     *
     * @parameter expression="${powitaj.imie}" default-value="uzytkowniku"
     */
    private String imie

    void execute() {
        log.info('Witaj ' + imie + '!')
    }
}

Uruchomienie wtyczki z parametrem imie

Pozostaje sprawdzić poprawność dokonanych zmian przez zbudowanie wtyczki poleceniem mvn clean install i jej wykonaniu z parametrem powitaj.imie.

jlaskowski@dev /cygdrive/c/powitanie-maven-plugin
$ mvn clean install
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building Example Groovy Module - powitanie-maven-plugin
[INFO]    task-segment: [clean, install]
[INFO] ------------------------------------------------------------------------
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------

jlaskowski@dev /cygdrive/c/powitanie-maven-plugin
$ mvn pl.jaceklaskowski.maven::powitanie-maven-plugin::powitaj -Dpowitaj.imie=Jacek
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building Example Groovy Module - powitanie-maven-plugin
[INFO]    task-segment: [pl.jaceklaskowski.maven::powitanie-maven-plugin::powitaj]
[INFO] ------------------------------------------------------------------------
[INFO] [powitanie:powitaj]
[INFO] Witaj Jacek!
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------

Komunikat Witaj Jacek! świadczy o poprawnym utworzeniu wtyczki.

Osobiste