12 października 2008

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

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!