22 sierpnia 2008

Blogorrhea, konfiguracja resource-ref dla Jetty z maven-jetty-plugin oraz APINI Knowledge Base

Zatem już wiadomo - cierpię na dolegliwość zwaną Blogorrhea, która objawia się "wyjątkową aktywnością blogera publikującego w jakimś okresie dużą liczbę wpisów". Czyżbym był jedynym, który cierpi na tę dolegliwość, czyli innymi słowy doświadcza tylu ciekawostek dziennie, że ma, o czym pisać i chce mu się tym podzielić z innymi?! Nie sądzę. Dobrze jednak wiedzieć, na co się choruje i spróbować wyleczyć (jeśli uleczalne) niż cierpieć i nie móc temu zaradzić (tu, taka analogia do osób chcących, ale niemogących - chociaż może lepiej nie pisać, niż trafić do kategorii blogasków ;-)). Skąd taka cisza o tym serwisie helionica.pl? Czyżby Helion nie wierzył w cel jego popularyzacji?! Nawet w książkach z Helionu nie zauważyłem wskazania na ten serwis. Ja tam zamierzam skorzystać z tej wiedzy przy kolejnych moich artykułach. Na Helionicę natrafiłem czytając artykuł Radka Holewy Spring i wstrzykiwanie zależności między bean'ami o różnych zasięgach, w którym można znaleźć wiele polskich odpowiedników dla terminów angielskojęzycznych. Nawet znalazło się miejsce dla rusztowania aplikacyjnego jako odpowiednika framework, a sądziłem, że termin pójdzie w odstawkę. Gratuluję Radek dobrego smaku :P

Podczas tworzenia aplikacji webowej z facelets w roli głównej i wspierającym Apache Maven 2, testowym środowiskiem uruchomieniowym naturalnie stał się Jetty poprzez maven-jetty-plugin. Wystarczy zdefiniować następującą sekcję plugin w pom.xml i można uruchamiać aplikację z mvn jetty:run.
 <plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.10</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<systemProperties>
<systemProperty>
<name>jetty.home</name>
<value>./src</value>
</systemProperty>
<systemProperty>
<name>java.security.auth.login.config</name>
<value>src/etc/login.conf</value>
</systemProperty>
</systemProperties>
<jettyConfig>src/etc/jetty.xml</jettyConfig>
</configuration>
</plugin>
Zmiana strony xhtml nie wymaga ponownego uruchomienia Jetty (cf. scanIntervalSeconds), ale klasy niestety już tak. Mimo wszystko możliwość testowania aplikacji w ten sposób znosi początkowe trudności konfiguracji serwera aplikacyjnego (co może stanowić nie lada wyzwanie czasowe). Owa błogość trwała do momentu, kiedy byłem zmuszony skonfigurować dostęp do bazy danych. Powiało grozą, gdyż nigdy wcześniej nie konfigurowałem Jetty, a już na pewno nie w trybie uruchamiania z poziomu wtyczki maven-jetty-plugin. Szczęśliwie strach ma wielkie oczy i konfiguracja dostępu do bazy danych, to dodanie następujących sekcji Array oraz New do pliku wskazanego przez jettyConfig dla maven-jetty-plugin w pom.xml:
 <Array id="plusConfig" type="java.lang.String">
<Item>org.mortbay.jetty.webapp.WebInfConfiguration</Item>
<Item>org.mortbay.jetty.plus.webapp.EnvConfiguration</Item>
<Item>org.mortbay.jetty.plus.webapp.Configuration</Item>
<Item>org.mortbay.jetty.webapp.JettyWebXmlConfiguration</Item>
<Item>org.mortbay.jetty.webapp.TagLibConfiguration</Item>
</Array>
<New id="facelets-webapp" class="org.mortbay.jetty.webapp.WebAppContext">
<Set name="ConfigurationClasses">
<Ref id="plusConfig" />
</Set>
</New>
<New id="faceletsDB" class="org.mortbay.jetty.plus.naming.Resource">
<Arg>jdbc/faceletsDB</Arg>
<Arg>
<New class="oracle.jdbc.pool.OracleConnectionPoolDataSource">
<Set name="URL">jdbc:oracle:thin:@localhost:1521:DEVEL</Set>
<Set name="User">jacek</Set>
<Set name="Password">laskowski</Set>
</New>
</Arg>
</New>
Oczywiście konieczne jest dodanie klas sterownika bazy danych do ścieżki klas (ang. classpath) Jetty (w moim przypadku konieczne było dodanie ojdbc14.jar dla Oracle 8.2.0.8). Dodanie biblioteki do lokalnego repozytorium mavenowego poleceniem mvn install:install-file:
 jlaskowski@work /cygdrive/c
$ mvn install:install-file -Dfile=ojdbc14.jar -DgroupId=oracle \
-DartifactId=ojdbc14 -Dversion=9.2.0.8 -Dpackaging=jar
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'install'.
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Default Project
[INFO] task-segment: [install:install-file] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] [install:install-file]
[INFO] Installing c:\ojdbc14.jar to C:\.m2\oracle\ojdbc14\9.2.0.8\ojdbc14-9.2.0.8.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
i następującej sekcji dependencies do plugin dla maven-jetty-plugin w pom.xml:
 <dependencies>
<dependency>
<groupId>oracle</groupId>
<artifactId>ojdbc14</artifactId>
<version>9.2.0.8</version>
</dependency>
</dependencies>
kończy pomyślnie temat widoczności klas przez Jetty. Istnieje również możliwość dodania sterownika bazodanowego jako zależności maven-jetty-plugin z kwalifikatorem zasięgu - scope - z wartością system, co zniesie konieczność jego instalacji do lokalnego repozytorium mavena.

Na koniec (a może właśnie od tego powinniśmy zacząć, aby osoba konfigurująca środowisko dla naszej aplikacji była świadoma wymagania) odnotowujemy referencję bazy danych używaną w aplikacji poprzez resource-ref w WEB-INF/web.xml:
 <resource-ref>
<res-ref-name>jdbc/faceletsDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
I tyle. Mogę kontynuować pracę z facelets i maven wzbogaconymi o dostęp do bazy Oracle. Więcej informacji o konfiguracji JNDI w dokumentacji Jetty - Using JNDI Resources with jetty6.

Dostałem na skrzynkę wskazanie na ciekawy produkt APINI Knowledge Base polskiej firmy Verax Systems (nie obawiam się podejrzeń o ukrytą kryptoreklamę, gdyż robię to całkowicie świadomię, aby promować polskie innowacje). Autor wiadomości (pracownik firmy) pisał: "Jacku, przy okazji przeszukiwania Internetu zauważyłem twój pomysł na system Knowledge Base. Mieliśmy podobny problem z gromadzeniem i wymiana informacji, a ponieważ jesteśmy firmą produkującą soft, napisaliśmy na własne potrzeby i nie tylko taki system." I dalej "Szczególnie zachęcam do zapoznania się z multimedialną prezentacją systemu tj. z krótkim filmem o podstawowych funkcjonalnościach systemu oraz o korzyściach płynących z zastosowania tego rozwiązania.". Zabrało mi to niecałe 5 minut (przy aktualnie użytkowanym, niezwykle wolnym łączu w sieci UPC) i przyznaję, że system zrobił na mnie niezwykle pozytywne wrażenie. Zastanawiałem się jak pozycjonują się względem Confluence Wiki czy MediaWiki, ale niestety nie otrzymałem odpowiedzi, więc temat otwarty. Mimo wszystko pomyślałem, że warto wypromować produkt polskiej firmy (chociaż nazwa i domena *.com wcale na to nie wskazują). Chciałbym móc napisać, że jest darmowa wersja dla społeczności javowej, ale nic o tym nie wiem. Może spróbować wykorzystać produkt do stworzenia wspomnianej bazy wiedzy javowej? Czy może lepiej pozostać przy darmowej dla niedochodowych organizacji licencji dla Confluence Wiki, albo wręcz użyć MediaWiki?