30 kwietnia 2008

Niuanse Apache Maven 2 - opcja -U

Tomek S. prosił wczoraj o pomoc z wykonaniem kroków, które podałem do zestawienia projektu aplikacji JSF z wtyczką myfaces-archetype-trinidad, o której pisałem w Tworzenie projektu aplikacji JSF z pomocą myfaces-archetype-trinidad. Jak to bywa, mimo dołożenia wszelkich starań, aby przykład wykonał się we wszystkich możliwych środowiskach (wliczając i kończąc na Windows XP ;-)) Tomek trafił na następujący problem:
 sancho@Laveno ~/ais/workspace-test/pl-ais-bilard
$ mvn archetype:generate -DarchetypeCatalog=http://myfaces.apache.org
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'archetype'.
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Required goal not found: archetype:generate
[INFO] ------------------------------------------------------------------------
[INFO] For more information, run Maven with the -e switch
[INFO] ------------------------------------------------------------------------
[INFO] Total time: < 1 second
[INFO] Finished at: Tue Apr 29 22:49:06 CEST 2008
[INFO] Final Memory: 2M/3M
[INFO] ------------------------------------------------------------------------
Po 2h wieczornej walki Tomek ostatecznie rozwiązał problem przez wykonanie mvn z opcją -U.
 mvn -U archetype:generate -DarchetypeCatalog=http://myfaces.apache.org
I tutaj należą się słowa uznania dla wytrwałości Tomka - raz, że wytrwał z lekturą mojego wpisu, dwa, że zechciał spróbować się z tematem samodzielnie, a trzy, że znalazł wystarczająco zacięcia, aby rozwiązać problem, kiedy się w międzyczasie pojawił. I to mimo późnej pory (koło północy)! Gratulacje Tomek!

Po tych wyniesieniach odnośnie wytrwałości Tomka, pora wyciągnąć jakieś wnioski. Tego typu wezwania pomocy zawsze prowokują do zastanowienia nad możliwymi opcjami, aby materiał, jaki zamieszczam, nie był zbyt trywialny, a jednocześnie nie stanowił trudności i to nie tylko dla początkujących. Do kogo powinienem mierzyć? Przy ponad 500-tnemu gronu czytelników trudno wypośrodkować, a tym bardziej, kiedy temat opcji -U było już przeze mnie...przedstawiany! Nie tak dawno, bo we wpisie Zestawienie środowiska do programowania w Scali z Maven 2 i Eclipse IDE napisałem:

Zawsze cieszy mnie, kiedy poznając jedną rzecz dowiaduję się innych, równie istotnych informacji, i tym razem nie obyło się inaczej. W dokumentacji maven-scala-plugin wspomniano o kolejnej cesze mavena, gdzie brak określenia wersji wtyczki przy jej braku w lokalnym repozytorium jest możliwe wyłącznie, jeśli uruchomiono mvn z opcją -U. Pamiętam, że kiedyś miałem z tym problem i właśnie byłem zmuszony określić wersję wtyczki korzystając z http://mvnrepository.com/. Teraz mam i na to rozwiązanie.

Dodam jeszcze do tego, że opcja -U pozwala na skorzystanie ze skróconej postaci wywołania wtyczek maven, które w przeciwnym przypadku musiałyby być wydane w postaci:
 mvn groupId:artifactId:version:goal
która przydaje się w dwóch znanych mi sytuacjach - brak dostępnej wtyczki/artefaktu w lokalnym repozytorium m2 lub mamy potrzebę skorzystania z innej niż bieżąca wersja wtyczki/artefaktu. Tego typu podejście wykorzystałem w Tworzenie projektów Scali z pomocą mavenowego scala-archetype-simple, gdzie wydałem polecenie:
 mvn org.apache.maven.plugins:maven-archetype-plugin:1.0-alpha-7:create
do utworzenia projektu Scali i to właśnie z powodów niezgodności między maven-archetype-plugin a scala-archetype-simple.

Oba wpisy dotyczyły Scali, acz było również i o Mavenie. To kolejny raz upewnia mnie, że należy rozwijać się we wszystkie możliwe kierunki (chociaż w moim przypadku wciąż w ramach Javy) i dotykać tematów, które tylko łudząco wyglądają na bezwartościowe, np. poznanie Scali. Warto o tym wspomnieć, gdyż pewne rzeczy należy znać nawet o północy! ;-)

Pytanie konkursowe (i bardzo podchwytliwe): W jaki sposób sprawić, aby polecenie mvn archetype:generate -DarchetypeCatalog=http://myfaces.apache.org -Dmaven.repo.local=c:/puste-m2-repo zakończyło się poprawnie?. Zakładam uruchomienie na Windows ze względu na wartość parametru maven.repo.local, który można zmienić na wybrany przez siebie, byle różny od już istniejącego repozytorium m2 lokalnie.