05 lutego 2008

Wicket prościej z mavenowym archetypem wicket-archetype-quickstart

2. dzień w Stanach nie mniej obfitujący w ciekawostki niż pierwszy. Co mnie zaskoczyło ogromnie to 3 sprawy. Śniadanie prawie w całości oparte o przetwory mleczne plus płatki. Owoce też są, ale trochę mniej. Dużo różnistego pieczywa, do tego przetwory mleczne i niewiele owoców (sporo bananów). Wystarczy, aby wyobrazić sobie jak po tej wyprawie może człowiek wypaść wagowo. Dodając do tego siedzący tryb pracy i waga skacze w górę z każdym dniem. Szczęśliwie, apartament, w którym stacjonuję, ma do dyspozycji korty i, co najbardziej istotne, basen z placami do kosza. Właśnie - do kosza. I tutaj pojawia się kolejna ciekawostka. Nie brałem ze sobą piłki wiedząc, że tutaj będzie można zakupić Spaldinga za grosze, co dzisiaj potwierdziłem w Walmarcie. Właśnie z niego wróciłem, gdzie znalazłem Spalding NBA "TACK SOFT" Composite leather basketball za 16 USD (!) Brakuje jeszcze butów, stroju i można ruszać. Temperatura w dzień wystarczająca na grę. Podobno jednak najtaniej wychodzi kupowanie na Amazonie lub temu podobnych sklepach i kierowanie przesyłek do hotelu. Wtedy "schodzi" dodatkowa marża sklepowa, więc cena może jeszcze spaść.
Ostatnią rzeczą, która mnie dzisiaj zaskoczyła była liczba innych nacji niż tą, którą ja nazwałbym amerykańską (teraz dopiero załapię się na miano rasisty, czy podobnie). Nie wdając się w szczegóły (a mając potwierdzenie u osób z Włoch, Indii oraz Szwajcarii) liczba innych nacji w San Jose waha się w granicy 99% (!) Jest ich na prawdę wiele, więc często słyszy się hiszpański, czy jego amerykańską odmianę (spenglish) i Ci, którzy przyjechali poszlifować angielski mogą się zawieść. Może pora zabrać się za hiszpański? Jestem w Stanach z Włochem, który przekonuje mnie do włoskiego, którego, jeśli dobrze zrozumiałem, ciekawostką jest zakończenie wszystkich słów samogłoską. Kiedy czytałem na głos książkę tego Włocha o historii Trzeciej Rzeszy, której druga część zaczynała się od rozdziału o Polsce, okazało się, że wymowa jest identyczna do naszej z dokładnością do litery 'z', która staje się naszym 'c' oraz ch => k i c => k. Jeśliby wspomnieć o bliskości włoskiego do hiszpańskiego, to warto rozważyć włoski jako potencjalny, trzeci język europejczyka, za angielskim i niemieckim (później hiszpański i ostatecznie francuski).

Koniec z tymi dywagacjami na tematy inne niż javowe. Pora na właściwe danie w postaci tworzenia aplikacji opartych o Apache Wicket z pomocą specjalnie w tym celu przygotowanemu archetypowi mavenowemu - wicket-archetype-quickstart. Rola archetypów w Apache Maven 2 polega na uproszczeniu zestawiania projektów, tj. ułożeniu struktury katalogowej z niezbędnymi plikami konfiguracyjnymi (więcej o nich w dokumencie Introduction to Archetypes). Problemów z zestawianiem projektu z Wicketem doświadczyłem kilka dni temu (Pierwsze kroki z Apache Wicket 1.3) i nie długo trwało zanim dowiedziałem się o istnieniu dedykowanego archetypu, który zdejmie ze mnie niemiły obowiązek dbania o wymagane zależności do poprawnego ustawienia projektu aplikacji z Wicket. A trzeba było czytać dokumentację, gdzie w pliku README dostarczanym w pakiecie Apache Wicket 1.3 napisano:

The easiest way of getting the dependencies of your Wicket based projects right is to use Maven with your projects and include the wicket dependencies you want like is outlined in the quickstart. Maven will then take care of including the appropriate dependencies.

To odpowiada dokładnie mojemu wyobrażeniu tworzenia oprogramowania bazując na Wicket, który niefortunnie (dla osób nie posługujących się Maven) nie dostarcza wszystkich wymaganych bibliotek w katalogu lib. Takie podejście sprowadza problem do czasów średniowiecza w temacie zestawiania projektu, gdzie dbanie o zależności zrzuca się obecnie na narzędzie wspomagające jak Maven, Ivy czy potencjalnie Buildr. Po raz kolejny przekonuję się, żę rozpoznanie nowego oprogramowania należy rozpocząć od lektury dostępnej dokumentacji, artykułów czy książek zanim zacznie się faktyczne konstruowanie aplikacji. Nie ma nic "przyjemniejszego" niż po kilku godzinach naprawiania błędu dowiadujemy się o jego sposobie rozwiązania w pliku, który znajdował się pod ręką (jak np. plik README w dystrybucji Wicket). Jeszcze tak niedawno doświadczyłem zawirowań, kiedy do mojej pierwszej aplikacji webowej z Wicketem dodałem wyłącznie plik wicket-1.3.jar, a jej uruchomienie zakończyło się...wyjątkiem CNFE. Znalezienie rozwiązania nie sprawiło problemu, jednakże sam fakt takiego zapisu w README:

- wicket and wicket-extensions:

You only need to include the Servlet API (2.3, just for compiling) and the SLF4J logging implementation you want. You cannot use Wicket without adding a SLF4J logging implementation to your classpath. Most people use log4j. If you do, just include slf4j-log4j12.jar on your classpath to get Wicket to use log4j too. If you want to use commons-logging or JDK14 logging or something else, please see the SLF4J site (http://www.slf4j.org/) for more information.


jest potwierdzeniem, że każdorazowo należy przynajmniej pobieżnie przejrzeć dostępną dokumentację. Początkowo może to odłożyć w czasie faktyczny moment programowania, ale zdobyta wiedza suma sumarum pozwoli uniknąć nieprzyjemnych niespodzianek, które wpływają na nasz zapał do dalszego studiowania wybranego rozwiązania.

W katalogu src/archetypes znajduje się plik README, którego lektura dostarczyła mi informacji dotyczących tworzenia aplikacji opartych o Wicket z pomocą Apache Maven 2. W ten sposób mam obsłużone dwie rzeczy, które musiałem do tej pory wykonywać samodzielnie: 1) tworzenie struktury projektu (to mogłem jeszcze w zasadzie zrzucić na barki narzędzia IDE, np. NetBeans, Eclipse czy IDEA) oraz 2) zarządzanie zależnościami (które wymagało ode mnie umiejętności rozpoznania przyczyny błędu - analiza wyjątku, bądź zapoznania się z dokumentacją i odszukiwania zależności na podstawie wykorzystywanych funkcjonalności). Jeśli mogę coś zrzucić na barki dostępnego oprogramowania, które w dodatku jest darmowe, to z reguły skłaniam się ku takiemu podejściu. Jest zbyt wiele ciekawego oprogramowania i pomysłów do zrealizowania, aby tracić czas na zarządzanie projektem ręcznie (oczywiście nie znaczy to, że Maven jest najwłaściwszym z możliwych rozwiązań, ale w tym momencie w zupełności wystarczy). Okazuje się, że istnieje nawet asystent w postaci formularza na stronach Wicketa do skonstruowania odpowiedniego polecenia do utworzenia projektu - Getting Started: QuickStart. Wystarczy, więc wprowadzić dane o pakiecie i nazwie projektu, i mamy podane na tacy polecenie do wykonania.


Wykonanie polecenia tworzy projekt oparty o Wicket.
jlaskowski@dev /cygdrive/c/projs/sandbox
$ mvn archetype:create \
-DarchetypeGroupId=org.apache.wicket \
-DarchetypeArtifactId=wicket-archetype-quickstart \
-DarchetypeVersion=1.3.0 \
-DgroupId=pl.jaceklaskowski.wicket -DartifactId=wicket-demo
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'archetype'.
[INFO] ----------------------------------------------------------------------------
[INFO] Building Maven Default Project
[INFO] task-segment: [archetype:create] (aggregator-style)
[INFO] ----------------------------------------------------------------------------
...
[INFO] [archetype:create]
[INFO] Defaulting package to group ID: pl.jaceklaskowski.wicket
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating Archetype: wicket-archetype-quickstart:1.3.0
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: pl.jaceklaskowski.wicket
[INFO] Parameter: packageName, Value: pl.jaceklaskowski.wicket
[INFO] Parameter: basedir, Value: c:\projs\sandbox
[INFO] Parameter: package, Value: pl.jaceklaskowski.wicket
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: artifactId, Value: wicket-demo
[INFO] ********************* End of debug info from resources from generated POM ***********************
[INFO] Archetype created in dir: c:\projs\sandbox\wicket-demo
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3 seconds
[INFO] Finished at: Mon Feb 04 16:09:38 PST 2008
[INFO] Final Memory: 5M/254M
[INFO] ------------------------------------------------------------------------
Następnie wystarczy wykonać polecenie mvn clean install, aby zbudować projekt.
jlaskowski@dev /cygdrive/c/projs/sandbox/wicket-demo
$ mvn clean install
[INFO] Scanning for projects...
[INFO] ----------------------------------------------------------------------------
[INFO] Building quickstart
[INFO] task-segment: [clean, install]
[INFO] ----------------------------------------------------------------------------
...
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running pl.jaceklaskowski.wicket.TestHomePage
...
Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] [war:war]
[INFO] Packaging webapp
[INFO] Assembling webapp[wicket-demo] in [c:\projs\sandbox\wicket-demo\target\wicket-demo-1.0-SNAPSHOT]
[INFO] Processing war project
[INFO] Webapp assembled in[156 msecs]
[INFO] Building war: c:\projs\sandbox\wicket-demo\target\wicket-demo-1.0-SNAPSHOT.war
[INFO] [install:install]
[INFO] Installing c:\projs\sandbox\wicket-demo\target\wicket-demo-1.0-SNAPSHOT.war to
C:\.m2\pl\jaceklaskowski\wicket\wicket-demo\1.0-SNAPSHOT\wicket-demo-1.0-SNAPSHOT.war
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 44 seconds
[INFO] Finished at: Mon Feb 04 16:10:31 PST 2008
[INFO] Final Memory: 8M/254M
[INFO] ------------------------------------------------------------------------
i/lub uruchomić go za pomocą komendy mvn jetty:run.
jlaskowski@dev /cygdrive/c/projs/sandbox/wicket-demo
$ mvn jetty:run
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'jetty'.
[INFO] ----------------------------------------------------------------------------
[INFO] Building quickstart
[INFO] task-segment: [jetty:run]
[INFO] ----------------------------------------------------------------------------
...
[INFO] [jetty:run]
[INFO] Configuring Jetty for project: quickstart
[INFO] Webapp source directory = C:\projs\sandbox\wicket-demo\src\main\webapp
[INFO] web.xml file = C:\projs\sandbox\wicket-demo\src\main\webapp\WEB-INF\web.xml
[INFO] Classes = C:\projs\sandbox\wicket-demo\target\classes
2008-02-04 16:15:30.756::INFO: Logging to STDERR via org.mortbay.log.StdErrLog
[INFO] Context path = /wicket-demo
[INFO] Tmp directory = determined at runtime
[INFO] Web defaults = org/mortbay/jetty/webapp/webdefault.xml
[INFO] Web overrides = none
[INFO] Webapp directory = C:\projs\sandbox\wicket-demo\src\main\webapp
[INFO] Starting jetty 6.1.7 ...
2008-02-04 16:15:30.896::INFO: jetty-6.1.7
...
********************************************************************
*** WARNING: Wicket is running in DEVELOPMENT mode. ***
*** ^^^^^^^^^^^ ***
*** Do NOT deploy to your live server(s) without changing this. ***
*** See Application#getConfigurationType() for more information. ***
********************************************************************
2008-02-04 16:15:31.756::INFO: Started SelectChannelConnector@0.0.0.0:8080
[INFO] Started Jetty Server
Teraz wystarczy uruchomić przeglądarkę i skierować ją na adres http://localhost:8080/wicket-demo


i można podziwiać prostotę tworzenia projektu opartego o Wicket z pomocą archetypu wicket-archetype-quickstart.

p.s. Podziękowania dla 13-tu kolejnych esemesowiczów, który zechcieli wyrazić swoją opinię o Notatniku w konkursie Blog Roku 2007. Z miejsca 13-tego wczoraj Notatnik przesunął się na 9-te z 37 głosami (!) Czyżby deklaracja "jestem Waszym dłużnikiem" robiła swoje? (teraz tylko czekać na rachunki za wysłane smsy ;-)) Pierwsze miejsce okupowane jest przez blog z 93. głosami, więc jeszcze dużo pracy przed nami.