15 kwietnia 2008

Tworzenie wtyczek Maven 2 z NetBeans IDE 6.1

Zainspirowany wpisem Własny plugin mavena postanowiłem spróbować swoich sił na polu tworzenia wtyczek dla Apache Maven 2 i po krótkiej lekturze Guide to Java Plugin Development byłem gotów. Z pomocą NetBeans IDE 6.1 i jego wtyczki Maven miałem po chwili (mniej niż 5 minut!) swoją własną wtyczkę. Może to nie tylko początek mojej kariery jako twórca wtyczek mavenowych, ale również początek serii 5-minutowych wpisów?!

Domyślnie NetBeans IDE 6.1 nie udostępnia wsparcia dla tworzenia projektów opartych o Maven 2 (dalej zwanego m2) i trzeba ratować się instalacją wtyczki Maven.

Z menu Tools wybieramy pozycję Plugins i odszukujemy wtyczki Maven.


Zaznaczamy ją, wciskamy przycisk Install i po chwili NetBeans już wie, co to Maven.

Wciskam Ctrl+Shift+N, a następnie z kategorii Maven wybieram Maven Project.


Wciskam przycisk Next >.

Wybieram Maven Mojo Archetype.


W zależności od "zasobności" lokalnego repozytorium Mavena lista może się nieznacznie różnić od zaprezentowanej. W przypadku braku potrzebnego archetypu (= rodzaju wtyczki wspierającej tworzenie projektu) można skorzystać z przycisku Add... i go dodać ręcznie.


I Finish. Po chwili projekt wtyczki jest gotowy.


W oknie Output - Project Creationg pojawi się BUILD SUCCESSFUL.


Zmieniam nazwę klasy mojo na EchoMojo oraz jej zawartość, aby definiowała zadanie echo, które przyjmuje jeden argument, który z kolei będzie wypisywany podczas uruchomienia.
 package pl.jaceklaskowski.maven.plugins.echo;

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;

/**
* Zadanie, ktore wypisuje podany komunikat
* @goal echo
* @requiresProject false
*/
public class EchoMojo extends AbstractMojo {

/**
* Komunikat
* @parameter expression="${komunikat}"
* @required
*/
private String komunikat;

public void execute() throws MojoExecutionException {
getLog().info(komunikat);
}
}
Dodanie @requiresProject false określa, że wykonanie wtyczki nie będzie wymagało projektu mavenowego do jej wykonania (bardzo pomocne do wtyczek narzędziowych niezależnych od projektu jak help:describe czy mojego testowego uruchomienia).

Wybieram menu Clean and Build


które spowoduje zainstalowanie wtyczki w lokalnym repozytorium mavenowym. Pomyślna instalacja wtyczki w repozytorium, to wymarzona pora na jej uruchomienie.

Najpierw sprawdzę, czy wtyczka jest rozpoznawana przez m2.
 jlaskowski@work ~
$ mvn -v
Maven version: 2.0.7
Java version: 1.5.0_14
OS name: "windows xp" version: "5.1" arch: "x86"

jlaskowski@work ~
$ mvn help:describe -DgroupId=pl.jaceklaskowski.maven.plugins.echo -DartifactId=echo-maven-plugin
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'help'.
[INFO] ----------------------------------------------------------------------------
[INFO] Building Maven Default Project
[INFO] task-segment: [help:describe] (aggregator-style)
[INFO] ----------------------------------------------------------------------------
[INFO] [help:describe]
[INFO] artifact pl.jaceklaskowski.maven.plugins.echo:echo-maven-plugin: checking for updates from central
[INFO] Plugin: 'pl.jaceklaskowski.maven.plugins.echo:echo-maven-plugin:1.0'
-----------------------------------------------
Group Id: pl.jaceklaskowski.maven.plugins.echo
Artifact Id: echo-maven-plugin
Version: 1.0
Goal Prefix: echo
Description:

Unknown

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
(Żebym to ja wiedział jak pozbyć się tego Unknown).

I w końcu faktyczne uruchomienie wtyczki.
 jlaskowski@work ~
$ mvn pl.jaceklaskowski.maven.plugins.echo:echo-maven-plugin:1.0:echo -Dkomunikat="Witaj Jacku"
[INFO] Scanning for projects...
[INFO] ----------------------------------------------------------------------------
[INFO] Building Maven Default Project
[INFO] task-segment: [pl.jaceklaskowski.maven.plugins.echo:echo-maven-plugin:1.0:echo] (aggregator-style)
[INFO] ----------------------------------------------------------------------------
[INFO] [echo:echo]
[INFO] Witaj Jacku
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
Działa! Można jeszcze wprowadzić kilka usprawnień w jej działaniu, ale to już pozostawiam wytrwałym. A skoro o nich, to pytanie konkursowe (w trwającym od jakiegoś czasu konkursie bez nagród): Jaki rodzaj wtyczki wspomaga tworzenie projektów w Maven 2 (projekty wtyczek, aplikacji webowych, itp.)?

Jeśli masz swoją opinię nt. przydatności (bądź nieprzydatności) NetBeans 6.1 polecam udział w konkursie NetBeans IDE 6.1 Beta Blogging Contest, w którym głos ludu jest nagradzany, a najwyższą wygraną jest...własna wiedza!