10 września 2008

Silesia JUG już jest!

1 komentarzy
I po spotkaniu. Po rozgłoszeniu go przez Łukasza Lipkę na grupie pl.comp.lang.java - JUG Śląsk??? i spotkanie z Jackiem kilka osób z Katowic i okolic wyraziło chęć uczestnictwa, i o 18-tej raźno powędrowaliśmy...zjeść...pogadać...a może jedno i drugie. Sami zresztą zobaczcie poniżej na zdjęciu. Poszliśmy porozmawiać o Javie i możliwości założenia grupy jugowej w tym rejonie, a tu proszę - wszyscy od razu do spaghetterii!


Przegadaliśmy ponad 2 godziny i (pomijając moje przydługie monologii na tematy różne) było wspaniale! Mówi się o chęci założenia grupy JUG na terenie aglomeracji Silesia (potencjalna nazwa dla Katowic i przyległych miast, coś na wzór Trójmiasta), więc naturalnie można oczekiwać nazwy Silesia JUG. Uważam, że obszar katowicki wymaga reprezentacji w postaci JUGa i mówi się, że coś może się pojawić niebawem.


Na zdjęciu (od lewej): Łukasz Lipka, Ja(cek), Łukasz Grzesik, Michał Kroliczek, Marcin Kołoczek i Damian Łukasik (wierzę, że nie pomieszałem kolejności). Od tej pory w sprawach założycielskich Silesia JUG można kierować pytania do nich.

Na zakończenie naszego spotkania Łukasz wytłumaczył mi, jak robi się takie fajne zdjęcia z długim czasem naświetlania. Po prostu super. Sami zobaczcie.


Jest to zdjęcie autostrady A4 z kładki nad nią, koło której mam hotel (nie, nie, w hotelu cisza, jakbym był w środku lasu).
Nigdy wcześniej nie robiłem tego typu zdjęć, ale teraz z pewnością będzie ich więcej. Już wiem, o co poproszę Św. Mikołaja - statyw (Agacia, czytasz?! ;-)). Bez niego nici z zabawy.

Z ostatniej chwili - właśnie otrzymałem zaproszenie do Silesia JUG! Zatem zaczęło się. Gratulacje dla nowopowstałego JUGa na południu! Moja wizyta w Katowicach nie pójdzie na marne (poza wykonaniem służbowego planu poprowadzenia szkolenia z WPSa). Zmieniam, więc temat notatki na "już jest" z "będzie niebawem".

08 września 2008

Budowanie Spring-DM ze źródeł

1 komentarzy
Kolejny raz potwierdziła się stara maksyma, która mówi, aby rozpoczynać pracę z projektem od lektury jego dokumentacji. Tym razem od kilku dni borykałem się ze zbudowaniem Spring-DM ze źródeł i wciąż trafiałem na błąd kompilacji z braku pakietu org.osgi. Dzisiaj po uaktualnieniu wtyczki m2eclipse udało mi się zaimportować projekt Spring-DM do Eclipse Ganymede i natrafić na przysłowiową żyłę złota - readme-building.txt, gdzie napisano:

The following Maven profiles are available for selecting an OSGi platform:

equinox - Equinox 3.2.x
knopflerfish - Knopflerfish 2.0.x/2.1.x
felix - Apache Felix 1.0.x

The OSGi platform should be always specified otherwise the project will not compile.


co sprowadza się do uruchomienia polecenia mvn clean install z określeniem profilu z bibliotekami Platformy OSGi, np. equinox, tj.
 mvn -P equinox clean install
Po tym proces budowania Spring-DM zakończył się z BUILD SUCCESSFUL po niespełna 3 minutach (!)
 [INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] ------------------------------------------------------------------------
[INFO] Spring Dynamic Modules ................................ SUCCESS [2.968s]
[INFO] Spring OSGi Mocks ..................................... SUCCESS [1:05.110s]
[INFO] Spring OSGi IO ........................................ SUCCESS [8.625s]
[INFO] Spring OSGi Core ...................................... SUCCESS [36.407s]
[INFO] Spring OSGi Extender .................................. SUCCESS [7.422s]
[INFO] Spring OSGi Testing Framework ......................... SUCCESS [18.828s]
[INFO] Spring OSGi Web Support ............................... SUCCESS [21.906s]
[INFO] Spring OSGi Web Extender .............................. SUCCESS [5.109s]
[INFO] Spring OSGi Archetype ................................. SUCCESS [2.750s]
[INFO] Spring OSGi Annotations ............................... SUCCESS [2.516s]
[INFO] ------------------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2 minutes 54 seconds
Bajecznie! Zastanawiam się, dlaczego nie zdefiniowano equinox jako domyślnego profilu w głównym pom.xml projektu? Z m2eclipse to jedynie włączenie Active by default w zakładce Profiles.


Zgłosiłem jako OSGI-618 Define equinox as default OSGi platform while builing i dołączyłem łatkę. To już kolejne (drobne) zgłoszenie w Spring-DM.

07 września 2008

Nadchodzący tydzień w Katowicach

6 komentarzy
Przez kolejne 5 dni (8-12.09.2008) będę w Katowicach i z przyjemnością spotkałbym się z lokalną społecznością javową. Będę prowadził szkolenie WB111 - Developing Business Integration Solutions for IBM WebSphere Process Server - I i jakkolwiek nie mogę zaproponować udziału w szkoleniu (zainteresowanych kieruję do Centrum Edukacyjnego IBM) to z przyjemnością spotkałbym się i porozmawiał o rzeczach różnych acz wciąż okołojavowych. Gdyby udało się zorganizować jakieś mini-spotkanie, albo nawet zainspirować kilku ochotników do stworzenia lokalnego katowickiego JUGa (ang. Java User Group) odznaczyłbym wyjazd jako niezwykle udany. Chętni proszeni są do kontaktu.

05 września 2008

OSGi - 4.5 Pakunek systemowy, 4.6 Zdarzenia oraz 4.7 Uruchomienie i zatrzymanie Platformy

0 komentarzy
Podstawowym bytem specyfikacji OSGi jest pakunek. Każda aplikacja oparta o OSGi to zestaw pakunków dostarczających pewnej funkcjonalności. Podobnie jest z samą Platformą OSGi, która nie tylko, że jest środowiskiem uruchomieniowym (kontenerem) pakunków, to sama jest również pakunkiem - pakunkiem systemowym.
 jlaskowski@work /cygdrive/c/apps/felix
$ java -jar ./bin/felix.jar

Welcome to Felix.
=================
...
-> ps
START LEVEL 1
ID State Level Name
[ 0] [Active ] [ 0] System Bundle (1.0.4)
[ 1] [Active ] [ 1] Apache Felix Shell Service (1.0.1)
[ 2] [Active ] [ 1] Apache Felix Shell TUI (1.0.1)
[ 3] [Active ] [ 1] Apache Felix Bundle Repository (1.0.3)
W powyższym zrzucie z pracy Felix'a będzie to System Bundle o identyfikatorze 0.

Pakunek systemowy udostępnia interfejs rejestrowania nowych usług, np. Package Admin.
 -> services 0

System Bundle (0) provides:
---------------------------
objectClass = org.osgi.service.startlevel.StartLevel
service.id = 1
----
objectClass = org.osgi.service.packageadmin.PackageAdmin
service.id = 2
Pakunek systemowy jest zawarty w liście zainstalowanych pakunków zwracanej przez BundleContext.getBundles() (jak można przekonać się po wykonaniu polecenia ps w Felix).

Cechy pakunku systemowego:
  • Posiada identyfikator 0
  • Metoda getLocation() zwraca ciąg System Bundle zgodnie z deklaracją w Constants
  • Nazwa pakunku (Bundle-SymbolicName) jest unikalna dla danej wersji Platformy, jednakże nazwa system.bundle musi być rozpoznawana jako jej alias
  • Obsługa cyklu rozwojowego jest odmienna od typowych pakunków w ten sposób, że:
    • start jest operacją "pustą" (noop) - pakunek musi być zawsze uruchomiony
    • stop kończy pracę całej Platformy
    • update zatrzymuje i ponownie uruchamia Platformę
    • uninstall powoduje zgłoszenie wyjątku BundleException, gdyż pakunek systemowy nie może zostać odinstalowany
Rozdział 4.6 Zdarzenia przedstawia typy zdarzeń wspierane z warstwą zarządzania cyklem rozwojowym pakunków (dalej: warstwa rozwojowa) - BundleEvent oraz FrameworkEvent. Pierwszy, BundleEvent zawiera zmiany w cyklu rozwojowym pakunków, podczas gdy FrameworkEvent niesie informacje o uruchomieniu Platformy, zmianie w poziomie startowym, odświeżeniu pakietów lub wystąpieniu błędu.

Typ zdarzenia można odczytać za pomocą metody getType(), która zwraca wartość typu int odpowiadającą stałej zdefiniowanej w klasie zdarzenia. Nierozpoznane typy zdarzeń powinny być ignorowane.

Ze zdarzeniami związani są słuchacze (ang. listeners) - BundleListener oraz SynchronousBundleListener dla zdarzeń BundleEvent i FrameworkListener dla zdarzeń FrameworkEvent.

Zarządzanie rejestracjami słuchaczy odbywa się za pomocą metod interfejsu BundleContext.

Zdarzenia są (zazwyczaj) dostarczane asynchronicznie w wątku innym niż ten, w którym je zgłoszono.

Platforma zgłosi FrameworkEvent.ERROR, jeśli wystąpił niekontrolowany wyjątek podczas przekazywania zdarzenia do słuchacza (chyba, że miałoby to prowadzić do nieskończonej pętli, gdy przekazanie zdarzenia FrameworkEvent.ERROR spowodowałoby jego wystąpienie).

Zaleca się, aby pakunek wywoływał metody słuchacza poza sekcją objętą monitorem (sychronizacji), co mogłoby prowadzić do wystąpienia zakleszczenia.

W rozdziale 4.7 Uruchomienie i zatrzymanie Platformy znajdziemy informacje o krokach podejmowanych przez implementację podczas uruchamiania i zatrzymywania Systemu.

Uruchomieniu Systemu towarzyszy uruchomienie podsystemu obsługi zdarzeń, tak aby zdarzenia mogły być dostarczane do zainteresowanych słuchaczy, pakunek systemowy przechodzi w stan STARTING, wszystkie pakunki poprzednio zarejestrowane jako uruchomione zostają uruchomione, a wszelkie błędy opakowane jako BundleException, które z kolei są publikowane jako FrameworkEvent.ERROR, pakunek systemowy przechodzi w stan ACTIVE i rozgłaszane jest zdarzenie FrameworkEvent.STARTED.

Podczas zatrzymania Systemu pakunek systemowy przechodzi w stan STOPPING, wszystkie aktywne pakunki są zatrzymane z wyjątkami opakowanymi jako BundleException i rozgłoszone jako FrameworkEvent.ERROR i ostatecznie podsystem obsługi zdarzeń zostaje zatrzymany.

Jakby w prezencie pojawiła się nowa wersja Spring-DM (Spring Dynamic Modules for OSGi Service Platforms) 1.2.0 M1 - Spring Dynamic Modules 1.2.0 M1 Released. Jeszcze się z nią nie próbowałem, ale gdyby komuś się to udało, pożądanym jest podzielenie się wrażeniami ze światem. Na uwagę zasługuje przykład aplikacji webowej opartej o Spring-MVC dystrybuowanej w ramach Spring-DM.

03 września 2008

JSF 1.2 - rozdział 7.4 NavigationHandler

3 komentarzy
Rozdział 7 specyfikacji JavaServer Faces przedstawia API z pakietu javax.faces.application, które stanowi podwaliny dla mechanizmu rozszerzania (w tym i zmiany) zachowania działania szkieletu JSF. Wielokrotnie spotykam się z opinią o bardzo nieprzyjaznym dla programisty rozwiązaniu jakim jest JSF i tyleż samo napotykam w nim interesujących konstrukcji programistycznych. Przykładem możliwości jakie można uzyskać w JSF jako szkielecie aplikacyjnym może być JBoss Seam, którego głównym celem jest (a może jedynie początkowo była) integracja technologi interfejsu użytkownika w Java EE - JavaServer Faces 1.2 - oraz technologii komponentów biznesowych opartych o Enterprise JavaBeans (EJB) 3.0. Dodając do tego projekty facelets oraz RestFaces, którymi parałem się przez ostatnie tygodnie i coraz bardziej intrygowało mnie, co spowodowało, że stało się to możliwe. Wystarczy dostarczyć pewne rozszerzenie (ala wtyczkę) do JSF deklarując w faces-config.xml i już JSF może działać inaczej niż byśmy mogli sobie początkowo wyobrazić. Na pierwszy ogień poszedł javax.faces.application.NavigationHandler, który opisany jest w rozdziale 7.4 NavigationHandler specyfikacji JavaServer Faces 1.2.

NavigationHandler jest to część szkieletu aplikacyjnego JSF uruchamiania do obsługi łańcucha znakowego będącego logicznym identyfikatorem zwróconym przez wykonaną akcję w aplikacji i wybraniem nowego widoku do wyświetlenia. Jeśli wynik akcji jest null ten sam widok, który spowodował wykonanie akcji zostanie ponownie wyświetlony. W zasadzie najlepiej możnaby to uzmysłowić prezentując sygnaturę jedynej metody abstrakcyjnej klasy NavigationHandler:
 public void handleNavigation(FacesContext context, String fromAction, String outcome)
Na podstawie przekazanego kontekstu FacesContext oraz wyniku outcome działania akcji fromAction handleNavigation podejmuje decyzję o kolejnej stronie do wyświetlenia.

Implementacja JSF musi dostarczyć domyślną realizację NavigationHandler, który pozwala na zdefiniowanie przepływów (przejść między stronami w aplikacji) w plikach konfiguracyjnych (domyślnie faces-config.xml). Do konfiguracji przepływu służy znacznik <navigation-rule>. Znacznik może zawierać opcjonalny <from-view-id>, który akceptuje wartości wyrażenia regularnego dla aktualnego identyfikatora widoku postaci dosłownej (pełne dopasowanie)
 <navigation-rule>
<from-view-id>/stworzKategorie.jsp</from-view-id>
<navigation-case>
<from-action>#{kategoriaAgent.stworz}</from-action>
<to-view-id>/wyswietl.jsp</to-view-id>
</navigation-case>
</navigation-rule>
, początek widoku (!) zakończonego gwiazdką
 <navigation-rule>
<from-view-id>/stworz*</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/wyswietl.jsp</to-view-id>
</navigation-case>
</navigation-rule>
, gwiazdkę, która określa wszystkie możliwe widoki (strony)
 <navigation-rule>
<from-view-id>*</from-view-id>
<navigation-case>
<from-action>#{kategoriaAgent.stworz}</from-action>
<to-view-id>/wyswietl.jsp</to-view-id>
</navigation-case>
</navigation-rule>
lub po prostu bez określenia <from-view-id>, co przekłada się również na dowolny widok:
 <navigation-rule>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/wyswietl.jsp</to-view-id>
</navigation-case>
</navigation-rule>
W ramach <navigation-rule> znajduje się dowolna liczba <navigation-case>, które precyzują dopasowanie.

Możliwe jest określenie wielu <navigation-rule> dotyczących tego samego <from-view-id>, ale niepoprawnym jest określenie tej samej kombinacji <from-*> dla danego <from-view-id>.

Zwrócenie null z akcji informuje NavigationHandler, aby nie przeszukiwał reguł i ponownie wyświetlił aktualny widok.

Elementy <from-outcome> oraz <from-action> odpowiadają parametrom wejściowym metody handleNavigation.

Możliwe jest skorzystanie z elementu <redirect/> do określenia przekierowania aktualnego żądania do zadanej strony, po którym następuje zatrzymanie przetwarzania żądania JSF (wywołując javax.faces.context.FacesContext.responseComplete()). Wyjątkiem jest środowisko portletowe, gdzie przekierowania nie są dozwolone.
 <navigation-rule>
<from-view-id>/stworz*</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/wyswietl.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>failure</from-outcome>
<to-view-id>/failure.jsp</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
Brak <navigation-rule>, która pasuje do parametrów metody handleNavigation nie zmienia aktualnego widoku (podobnie jak wartość null).

Znalezienie pasującego widoku powoduje zbudowanie nowego, tracąc stan poprzedniej (uwaga: może być czasochłonne).

Podmiana domyślnego NavigationHandler następuje programowo poprzez wykonanie metody javax.faces.application.Application.setNavigationHandler(NavigationHandler handler) lub deklaratywnie w faces-config.xml w sekcji <application>.
 <application>
<navigation-handler>klasa.realizujaca.NavigationHandler</navigation-handler>
</application>
Można wyobrazić sobie implementację, której konfigurację przepływów definiujemy w faces-config.xml oraz bazie danych. Dobrym źródłem wiedzy nt. temat będzie z pewnością wątek How the way for create a new NavigationHandler w stosunkowo młodym forum GlassFish WebTier. Możnaby również oprzeć NavigationHandler na regułach pisanych w Groovy czy umożliwić kreowanie przepływów z poziomu interfejsu użytkownika. Chętnie zapoznałbym się z wdrożonymi pomysłami.

Pozostaje życzyć sobie, żeby konstruowanie nowych kontrolek JSF było równie proste. Jest to bodajże najbardziej pracochłonne zadanie w JSF. Na razie jest nie na moje siły i wydaje się, że jedynie facelets mógłby być panaceum (acz wprowadza własny ViewHandler i znaczniki JSP należy migrować do znaczników facelets, co ponownie może być nie lada wyzwaniem).

02 września 2008

OSGi 4.2 Early Draft i Spring-DM w roli RI

2 komentarzy
W Early draft of OSGi Service Platform Release 4.2 specification now available Adrian Colyer przedstawił jedną ze zmian dotyczącą nazewnictwa pakunków OSGi w RFC 124 "A Component Model for OSGi", który stanie się specyfikacją komponentów OSGi i jakie to pociąga za sobą zmiany w samym Spring Dynamic Modules (Spring-DM). W/g Adriana zmian na skalę rewolucji nie będzie, a jedynie zmiana/mapowanie nazwy znacznika bean (podstawowy znacznik konfiguracyjny w Springu, nie tylko DM) na component i tyle. Reszta to po prostu Spring-DM (stąd dla samego Adriana nie będzie rewolucji, a dla wielu właśnie wdrożenie Spring-DM pod skrzydła specyfikacji nią jak najbardziej jest). Znamienny jest sposób przedstawiania roli Spring-DM w samej specyfikacji. Przypomina mi to peany jakie pisała o sobie grupa Hibernate i jej wpływie na specyfikację JPA oraz grupie JBoss Seam na specyfikację WebBeans. Czyżbym był przewrażliwiony? Obserwując wykorzystanie JPA w projektach daje się zauważyć, że dla wielu JPA to faktycznie Hibernate (a szczególnie jego część Criteria API). Mimo mojego dzisiejszego minorowego nastroju odnośnie RFC 124 i Spring-DM wierzę w dobre intencje wszystkich wymienionych grup i już nie mogę doczekać się popróbowania z platformą referencyjną dla RFC 124 (aka RFC124 RI). Jeśli ma to uprościć tworzenie aplikacji korporacyjnych, to dlaczegóżby nie skorzystać z niego?! Samo OSGi ma wiele do zaoferowania na poziomie uproszczenia architektury aplikacji, gdzie duży nacisk kładzie się na odseparowanie deklaracji (interfejsy usług) od realizacji (implementacja usług), więc czym więcej OSGi w naszych rozwiązaniach, tym lepiej (nota bene, to samo możnaby również napisać o Spring Framework). I nie mógłbym nie wspomnieć o niezwykłym podobieństwie specyfikacji Service Component Architecture (SCA) do RFC 124. Mógłbym napisać, że są łudząco podobne, ale jest to jedynie moje przeczucie nie podparte lekturą RFC 124. A może ktoś z czytelników już się z nim zapoznał i zechciałby przedstawić swój punkt widzenia? Zachęcam do opublikowania go na swoim blogu, tutaj, albo w...JAVA exPress Grzegorza Dudy.

Upór Grzegorza w stworzeniu czegoś namacalnego i wartościowego dla społeczności javowej znalazł swój finał w pierwszym numerze niezależnego, niekomercyjnego, itp. czasopisma o tematyce javowej - JAVA exPress Numer 1 (1) Sierpień 2008, w którym znajdziemy "Hello World!" maszynisty Grzegorza, 5 artykułów, w tym 2 przewodnie, o tytułach, w których liczba słów "kolejowych" odpowiada "javowym" i...a co ja będę się rozpisywał. Zainteresowany/-a?! Pobierz darmowy numer JAVA exPress ze strony czasopisma (uwaga na rozróżnienie słów gazeta vs czasopisma - gdzieś ktoś o tym wspominał na jednej z grup javowych po publikacji JAVA exPress, ale nie mogę tego teraz znaleźć).

A wracając do OSGi i jego specyfikacji to Craig Walls (autor książek o Spring Framework - Spring in Action dostępnej również w Bibliotece Warszawskiego JUGa) wyraził swoje wątpliwości odnośnie wpływu OSGi na Spring-DM, albo...na odwrót? - Spring and OSGi R4.2. Jako stały użytkownik Springa (mowa o Craigu), jak i OSGi w wykonaniu Spring-DM zdaje sobie sprawę z podobieństw między Spring a OSGi. Nawet stworzył ciekawy akronim, który oddaje trend konwergencji między OSGi i Java EE - OS-JEE-i, a może powinno się dodać i Springa - OSprin-JEE-i? ;-) Na szczęście nasze aplikacje na pewno nie ucierpią, a znacznie łatwiej będzie tworzyć dynamiczne systemy, gdzie przez "dynamiczność" rozumiem możliwość zmiany funkcjonalności aplikacji bez konieczności jej zatrzymywania.

Na dokładkę nie mógłbym nie wspomnieć o Richard S Hall (Apache Felix) Joins Sun, co pozwala przypuszczać, że w ofercie Suna również OSGi nie zabraknie. W kontekście RFC 124 natrafić można na pracę Richard'a - Beanome : A Component Model for the OSGi Framework. Cóż za zbieg okoliczności w kontekście Spring-DM i jego roli na RFC 124 (!) Dodając do tego OSGi w GlassFish v3 wygląda, że coś z tych doświadczeń OS-JEE-i-owych znajdziemy również już niedługo w ofercie wszystkich dostawców serwerów aplikacyjnych Java EE. Na odświeżenie spojrzenia o roli usług i OSGi, który wręcz wymusza ich tworzenie w naszych aplikacjach warto zapoznać się z Why Services are Important oraz OSGi - A Component of the Next Generation Platform?. Chwila lektury, a o ile poszerza się nasz horyzont programistyczny.

I dla tych zainteresowanych dokładniejszym spojrzeniem współprzewodniczącego OSGi EEG na prace nad OSGi V4.2 i zmianami zapraszam do lektury Early Draft OSGi V4.2 Docs Available. W nim dowiadujemy się o wspomnianym na początku the Spring-DM inspired component model design (RFC 124). Jeśli uważasz, że kierunek jaki obrała grupa OSGi EEG jest niewłaściwy, albo nieprecyzyjny, albo...tu wpisz jakikolwiek z powodów, dla których warto wyrazić swoją opinię...przyłączam się do apelu Eric'a, pobrania dokumentu OSGi V4.2 Early Draft i wyrażenia siebie. Może być na swoim blogu, tutaj, w JAVA exPress bądź na stronie OSGi EEG. Możliwości jest na prawdę wiele.

Nie długo trwa, abym przekonał się, że rola Spring-DM nie będzie wyłącznie pomocnicza, a raczej główna, gdyż jak napisał Costin Leau (za How Spring DM (greatly) influenced the upcoming OSGi 4.2):

Spring-DM will become the RI. We haven't sorted out the technical details, but it's likely it's going to be platform agnostic so one could just take out the implementation and use whatever 4.2 platform it likes.

Uzupełnieniem lektury z pewnością będzie (technicznie) Some thought on the OSGi R4.2 early draft oraz (strategicznie) Eclipse Swordfish SOA runtime mixes SCA, JBI and OSGi, gdzie można zapoznać się z zależnościami między SOA, SCA, JBI, OSGi, Java EE, Spring Framework, Eclipse i jeszcze wielu innych akronimów oraz produktów je realizujących (aż trudno uwierzyć, że aż tak tłoczno jest wokół OSGi). Ciekawostką może być wycinek, w którym podkreśla się rolę OSGi względem wad Java EE oraz Springa:

He rates Java EE 5 as too heavyweight and complex with static deployment descriptors. Spring, on the other hand, does not allow dynamic deployment or reconfiguration, and lacks support for "true modularization," he said.

oraz

It's dynamic. It's easy to use. It is mature. We believe that OSGi gets momentum in the future and will diminish JEE and Spring.

czy w końcu:

SCA provides a common programming model and a common description format. JBI provides a common messaging model. OSGi provides a common deployment model and a common runtime component model.

I na zakończenie serii linków (sznurków?) odnośnie OSGi i jego wpływu na nasze i innych rozwiązania - Plugins 2.0: a heads-up z Attlasianu - producenta m.in. Confluence Wiki. Wygląda na to, że OSGi będzie warstwą realizującą mechanizm wtyczek w Confluence (!) Skoro wtyczki to plugins, a tu już tylko krok "myślowy" do OSGi (za sprawą Eclipse). Czy ma znaczenie, jaką rolę posiada wtyczka? Wtyczka to rozszerzenie podstawowego produktu, więc czy to IDE czy serwer aplikacyjny, wtyczka może wprowadzić dużo pożądanej funkcjonalności...w tracie działania aplikacji. Pozostaje tylko czekać, kiedy pojawią się projekty w Polsce oparte bezpośrednio na OSGi. Pamiętam pewną lubelską firmę programistyczną, która podczas JAVArsovii 2008 wypytywała mnie o rolę OSGi w tworzeniu aplikacji webowych (widoczność sesji, itp.) i niestety nie było wtedy wiele czasu na dyskusje. A szkoda! Ciekawym ile z tych planów się zmaterializowało?!

Więcej o OSGi na tegorocznym Java Developers Day (JDD) 2008 16. października 2008 w Krakowie, gdzie podjąłem się zadania przedstawienia go w różnych realizacjach. Otrzymałem 1h na prezentację i to zaraz przed gwiazdą wieczoru Nealem Fordem, więc spodziewam się Was tam wszystkich zobaczyć i rozpoznamy nasze rozpoznanie tematu OSGi ;-) Fajnie byłoby "strzelić" jakieś nagranie z naszej dyskusji (podkreślam słowo dyskusji). Zapraszam!

01 września 2008

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

0 komentarzy
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?