01 września 2008

Mavenowe pluginGroup - sposób na skrócenie nazw wtyczek

Podczas mojej ponad 2-tygodniowej walki z migracją aplikacji opartej o Struts1 do JSF pojawiło się kilka rzeczy, z którymi przyszło mi się borykać po raz pierwszy (ech, cudnie móc tak godzinami nie wiedzieć, co się dzieje z aplikacją, kiedy to właśnie powinna działać, szczególnie przed prezentacją klientowi ;-)). Jednym z tych najbardziej zmuszających do wysiłku umysłowego wyzwań było połączenie stron JSP ("typowe" JSF) z XHTML (JSF w wykonaniu facelets). Każdorazowe przeniesienie funkcjonalności z jednej technologii "wizualizacji" stron na drugą, to po prostu hard-core, a w tle jeszcze Struts. Nawet zaczęło mnie to irytować, a aplikacja to zwykły CRUD, gdzie Struts był niezwykle niechlujnie wykorzystany. Aż mi się szkoda zrobiło tego Strutsa ;-) Ale nie o tym ja.

Tak podczas tych zmagań natrafiłem na ciekawostkę, której rozwiązania nie sądziłem, że w ogóle mógłbym oczekiwać - uruchamianie wtyczek Apache Maven 2 spoza org.apache.maven.plugins z linii poleceń bez deklaracji w pom.xml. Często przychodzi mi uruchamiać wtyczki mavenowe w ten sposób, więc z tym większą ulgą przyjąłem nowinę, że można skrócić nazwę wtyczki i...moje cierpienia.
 jlaskowski@work ~
$ mvn jetty:run
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'jetty'.
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] The plugin 'org.apache.maven.plugins:maven-jetty-plugin' does not exist or no valid version could be found
[INFO] ------------------------------------------------------------------------
[INFO] For more information, run Maven with the -e switch
[INFO] ------------------------------------------------------------------------
Innymi słowy, wtyczki mavenowe spoza groupId - org.apache.maven.plugins - nie są rozpozna(wa)ne domyślnie przez Mavena. Można oczywiście uruchomić wtyczkę podając jej pełną nazwę w formacie groupId:artifactId:goal, tj. w tym przypadku byłoby to mvn org.mortbay.jetty:jetty-maven-plugin:run, ale chciałoby się krócej, nieprawdaż? (w tym przypadku niepomyślne wykonanie nie było spowodowane nieprecyzyjnym wskazaniem na wtyczkę, ale po prostu brakiem środowiska do jej uruchomienia, czyli brakiem projektu mavenowego).
 jlaskowski@work ~
$ mvn org.mortbay.jetty:jetty-maven-plugin:run
[INFO] Scanning for projects...
[INFO] artifact org.mortbay.jetty:jetty-maven-plugin: checking for updates from central
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Default Project
[INFO] task-segment: [org.mortbay.jetty:jetty-maven-plugin:run]
[INFO] ------------------------------------------------------------------------
[INFO] Preparing jetty:run
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Cannot execute mojo: resources. It requires a project with an existing pom.xml, but the build is not using one.
[INFO] ------------------------------------------------------------------------
[INFO] For more information, run Maven with the -e switch
[INFO] ------------------------------------------------------------------------
Okazuje się, że rozwiązaniem jest...zapoznanie się z dokumentacją (przysiągłbym, że ją czytałem, a przynajmniej przeglądałem). Na rozwiązanie najpierw trafiłem w dokumentacji wtyczki maven-jetty-plugin (odszukaj "Note: Maven by default looks for plugins"), a później wystarczyło już poszukać pluginGroups w Configuring Maven to Search for Plugins z pomocą Settings Reference i ostatecznie uzupełniłem settings.xml o następującą sekcję pluginGroups:
 <?xml version="1.0" encoding="UTF-8"?>
<settings 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/xsd/settings-1.0.0.xsd">
<pluginGroups>
<pluginGroup>org.mortbay.jetty</pluginGroup>
</pluginGroups>
</settings>
i wykonanie "skrótowe" wtyczki jetty-maven-plugin z mvn jetty:run kończy się już pomyślnie (z dokładnością do BUILD ERROR z powodu braku projektu).
 jlaskowski@work ~
$ mvn jetty:run
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'jetty'.
[INFO] org.mortbay.jetty: checking for updates from central
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Default Project
[INFO] task-segment: [jetty:run]
[INFO] ------------------------------------------------------------------------
[INFO] Preparing jetty:run
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Cannot execute mojo: resources. It requires a project with an existing pom.xml, but the build is not using one.
[INFO] ------------------------------------------------------------------------
[INFO] For more information, run Maven with the -e switch
[INFO] ------------------------------------------------------------------------
Ciekawe ilu osobom owe "wydłużone" wskazanie wtyczek z linii poleceń sprawiało trudność w zaakceptowaniu zachowania Mavena?