27 października 2008

Wrażenia po NetBeans Day 2008 w Gdańsku

8 komentarzy
Nie byłoby całego NetBeans Day 2008, gdyby nie wkład, jaki w zorganizowanie jej, włożyły załogi poznańskiego i gdańskiego JUGa. Szkoda byłoby zapomnieć choćby o jednej osobie z zespołu organizacyjnego, ale pozwolę sobie na wymienienie wyłącznie trzech, które są głównymi sprawcami całego zdarzenia - Jakub P. Nowak, Adam Dudczak (Poznań JUG) oraz Jakub Neumann (Trójmiasto JUG). Osób organizujących NetBeans Day 2008 w Poznaniu (25.10.2008) i Gdańsku (26.10.2008) było więcej, ale te szczególnie utkwiły mi w pamięci (delikatnie pomijając uczestników naszego sobotniego spotkania integracyjnego). Bardzo dziękuję organizatorom, że mogłem uczestniczyć w niezwykle sprawnie przygotowanej oraz obfitującej w sławy światka netbeansowego konferencji NetBeans Day 2008 w Gdańsku.

A wszystko zaczęło się tak niewinnie. Kiedyś tam napisał do mnie Jakub P. Nowak i spytał, czy dałoby się zebrać grupę prelegentów na konferencję NetBeans Day do Poznania (zdaje mi się, że wtedy jeszcze tylko Poznań był brany pod uwagę). Kilka postów na grupy NetBeans Dream Team, NetBeans CAT 6.5 i już nie pamiętam, gdzie jeszcze, i z lokalnej konferencji zrobiła się całkiem międzynarodowa, z udziałem jednego guru netbeansowego - Geertjan Wielenga, czempiona javowego - Adama Biena oraz członka zespołu NetBeans Dream Team - Toniego Epple. Dodając do tego, inne sławy w osobach Karola Harezlaka oraz Łukasza Lenarta i mamy całkiem ciekawą śmietankę naszego zakątka javowego.

Wspólnie z Łukaszem pojawiliśmy się w Gdańsku około 19-tej w sobotę, 25-tego i od razu skierowaliśmy się do "Miasta Aniołów". Jeśli ktokolwiek pomyślał o Los Angeles, to raczej o tej jego "ciemnej" części. Panowie w czarnych gajerach od razu dali odczuć, że nie jesteśmy w byle jakiej knajpce i zgodnie z zapowiedziami trójmiastowiczów od 21-szej miało się dopiero zacząć. Jako dodatkowe wrażenie, nakazano nas opieczętować niewidzialnym tuszem (podobno widocznym pod ultrafioletem). Kiedy poproszono mnie o zdjęcie bluzy z kapturem nie miałem złudzeń, że miejsce jakieś szemrane. Po dwóch turach pizzy, piwa zaczęła się dyskoteka, a my wyszliśmy szukać wrażeń w innym miejscu. Jeszcze przy wyjściu karteczka na wejściu "Wyjść na chwileczkę nie akceptuje się" i aż dziw bierze, że w takich oto miejscach integrują się trójmiastowicze ;-) Przeszliśmy się starówką gdańską i zlądowaliśmy w niewielkiej "pizzernia-like pubie". Tam dogadaliśmy do około 1AM i po kebabie przy rynku wróciliśmy do hotelu Dwór Prawdzica. Tam bilard przez godzinę/półtorej i powrót do pokoju. A tam z kolei pełne zaskoczenie - pokój w ogóle nie był sprzątany po ostatnim lokatorze (śmiem twierdzić, że lokatorce - pełno włosów w łazience i kilka innych "śladów")! Jeszcze chwila przed komputerem i o 5AM wylądowałem w łóżku (wierząc, jak się później okazało mylnie, że 5AM to faktycznie 4AM, bo w końcu była zmiana czasu). Ranek równie ciekawy - śniadanie, a po nim 1-godzinna partyjka bilarda z Łukaszem (który tym razem dał mi wygrać 5:4!).

Rozpoczęła się konferencja. Przede mną wystąpił Adam Bien, który zahaczył w wielu miejscach o moją tematykę EJB3, więc musiałem uaktualniać swoje wystąpienie na bieżąco. Początkowo planowałem przedstawienie zaawansowanych elementów EJB3 jak kontekst rozszerzony, stanowe ziarna sesyjne, LEFT JOIN w JPA i transakcyjne ziarna MDB, ale skończyło się na przejściu przez średniozaawansowane elementy jak interceptory, omówienie ogólnego działania EJB3 i atrybucie beanName w @EJB. Prezentacja dostępna jako JacekLaskowski-NetBeansDay2008-ZaawansowaneEJB3zNetBeans65-26.10.2008.pdf. Komentarze mile widziane, bo trudno utrzymać ciągłe zainteresowanie EJB3 po tylu dniach z nim spędzonych, a wielu domaga się kursu wprowadzającego (a ja już myślę o EJB 3.1 i jestem w rozterce!).

Powrót do domu IC o 17:15 z Oliwy i około 23-ciej byłem spowrotem u siebie. Nie ukrywam, że balowanie do 2-giej, a później prelekcja nie pasują do siebie. Do poniedziałku byłem całkowicie bez pary.

Zainteresowanych zdjęciami ze spotkania Trójmiasto JUG, Warszawa JUG i reszta znajdą kilka na stronie Krzysztofa Zubika.

Inni uczestnicy również opublikowali swoje spojrzenie na konferencję - Adam Bien w Danzig Band and City, Netbeans 6.5 rc1 on Vista, Xtreme Makeover, Restful and Beeing Doomed to Present the Basics, Geertjan Wielenga w Poznan & Gdansk: NetBeans Day, Poland oraz Łukasz Stachowiak w Po NetBeans day Poznań.

p.s. Podczas wyjazdu miałem okazję odwiedzić dworcowy kiosk w poszukiwaniu ciekawej publikacji informatycznej o javie i z przykrością muszę przyznać, że nic dla programistów javowych nie ma! Stąd też wcale nie dziwi mnie recenzja Piotra Maja dotycząca ostatniego SDJ - Software Developer's Journal z 11.2008. Dla mnie to kompletna porażka, aby tak ciekawe technologie javowe traktować po macoszemu. Skończyło się kolejny raz na kupnie INTERNET Maker wrzesień/październik 2008, który przykuł moją uwagę artykułami "Aplikacja na Androida", "Poznaj JUnit 4", "HTML i CSS - układy kolumnowe w CSS, część 2" i w końcu "Kurs UML - część 5 - diagramy czynności/aktywności". Nie ma w nich nic nadzwyczajnego, ale są one dużo lepsze od tych, które mógłbym znaleźć w SDJ. Szkoda.

26 października 2008

36. spotkanie Warszawskiej Grupy Użytkowników Technologii Java (Warszawa JUG)

0 komentarzy
Warszawska Grupa Użytkowników Technologii Java (Warszawa JUG) zaprasza na 36. spotkanie, które odbędzie się 28.10.2008 o godzinie 18:00 w sali 5440 Wydziału MIMUW przy ul. Banacha 2 w Warszawie.

Temat prezentacji: JBoss Enterprise Service Bus - Connecting Systems
Prowadzący: Jarosław Kijanowski

JBoss Enterprise Service Bus (JBoss ESB) jest otwartym oprogramowaniem przeznaczonym do integracji rozproszonych systemów informatycznych udostępniając mechanizm szyny usługowej. W trakcie prezentacji poznamy jego najważniejsze cechy i dowiemy się jak szybko (i przyjemnie?) rozpocząć ratowanie świata, w którym dominuje oprogramowanie niezdolne do porozumienia się między sobą bezpośrednio bez mediatora w postaci ESB. Uczestnicy będą mogli zapoznać się praktycznie z produktem w serii specjalnie przygotowanych przykładów wyjaśniających działanie JBoss ESB oraz jego integrację z JBoss Drools i JBoss jBPM. Na samym początku będzie niespodzianka, więc spóźnialscy stracą (i z tego chociażby powodu warto rozważyć wyjście na spotkanie 15 minut wcześniej). Nie będzie tasiemców-wyjątków czy kilometrowych XMLi. Od uczestników nie oczekuję żadnej znajomości Javy, tym bardziej JEE - o wszystkim co będzie potrzebne, dowiemy się w trakcie spotkanie.

Jarek Kijanowski rozpoczął przygodę ze światem bitów i bajtów w wieku 7 lat (kiedy to inni zachwyceni dzieciństwem preferowali spotkania z istotami żywymi). Do dziś posiada swoje pierwsze Commodore64, aczkolwiek z żalem przyznaje, że już nie pamięta w którą stronę i o ile stopni, należy przekręcić śrubkę w magnetofonie taśmowym do poprawnego wczytania gry (np. Boulder Dash). Dorastał i pisał kalkulatory czterodziałaniowe w Basicu, Pascalu, C, Perlu, Fortranie, PHP, JavaScriptcie i Assemblerze. W Javie już nie próbował. Od dwóch lat jako wolny strzelec pomaga JBossowi, załodze spod czerwonego kapelusza Inc., aby tym samym uszczęśliwiać klientów, pracując z fantastyczną ekipą nad wczesnym wykrywaniem wyjątków (taki wyjątek-hunter).

Planowany czas prezentacji to 1,5 godziny, po której planuje się 15-30-minutową dyskusję.

Wstęp wolny!

Zapraszam w imieniu grupy Warszawa JUG!

22 października 2008

NetBeans IDE 6.5 RC, NetBeans Decathlon oraz przyszłość Spring-DM i SpringSource dm Server

2 komentarzy
Ostatnimi dniami, a w zasadzie tygodniami, zaangażowany byłem w projekt-pilota, w którym dwa zewnętrzne systemy z własnymi mechanizmami generowania identyfikatorów zleceń synchronizowane były przez IBM WebSphere Process Server za pomocą usługi wiązania (ang. relationship service). Do tej pory taką integrację wyobrażałem sobie przez zastosowanie odpowiednich adapterów, a tu proszę, wystarczyło oprzeć się o usługi sieciowe (web services), niewielką dawkę programowania w Javie i...hula! Bajka. Ale nie o tym dziś ja (chociaż nie mogłem się opanować, aby nie skrobnąć co nieco, taki jestem zachwycony rezultatami).

Dzisiejszy dzień również obfitował w nowości, których kompletnie się nie spodziewałem. Zacząłem niewinnie od pobrania ostatniej wersji rozwojowej NetBeans IDE 6.5, którego wydanie RC właśnie się pojawiło. Jako (obecnie mniej aktywny) uczestnik programu NetBeans Community Acceptance Test (NetCAT) 6.5 przywykłem do pobierania wersji rozwojowych, ale dla mniej żądnych wrażeń proponuje się skorzystanie z wersji NetBeans IDE 6.5 Release Candidate, a w nim:

The focus of NetBeans IDE 6.5 is simplified and rapid development of web, enterprise, desktop, and mobile applications with PHP, JavaScript, Java, C/C++ , Ruby, and Groovy. New features for 6.5 include a robust IDE for PHP, JavaScript debugging for Firefox and IE, and support for Groovy and Grails. This release also offers a number of enhancements for Java, Ruby and Rails, and C/C++ development. Java feature highlights include: built-in support for Hibernate, Eclipse project import, and compile on save. The Release Candidate improves on the support offered in NetBeans 6.5 Beta.

The final NetBeans IDE 6.5 release is planned for November 2008.


Poza typowymi cechami NetBeans IDE, do których przywykłem i stosuję, moją uwagę przykuło wsparcie dla Groovy i Grails, o którym słyszałem, że jest na przywoitym poziomie (piszę bez entuzjazmu, gdyż samemu nie miałem jeszcze możliwości popróbowania się z tematem). Właśnie nieprzeciętne wsparcie dla Java EE oraz inne elementy, jak wsparcie dla Grails, powodują, że nie jest to narzędzie, koło którego można przejść obojętnie. A jeśli do tego dodać, że NetBeans IDE właśnie skończyło 10 lat i rozpoczęto ogólnoświatową imprezę NetBeans 10th Birthday (aka NetBeans Decathlon), to nie tylko można skończyć projekt krócej (korzystając z funkcjonalności NetBeans), ale również i dobrze na tym "zarobić". Więcej informacji na wspomnianej stronie NetBeans Decathlon. Cała zabawa to jedynie zebranie 50 punktów przez różnego rodzaju aktywność wokół NetBeans i "a limited edition NetBeans 10th Anniversary Shirt" jest Twoja. Moje pierwsze 15 punktów to wzmianka o mojej kolejnej, dzisiejszej niespodziance - wsparciu dla GlassFish v3 "Prelude", w którym można skorzystać z...EJB 3.1! Sądziłem, że wsparcie dla EJB 3.1 to domena Apache OpenEJB, którego wydanie 3.1 jest właśnie głosowane - [VOTE] OpenEJB 3.1 take 1, co, za sprawą NetBeans IDE, okazało się być nieprawdą. Otwieram nowiuteńką rozwojową wersję NetBeans IDE 6.5 i po chwili pojawiła się informacja o nowych aktualizacjach wtyczek.


Zaintrygowała mnie zmiana wersji GlassFish v3 "Prelude" na 1.0. To pierwsza wersja stabilna, więc zaraz zabrałem się za wyszukiwanie o tym informacji. Niedługo trwało, kiedy trafiłem na NetBeans 6.5 Beta is out - GlassFish 'Prelude' included z dnia moich urodzin (!), gdzie w komentarzach znalazłem "I got to know modules for ejb 3.1 and JSF (mojarra) available for V3. For Servlet 3.0, does it have any similar EDR modules available?". "Co?! EJB 3.1 już dostępny w GlassFish v3?!" - pomyślałem. Kolejne wyszukiwanie i trafiłem na EJB 3.1 in GlassFish V3 TP2. Nie pozostaje przyjrzeć się specyfikacji EJB 3.1, która nie tak dawno pojawiła się w wersji EJB 3.1 public review draft. Ech, nie pomyślałem o tym wcześniej, ale nadchodzące moje niedzielne wystąpienie podczas NetBeans Day 2008 w Gdańsku mogło być właśnie o EJB 3.1 i NetBeans. Następnym razem. Sądzę, że moje "Zaawansowane EJB3 z NetBeans 6.5" wciąż może być interesujące i warte rozważenia ;-)

I tak dzień mijał, kiedy trafiłem na ciekawą dyskusję o przyszłości Spring Dynamic Modules (Spring-DM) w kontekście pojawienia się SpringSource dm Server. Czytając dyskusję Spring DM Roadmap, należałoby raczej zająć się rozpoznawaniem produktu SpringSource dm Server niż Spring-DM, który:

"Firstly on a 1.2 release that will fill in the long-promised configuration administration support, making the core programming model feature complete."

oraz

"The 2.0 branch is where we are implementing the OSGi Blueprint Service (RFC 124) that will be part of OSGi R4.2. The Spring DM project will be the RI for this forthcoming specification (which is essentially a standardization of Spring DM + the core Spring beans support)."

i dalej

"So in summary, the future of Spring DM is to move towards becoming an RI for the standardization of the existing DM model, as the OSGi Blueprint Service. The Spring DM project provides an open source (and soon standards-based) programming model for use on any OSGi Service Platform."

Wydaje się, że praca przy Spring-DM wre, ale daje się odczuć kierowanie wysiłków ku SpringSource dm Server, zamiast rozbudowywać Spring-DM, który de facto jest jego składową.

"We will maintain the existing web support in Spring DM, but are not planning to take this any further in terms of significant new features etc. We're running into a law of diminishing returns there in terms of how good an experience we can deliver on a vanilla OSGi Service Platform. This was one of the motivations for creating the dm Server in the first place - to provide the best environment we could for OSGi-based enterprise applications and there are many issues that we can resolve much more easily in the dm Server world. [The SpringSource dm Server is of course also freely available in open source]."

Nie pozostaje nic innego, jak przyjrzeć się SpringSource dm Server i OSGi 4.2 - OSGi RFC 124 ("OSGi Blueprint") przygaszając działalność wokół Spring-DM do niezbędnego minimum.

16 października 2008

Java Developers' Day 2008 za nami, NetBeans Day 2008 za tydzień

2 komentarzy
Java Developers' DayWłaśnie wróciłem z bardzo interesującej konferencji Java Developers' Day 2008 w Krakowie, w której miałem możliwość zaprezentowania dwóch tematów - 5-minutowe "Dlaczego warto budować swoje profesjonalne życie publicznie" w ramach Java Underground, której gospodarzem był Grzegorz Duda oraz 50-minutowe "Wprowadzenie do OSGi i Spring Dynamic Modules (Spring-DM)". Już dawno nie czułem takiego wspaniałego klimatu konferencyjnego, jak podczas dzisiejszego JDD. Impreza wspaniale przygotowana i pomijając wystąpienia sponsorskie, które mówiło się, że były do bani, reszta była najwyższych lotów. Pewnie można było tak dobrać prelegentów, aby poziom mógł dorównać tegorocznej Javarsovii 2008, ale organizatorzy w osobie Andrzeja i Ani obiecywali więcej i lepiej wkrótce ;-) Podobno już szykuje się jakaś konferencja techniczna w przyszłym roku, w okolicach maja 2009. Znaczy się należy rezerwować maj na wyjazd do Krakowa. A przecież Polish JUG też nie zasypia gruszek w popiele i organizuje własną konferencję. Zapowiada się ciekawy konferencja fajt (skoro o fajt, to nie mógłbym nie napisać o powalającym na kolana skeczu w wykonaniu kabaretu Limo - Dres i Anioł).

Jest kilka rzeczy, które podpatrzyłem na JDD'08 i chciałbym wykorzystać podczas organizacji warszawskiej Javarsovii 2009. Bodaj najważniejsze, to pamiętać, że sama rola organizatora nie powinna być dzielona z rolą prelegent czy hostessa. Tutaj widziałbym pomoc innych osób niż sami organizatorzy. Ich rolę pozostawiłbym jako ewangeliści spotkań Warszawa JUG czy agitacja do większej aktywności publicznej, innymi słowy dyskutowanie z uczestnikami i rozpoznawanie ich preferencji konferencyjnych, zapraszanie do wystąpień publicznych, itp. Obowiązkowe wydają się być identyfikatory zawieszane na szyi, bo chociażby dzięki temu wielu mogło rozpoznać Grzegorza Dudę, który jak to się wyrażono "inaczej wygląda w Sieci, a inaczej na żywo" (Grzegorz, może należałoby już uaktualnić zdjęcie na blogu?!). Przestronne sale i dwa ekrany pozwalały wygodnie rozsiąść się i wysłuchać wystąpienia. Warto było wziąć udział w JDD 2008. Kto nie był, niech żałuje! Dla mnie była to bardzo wartościowa kulturalnie impreza. Już nie mogę doczekać się wyników ankiet z ocenami prezentacji. Podobno będą dostępne publicznie. Brrr...

Moja prezentacja "Wprowadzenie do OSGi i Spring Dynamic Modules (Spring-DM)" dostępna jest jako JacekLaskowski-JDD2008-OSGi-SpringDM-16.10.2008.pdf.

Zatem JDD'08 przechodzi do historii, a przed nami kolejna konferencja - NetBeans Day 2008 w Poznaniu i Gdańsku w weekend 25-26.10.2008. Występuję w Gdańsku z tematem "Tworzenie zaawansowanej logiki biznesowej w aplikacjach Java EE w środowisku NB 6.5", który lekko przydługi na potrzeby przyciągnięcia przychylnego oka sponsorów, a dla nas, technicznych, powinien być raczej "Zaawansowane EJB3 a NetBeans 6.5", gdzie zaprezentuję kilka mniej powszechnych acz bardzo wyrafinowanych funkcjonalności udostępnianych przez EJB3, m.in. rozszerzony kontekst trwały (JPA extended context), ziarna stanowe, interceptory i...jeszcze się zastanawiam, co podciągnąć pod kategorię "zaawansowane". Kolejne dni zapewne spędzę ponownie przeglądając specyfikację EJB3 w poszukiwaniu ciekawych kąsków. Organizatorzy gwarantują dobrą zabawę, na której nie może Cię zabraknąć. Zapraszam w imieniu organizatorów!

13 października 2008

Spring-DM 1.2.0 M1 z Jetty na Equinox z pomocą pax-runner

0 komentarzy
Wczoraj, w pax-runner w akcji - uruchamianie aplikacji webowych jako pakunków OSGi, opisałem uruchamianie aplikacji webowych korzystając z dobrodziejstw pax-runner. Przykładowa aplikacja spring-osgi-webapp uruchomiona została w ramach Jetty, który był zanurzony w Equinoksie za pomocą pakunku org.ops4j.pax.web.service. Prosta aplikacja, więc i proste środowisko wystarczyło (przez "proste" rozumiem wyłącznie łatwość zestawienia gotowego do działania środowiska, a nie funkcjonalność niskiej jakości). Kiedy jednak chcielibyśmy skorzystać z dobrodziejstw oferowanych przez Spring Framework na scenę wchodzi Spring Dynamic Modules for OSGi(tm) Service Platforms (Spring-DM).

Rolą Spring-DM jest monitorowanie środowiska uruchomieniowego OSGi i reagowanie na instalację pakunków korzystających z funkcjonalności Spring Framework, tak aby bardziej restrykcyjne środowisko javowe, jakim jest OSGi, nie powodowało zbyt wielu komplikacji podczas tworzenia i uruchamiania aplikacji. Skoncentrowałem swoje wysiłki na aplikacjach webowych, ale nie ma to w zasadzie wielkiego znaczenia, czy są to aplikacje webowe, czy niewebowe. Chodzi jedynie o połączenie cech Spring Framework i OSGi (potencjalnie z Java EE). Marzenie ściętej głowy? Już przekonałem się, że nie (bagatela, na chwilę przed moim wystąpieniem Wprowadzenie do OSGi i Spring Dynamic Modules (Spring-DM) podczas tegorocznej konferencji Java Developers Day 2008 w Krakowie za...3 dni!). Przekonaj się samemu, że idzie gładko. Zapraszam również na konferencję, abyśmy mogli omówić szczegóły.

Rozpoczynamy od zebrania wymaganych pakunków OSGi do uruchomienia Spring-DM (zakładam, że sam pax-runner jest już gotowy. Nie?! Zajrzyj do wspomnianego pax-runner w akcji - uruchamianie aplikacji webowych jako pakunków OSGi). Posiłkuję się plikami dystrybuowanymi w ramach Spring-DM 1.2.0 M1 oraz dostępnych w repozytoriach Spring-DM OSGified Artifacts Repository i SpringSource Enterprise Bundle Repository. Cały zestaw pakunków to następująca lista:
  • com.springsource.javax.el-2.1.0.jar
  • com.springsource.javax.servlet.jsp-2.1.0.jar
  • com.springsource.javax.servlet.jsp.jstl-1.1.2.jar
  • com.springsource.junit-3.8.2.jar
  • com.springsource.net.sf.cglib-2.1.3.jar
  • com.springsource.org.aopalliance-1.0.0.jar
  • com.springsource.org.apache.taglibs.standard-1.1.2.jar
  • com.springsource.org.objectweb.asm-2.2.3.jar
  • jetty-6.1.9.jar
  • jetty-util-6.1.9.jar
  • jetty.start.osgi-1.0.0.jar
  • jetty.web.extender.fragment.osgi-1.0.0.jar
  • servlet-api.osgi-2.5-SNAPSHOT.jar
  • spring-aop-2.5.5.jar
  • spring-beans-2.5.5.jar
  • spring-context-2.5.5.jar
  • spring-context-support-2.5.5.jar
  • spring-core-2.5.5.jar
  • spring-osgi-core-1.2.0-m1.jar
  • spring-osgi-extender-1.2.0-m1.jar
  • spring-osgi-io-1.2.0-m1.jar
  • spring-osgi-web-1.2.0-m1.jar
  • spring-osgi-web-extender-1.2.0-m1.jar
  • spring-web-2.5.5.jar
  • spring-webmvc-2.5.5.jar
Umieszczam pakunki w wybranym katalogu, powiedzmy springdm-jetty, i uruchamiam pax-runner.
 C:\apps\equinox-springdm\pax-runner-profiles\springdm-jetty
> pax-run "--platform=equinox" "--log=DEBUG" "--profiles=log" springdm-jetty
Po chwili, kiedy przewinie się mnóstwo komunikatów (dzięki --log=DEBUG, który jest dla celów poznawczych, jak działa Spring-DM pod spodem) można podejść do wdrożenia aplikacji webowej korzystającej ze Spring Framework.
 osgi> ss

Framework is launched.

id State Bundle
0 ACTIVE org.eclipse.osgi_3.4.0.v20080605-1900
1 ACTIVE org.eclipse.osgi.util_3.1.300.v20080303
2 ACTIVE org.eclipse.osgi.services_3.1.200.v20070605
3 ACTIVE org.ops4j.pax.logging.pax-logging-api_1.1.1
4 ACTIVE org.ops4j.pax.logging.pax-logging-service_1.1.1
5 ACTIVE com.springsource.javax.el_2.1.0
6 ACTIVE com.springsource.javax.servlet.jsp_2.1.0
7 ACTIVE com.springsource.javax.servlet.jsp.jstl_1.1.2
8 ACTIVE com.springsource.junit_3.8.2
9 ACTIVE com.springsource.net.sf.cglib_2.1.3
10 ACTIVE com.springsource.org.aopalliance_1.0.0
11 ACTIVE com.springsource.org.apache.taglibs.standard_1.1.2
12 ACTIVE com.springsource.org.objectweb.asm_2.2.3
13 ACTIVE org.mortbay.jetty.server_6.1.9
14 ACTIVE org.mortbay.jetty.util_6.1.9
15 ACTIVE org.springframework.osgi.jetty.start.osgi_1.0.0
16 RESOLVED org.springframework.osgi.jetty.web.extender.fragment.osgi_1.0.0
Master=27
17 ACTIVE org.springframework.osgi.servlet-api.osgi_2.5.0.SNAPSHOT
18 ACTIVE org.springframework.bundle.spring.aop_2.5.5
19 ACTIVE org.springframework.bundle.spring.beans_2.5.5
20 ACTIVE org.springframework.bundle.spring.context_2.5.5
21 ACTIVE org.springframework.bundle.spring.context.support_2.5.5
22 ACTIVE org.springframework.bundle.spring.core_2.5.5
23 ACTIVE org.springframework.bundle.osgi.core_1.2.0.m1
24 ACTIVE org.springframework.bundle.osgi.extender_1.2.0.m1
25 ACTIVE org.springframework.bundle.osgi.io_1.2.0.m1
26 ACTIVE org.springframework.bundle.osgi.web_1.2.0.m1
27 ACTIVE org.springframework.bundle.osgi.web.extender_1.2.0.m1
Fragments=16
28 ACTIVE org.springframework.bundle.spring.web_2.5.5
29 ACTIVE org.springframework.bundle.spring.webmvc_2.5.5
Najlepiej skorzystać z przykładów dystrybuowanych w ramach samego Spring-DM. Musimy je zbudować lokalnie za pomocą Apache Maven 2 (nie udało mi się znaleźć ich dostępnych binarnie w Sieci). W katalogu src Spring-DM wykonujemy polecenie mvn package -Pequinox,samples -Dmaven.test.skip=true.
 jlaskowski@work /cygdrive/c/apps/spring-osgi/src
$ mvn package -Pequinox,samples -Dmaven.test.skip=true
...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] ------------------------------------------------------------------------
[INFO] Spring Dynamic Modules ................................ SUCCESS [2.203s]
[INFO] Spring OSGi Mocks ..................................... SUCCESS [8.578s]
[INFO] Spring OSGi IO ........................................ SUCCESS [0.188s]
[INFO] Spring OSGi Core ...................................... SUCCESS [1.343s]
[INFO] Spring OSGi Extender .................................. SUCCESS [0.438s]
[INFO] Spring OSGi Testing Framework ......................... SUCCESS [22.281s]
[INFO] Spring OSGi Web Support ............................... SUCCESS [0.516s]
[INFO] Spring OSGi Web Extender .............................. SUCCESS [0.218s]
[INFO] Spring OSGi Archetype ................................. SUCCESS [1.188s]
[INFO] Spring OSGi Annotations ............................... SUCCESS [0.156s]
[INFO] Spring OSGi Samples ................................... SUCCESS [0.078s]
[INFO] Spring OSGi Samples: Simple Service ................... SUCCESS [0.016s]
[INFO] Spring OSGi Samples: Simple Service Provider .......... SUCCESS [0.062s]
[INFO] Spring OSGi Samples: Simple Service Integration Tests . SUCCESS [0.063s]
[INFO] Spring OSGi Samples: Weather Service .................. SUCCESS [0.000s]
[INFO] Spring OSGi Samples: Weather Service DAO .............. SUCCESS [0.109s]
[INFO] Spring OSGi Samples: Weather Service Extension ........ SUCCESS [0.172s]
[INFO] Spring OSGi Samples: Weather Service Provider ......... SUCCESS [0.109s]
[INFO] Spring OSGi Samples: Weather Service Client ........... SUCCESS [0.125s]
[INFO] Spring OSGi Samples: Weather Service Wiring Bundle .... SUCCESS [0.078s]
[INFO] Spring OSGi Samples: Weather Service Integration Test . SUCCESS [0.125s]
[INFO] Spring OSGi Samples: Simple Web Application ........... SUCCESS [0.000s]
[INFO] Spring OSGi Samples: SimpleWebApp - Log4j Fragment .... SUCCESS [0.438s]
[INFO] Spring OSGi Samples: SimpleWebApp - War Bundle ........ SUCCESS [0.578s]
[INFO] Spring OSGi Samples: SimpleWebApp - Integration Test .. SUCCESS [0.281s]
[INFO] Spring OSGi Samples: OSGi Web Console ................. SUCCESS [0.016s]
[INFO] Spring OSGi Samples: OSGi Web Console - Log4j Fragment SUCCESS [0.359s]
[INFO] Spring OSGi Samples: OSGi Web Console - War Bundle .... SUCCESS [0.719s]
[INFO] ------------------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 47 seconds
Następnie, w ramach konsoli Equinoksa wdrażamy aplikację Simple Web Application (katalog samples/simple-web-app).

Najpierw instalacja pakunku war-1.2.0-m1.war.
 osgi> install file:c:/apps/spring-osgi/src/samples/simple-web-app/war/target/war-1.2.0-m1.war
[OSGi Console] DEBUG org.springframework.osgi.extender.internal.activator.ContextLoaderListener -
Processing bundle event [INSTALLED] for bundle [org.springframework.osgi.samples.simplewebapp]
[OSGi Console] DEBUG org.springframework.osgi.extender.internal.activator.ContextLoaderListener -
Processing bundle event [INSTALLED] for bundle [org.springframework.osgi.samples.simplewebapp]
Bundle id is 30
[Framework Event Dispatcher] INFO org.springframework.osgi.samples.simplewebapp - BundleEvent INSTALLED
Jak można zauważyć instalacja aplikacji (będącej pakunkiem OSGi) wzbudziła słuchacza org.springframework.osgi.extender.internal.activator.ContextLoaderListener, który odpowiedzialny jest za zestawienie środowiska (kontekstu) springowego dla aplikacji korzystających z/opartych o Spring Framework.

Teraz pozostaje już tylko uruchomić pakunek poleceniem start 30 (może być wymagane wciśnięcie ENTER dwukrotnie - raz, aby zatwierdzić polecenie, a drugi w połowie przetwarzania polecenia start). Z komunikatem
 [Timer-3] INFO org.springframework.osgi.web.deployer.jetty.JettyWarDeployer - 
Successfully deployed bundle [Simple OSGi War (org.springframework.osgi.samples.simplewebapp)]
at [/simple-web-app] on server Jetty-6.1.x
pozostaje jedynie odwiedzić stronę aplikacji - http://localhost:8080/spring-osgi-webapp/.

Działa! Kolejny krok to pomysł na ciekawą aplikację webową demonstrującą siłę środowiska OSGi z Spring-DM, czyli mieszankę funkcjonalności OSGi, Spring Framework i Java EE. Wciąż pamiętam komentarze Daniela (zebrane w Pora na łyk OSGi - rozdział 1. Wprowadzenie). I uwierzyć, że gość stosuje Spring Framework z OSGi od tak dawna. Musi mieć niezłą zabawę czytając kolejne wpisy z moimi poczynaniami ;-)

12 października 2008

pax-runner w akcji - uruchamianie aplikacji webowych jako pakunków OSGi

0 komentarzy
Po tygodniach walki ze Spring Dynamic Modules (Spring-DM) zaczynam dostrzegać wiele problemów, które z pewnością wielu odepchnęło od produktu (a może jest to sposób na zainteresowanie innym produktem - SpringSource dm Server?). Mimo nieustających pytań na forum Spring-DM dotyczących uruchomienia Apache Tomcat 6.0.18 na Spring-DM jedyne, co udało się zestawić do tej pory, to lista pakunków z różnych repozytoriów, które ostatecznie pozwoliły mi na wdrożenie pakunku będącego aplikacją webową, aczkolwiek nie udało mi się jej uruchomić w przeglądarce (cf. Trouble with catalina 6.0.18...).

Kiedy to poraz kolejny przeszukiwałem Sieć, aby odnaleźć jakiekolwiek informacje dotyczących uruchomienia aplikacji webowych jako pakunków na Tomcat 6.0.18 w ramach Spring-DM i Equinox natrafiłem na projekt pax-runner. Wystarczyło poznać kilka opcji (niecałe 15 minut i to wyłącznie ze względu na błąd na Windows opisany w FAQ jako I'm using Pax Runner on DOS/Windows, I have the right command but I'm getting strange errors) i mogłem cieszyć się poprawnie działającą aplikacją webową. Faktycznie, spełniły się cele projektu pax-runner opisane w jego sekcji Overview:

If any of the following is true:
  • You often change from one OSGi platform to another.
  • You don't know what OSGi is, but want to spend half an hour checking it out.
  • You can't be bothered about following the setup and requirements README for the OSGi platform of your choice.
  • You have problem to get the OSGi platform working at all.
then perhaps the Pax Runner can help.


Już dawno nie doświadczyłem tego uczucia, kiedy po kwadransie wszystko działało zgodnie z założeniami. Niesamowite uczucie! Spróbuj, a przekonasz się, jak proste oprogramowanie można udostępniać klientom i to całkowicie za darmo (a wspierane technologie i projekty - OSGi, Spring-DM, Equinox wcale nie należą do najprostszych).

Wystarczy pobrać pax-runner (strona Pax Runner - Download), rozpakować w wybranym katalogu i można zaczynać podboje OSGi dla aplikacji webowych. W dodatku wiele z istotnych ustawień konfiguracyjnych, np. uruchomione pakunki czy uruchomienie Equinoksa z "czystą" konfiguracją, jest od razu zapisywane w pliku konfiguracyjnym - runner/equinox/config.ini, który można użyć już poza środowiskiem pax-runner. Wciąż jestem pod wrażeniem prostoty i użyteczności pax-runner. Wiele parametrów konfiguracyjnych jest ustawionych dokładnie jak możnaby sobie tego życzyć. Cudeńko!

 C:\apps\equinox-springdm\pax-runner-log-profile
> pax-run "--platform=equinox" "--log=DEBUG" "--profiles=war"
______ ________ __ __
/ __ / / __ / / / / /
/ ___/ / __ / _\ \ _/
/ / / / / / / _\ \
/__/ /__/ /__/ /_/ /_/

Pax Runner (0.13.0) from OPS4J - http://www.ops4j.org
-----------------------------------------------------

-> Using config [classpath:META-INF/runner.properties]
-> Installing additional services
-> Installing service [service.obr]
-> Installing handlers
-> Handler [handler.mvn]
-> Handler for protocols [mvn] started
-> Handler [handler.classpath]
-> Handler for protocols [classpath] started
-> Handler [handler.war]
-> Handler for protocols [war, war-i] started
-> Handler [handler.wrap]
-> Handler for protocols [wrap] started
-> Handler [handler.obr]
-> Creating replaceable service for [interface org.osgi.service.obr.RepositoryAdmin]
-> Creating service collection for [interface org.osgi.service.obr.RepositoryAdmin]
-> Added service with reference [[org.osgi.service.obr.RepositoryAdmin]]
-> Related service [org.apache.felix.bundlerepository.RepositoryAdminImpl@1201a25]
-> Service changed [null] -> [org.apache.felix.bundlerepository.RepositoryAdminImpl@1201a25]
-> Handler for protocols [obr] started
-> URL stream handler service available [[org.osgi.service.url.URLStreamHandlerService]]
-> Registering protocols [[mvn]] to service [org.ops4j.pax.url.commons.handler.HandlerActivator$Handler@1bd4722]
-> URL stream handler service available [[org.osgi.service.url.URLStreamHandlerService]]
-> Registering protocols [[obr]] to service [org.ops4j.pax.url.commons.handler.HandlerActivator$Handler@1a73d3c]
-> URL stream handler service available [[org.osgi.service.url.URLStreamHandlerService]]
-> Registering protocols [[classpath]] to service [org.ops4j.pax.url.commons.handler.HandlerActivator$Handler@1f20eeb]
-> URL stream handler service available [[org.osgi.service.url.URLStreamHandlerService]]
-> Registering protocols [[wrap]] to service [org.ops4j.pax.url.commons.handler.HandlerActivator$Handler@1b10d42]
-> URL stream handler service available [[org.osgi.service.url.URLStreamHandlerService]]
-> Registering protocols [[war, war-i]] to service [org.ops4j.pax.url.commons.handler.HandlerActivator$Handler@1f7d134]

-> URL stream handler service extender started
-> Installing provisioning
...
[main] INFO org.mortbay.jetty - jetty-6.1.x
...
osgi> install file:c:\projs\osgi\spring-osgi-webapp\target\spring-osgi-webapp.war
Bundle id is [Framework Event Dispatcher] INFO pl.jaceklaskowski.osgi.spring-osgi-webapp - BundleEvent INSTALLED
8

osgi> start 8
[OSGi Console] DEBUG org.ops4j.pax.swissbox.extender.BundleWatcher - Scanning bundle [pl.jaceklaskowski.osgi.spring-osgi
-webapp]
...
[OSGi Console] INFO org.ops4j.pax.web.service.internal.HttpServiceProxy - Setting context paramters [{webapp.context=pl.
jaceklaskowski.osgi.spring-osgi-webapp}] for http context [org.ops4j.pax.web.extender.war.internal.WebAppHttpContext@15e
2075]
...

osgi> ss

Framework is launched.

id State Bundle
0 ACTIVE org.eclipse.osgi_3.4.0.v20080605-1900
1 ACTIVE org.eclipse.osgi.util_3.1.300.v20080303
2 ACTIVE org.eclipse.osgi.services_3.1.200.v20070605
3 ACTIVE org.ops4j.pax.logging.pax-logging-api_1.1.1
4 ACTIVE org.ops4j.pax.logging.pax-logging-service_1.1.1
5 ACTIVE org.ops4j.pax.web.service_0.5.1
6 ACTIVE org.ops4j.pax.web.jsp_0.5.1
7 ACTIVE org.ops4j.pax.web.extender.war_0.4.0
8 ACTIVE pl.jaceklaskowski.osgi.spring-osgi-webapp_1.0.0
I uruchomienie aplikacji w przeglądarce - http://localhost:8080/pl.jaceklaskowski.osgi.spring-osgi-webapp/index.jsp - działa jak należy.

Dodając do cech pax-runner automatyczne pobieranie zależności (pakunków) z Sieci i mamy niewielkie acz bogate funkcjonalnie narzędzie, które każdy parający się OSGi musi koniecznie posmakować.

Jeśli zastanawiasz się, a gdzie jest miejsce dla Spring-DM i po co on nam, to do zestawiania środowiska springowego dla pakunków nie ma (znanego mi) lepszego narzędzia niż on, a pax-runner udostępnia profil spring-dm-1.0.2. Wystarczy uruchomić i do dzieła!

09 października 2008

35. spotkanie Warszawskiej Grupy Użytkowników Technologii Java (Warszawa JUG)

0 komentarzy
Warszawska Grupa Użytkowników Technologii Java (Warszawa JUG) zaprasza na 35. spotkanie, które odbędzie się 14.10.2008 o godzinie 18:00 w sali 5440 Wydziału MIMUW przy ul. Banacha 2 w Warszawie.

Temat prezentacji: Wstęp do Drools/JBoss Rules
Prowadzący: Bartek Jabłoński

Drools jest to silnik reguł, czyli narzędzie pozwalające wydzielić część logiki biznesowej poza sztywny kod aplikacji oraz ułatwia zrozumienie jej i modyfikację przez osoby nietechniczne (a raczej mniej-techniczne - analityków itp).
W czasie prezentacji poznamy:
- co to jest silnik reguł, kiedy go używać, a kiedy nie
- podstawowe konstrukcje języka
- Domain Specyfic Language, czyli jak reguły zapisać w strawnej formie
- Decision Tables, czyli jak w to wszystko włączyć Excela
- mały rzut oka na IDE

Nie zabraknie kilku prezentacji na żywym kodzie.

Bartek Jabłoński jest programistą w firmie eo Networks. Zawodowo zajmuje się głównie aplikacjami webowymi. Uwielbia poznawać nowe technologie i rozwiązania, aczkolwiek doskwiera mu brak czasu na ich intensywniejsze zgłębienie. Sympatią darzy również technologie z zakresu GIS. Poza tym - wspinacz i od jakiegoś czasu biegacz - jabol20's Athlete Homepage.

Planowany czas prezentacji to 1,5 godziny, po której planuje się 15-30-minutową dyskusję.

Wstęp wolny!

Zapraszam w imieniu grupy Warszawa JUG!

07 października 2008

NetBeansowy pracowniks oraz czyszczenie eclipsowego p2

0 komentarzy
Zainspirowany problemem tworzenia aplikacji ze szkieletem Visual Web JavaServer Faces (vel Woodstock) w dyskusji
Połączyć DataModel z komponentami Visual Web JSF na pl.comp.lang.java po dłuższej przerwie wróciłem do NetBeans IDE. Woodstock jest zbiorem kontrolek do budowania interfejsu użytkownika JSF i w zasadzie spodziewałem się, że wszystko, czego zasmakowałem w "czystym" JSF ma zastosowanie i w nim. Zdaje się, że pomyliłem się w stosunku do kontrolki webuijsf:tableRowGroup, której atrybut sourceData nie akceptuje komponentów typu DataModel (!) Temat opiszę niebawem, ale do napisania tego wpisu skłoniła mnie zabawna sytuacja z generowaniem nazw zmiennych w NetBeans IDE korzystając z Ctrl+SPACJA. Wystarczyło napisać private Pracownik[] i wcisnąć wspomnianą kombinację klawiszy Ctrl+SPACJA i...


Przez moment nie mogłem dojść do ładu, skąd ta nazwa zmiennej - pracowniks. Dopiero po pewnym czasie zorientowałem się, że jest to angielska liczba mnoga dla typu Pracownik z tablicy. Natychmiast pomyślałem o Asteriksie ;-) Ech, tylko do czego użyć typu Asterik?! Może inne śmieszne zmienne?

Kolejną ciekawostkę znalazłem na grupie eclipse.technology.equinox, która dotyczyła działania Equinox p2. W ogóle, ostatnimi czasy o niczym innym się tam nie rozmawia, tylko o p2. Jeśli zaczyna brakować Ci dysku (mimo jego początkowej, niewyobrażalnej wręcz objętości), to może warto zainteresować się katalogiem p2/org.eclipse.equinox.p2.engine/profileRegistry/?
 jlaskowski@work /cygdrive/c/apps/eclipse
$ du -sh p2/
249M p2/

jlaskowski@work /cygdrive/c/apps/eclipse
$ du -sh features/ plugins/
6.8M features/
215M plugins/
Dosyć dużo, nieprawdaż? Okazuje się, że Eclipse uruchamiając p2, wzbudza jakąś tam funkcjonalność, która odkłada we wspomnianym katalogu dość obszerny plik profile. Jakkolwiek planuje się ich wykorzystanie w Eclipse IDE 3.5, to w 3.4 zdają się być niepotrzebne. Zatem wystarczy pozostawić ostatnie 5 najmłodszych plików i zaoszczędzić trochę miejsca.

jlaskowski@work /cygdrive/c/apps/eclipse
$ ls p2/org.eclipse.equinox.p2.engine/profileRegistry/PlatformProfile.profile/ | wc -l
46

jlaskowski@work /cygdrive/c/apps/eclipse
$ cd p2/org.eclipse.equinox.p2.engine/profileRegistry/PlatformProfile.profile

jlaskowski@work /cygdrive/c/apps/eclipse/p2/org.eclipse.equinox.p2.engine/profileRegistry/PlatformProfile.profile
$ ls -t | tail -n +6 | xargs rm

jlaskowski@work /cygdrive/c/apps/eclipse/p2/org.eclipse.equinox.p2.engine/profileRegistry/PlatformProfile.profile
$ du -sh .
27M .
Ja już mam to za sobą.