<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/atom10full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;C0IBQn8_fyp7ImA9WxRQGEU.&quot;"><id>tag:blogger.com,1999:blog-20941681</id><updated>2008-10-13T09:05:53.147+02:00</updated><title>Jacek Laskowski - Notatnik Projektanta Java EE</title><subtitle type="html">O Javie, Java EE i otwartym oprogramowaniu po polsku</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/posts/default?start-index=26&amp;max-results=25&amp;redirect=false" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>356</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><link rel="self" href="http://feeds.feedburner.com/BlogJackaLaskowskiego" type="application/atom+xml" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><entry gd:etag="W/&quot;C0IBQn89eSp7ImA9WxRQGEU.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-2847727576819397602</id><published>2008-10-12T23:32:00.004+02:00</published><updated>2008-10-13T09:05:53.161+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-13T09:05:53.161+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="osgi" /><title>pax-runner w akcji - uruchamianie aplikacji webowych jako pakunków OSGi</title><content type="html">Po tygodniach walki ze &lt;a href="http://www.springframework.org/osgi"&gt;Spring Dynamic Modules (Spring-DM)&lt;/a&gt; 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 - &lt;a href="http://www.springsource.com/products/suite/dmserver"&gt;SpringSource dm Server&lt;/a&gt;?). Mimo nieustających pytań na &lt;a href="http://forum.springframework.org/forumdisplay.php?f=43"&gt;forum Spring-DM&lt;/a&gt; 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. &lt;a href="http://forum.springframework.org/showthread.php?t=61465"&gt;Trouble with catalina 6.0.18...&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;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 &lt;a href="http://wiki.ops4j.org/confluence/display/ops4j/Pax+Runner"&gt;pax-runner&lt;/a&gt;. 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 &lt;a href="http://wiki.ops4j.org/confluence/display/ops4j/Pax+Runner+-+FAQ#PaxRunner-FAQ-009"&gt;I'm using Pax Runner on DOS/Windows, I have the right command but I'm getting strange errors&lt;/a&gt;) i mogłem cieszyć się poprawnie działającą aplikacją webową. Faktycznie, spełniły się cele projektu pax-runner opisane w jego sekcji &lt;span style="font-style: italic;"&gt;Overview&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;If any of the following is true:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You often change from one OSGi platform to another.&lt;/li&gt;&lt;li&gt;You don't know what OSGi is, but want to spend half an hour checking it out.&lt;/li&gt;&lt;li&gt;You can't be bothered about following the setup and requirements README for the OSGi platform of your choice.&lt;/li&gt;&lt;li&gt;You have problem to get the OSGi platform working at all.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;then perhaps the Pax Runner can help.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;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).&lt;br /&gt;&lt;br /&gt;Wystarczy pobrać pax-runner (strona &lt;a href="http://wiki.ops4j.org/confluence/display/ops4j/Pax+Runner+-+Download"&gt;Pax Runner - Download&lt;/a&gt;), 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 - &lt;span style="font-weight:bold;"&gt;runner/equinox/config.ini&lt;/span&gt;, 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!&lt;br /&gt;&lt;br /&gt;&lt;pre&gt; C:\apps\equinox-springdm\pax-runner-log-profile&lt;br /&gt; &amp;gt; pax-run "--platform=equinox" "--log=DEBUG" "--profiles=war"&lt;br /&gt;     ______  ________  __  __&lt;br /&gt;    / __  / /  __   / / / / /&lt;br /&gt;   /  ___/ /  __   / _\ \ _/&lt;br /&gt;  /  /    /  / /  / / _\ \&lt;br /&gt; /__/    /__/ /__/ /_/ /_/&lt;br /&gt;&lt;br /&gt; Pax Runner (0.13.0) from OPS4J - http://www.ops4j.org&lt;br /&gt; -----------------------------------------------------&lt;br /&gt;&lt;br /&gt;  -&amp;gt; Using config [classpath:META-INF/runner.properties]&lt;br /&gt;  -&amp;gt; Installing additional services&lt;br /&gt;  -&amp;gt; Installing service [service.obr]&lt;br /&gt;  -&amp;gt; Installing handlers&lt;br /&gt;  -&amp;gt; Handler [handler.mvn]&lt;br /&gt;  -&amp;gt; Handler for protocols [mvn] started&lt;br /&gt;  -&amp;gt; Handler [handler.classpath]&lt;br /&gt;  -&amp;gt; Handler for protocols [classpath] started&lt;br /&gt;  -&amp;gt; Handler [handler.war]&lt;br /&gt;  -&amp;gt; Handler for protocols [war, war-i] started&lt;br /&gt;  -&amp;gt; Handler [handler.wrap]&lt;br /&gt;  -&amp;gt; Handler for protocols [wrap] started&lt;br /&gt;  -&amp;gt; Handler [handler.obr]&lt;br /&gt;  -&amp;gt; Creating replaceable service for [interface org.osgi.service.obr.RepositoryAdmin]&lt;br /&gt;  -&amp;gt; Creating service collection for [interface org.osgi.service.obr.RepositoryAdmin]&lt;br /&gt;  -&amp;gt; Added service with reference [[org.osgi.service.obr.RepositoryAdmin]]&lt;br /&gt;  -&amp;gt; Related service [org.apache.felix.bundlerepository.RepositoryAdminImpl@1201a25]&lt;br /&gt;  -&amp;gt; Service changed [null]  -&amp;gt; [org.apache.felix.bundlerepository.RepositoryAdminImpl@1201a25]&lt;br /&gt;  -&amp;gt; Handler for protocols [obr] started&lt;br /&gt;  -&amp;gt; URL stream handler service available [[org.osgi.service.url.URLStreamHandlerService]]&lt;br /&gt;  -&amp;gt; Registering protocols [[mvn]] to service [org.ops4j.pax.url.commons.handler.HandlerActivator$Handler@1bd4722]&lt;br /&gt;  -&amp;gt; URL stream handler service available [[org.osgi.service.url.URLStreamHandlerService]]&lt;br /&gt;  -&amp;gt; Registering protocols [[obr]] to service [org.ops4j.pax.url.commons.handler.HandlerActivator$Handler@1a73d3c]&lt;br /&gt;  -&amp;gt; URL stream handler service available [[org.osgi.service.url.URLStreamHandlerService]]&lt;br /&gt;  -&amp;gt; Registering protocols [[classpath]] to service [org.ops4j.pax.url.commons.handler.HandlerActivator$Handler@1f20eeb]&lt;br /&gt;  -&amp;gt; URL stream handler service available [[org.osgi.service.url.URLStreamHandlerService]]&lt;br /&gt;  -&amp;gt; Registering protocols [[wrap]] to service [org.ops4j.pax.url.commons.handler.HandlerActivator$Handler@1b10d42]&lt;br /&gt;  -&amp;gt; URL stream handler service available [[org.osgi.service.url.URLStreamHandlerService]]&lt;br /&gt;  -&amp;gt; Registering protocols [[war, war-i]] to service [org.ops4j.pax.url.commons.handler.HandlerActivator$Handler@1f7d134]&lt;br /&gt;&lt;br /&gt;  -&amp;gt; URL stream handler service extender started&lt;br /&gt;  -&amp;gt; Installing provisioning&lt;br /&gt;  ...&lt;br /&gt; [main] INFO org.mortbay.jetty - jetty-6.1.x&lt;br /&gt; ...&lt;br /&gt; osgi&amp;gt; install file:c:\projs\osgi\spring-osgi-webapp\target\spring-osgi-webapp.war&lt;br /&gt; Bundle id is [Framework Event Dispatcher] INFO pl.jaceklaskowski.osgi.spring-osgi-webapp - BundleEvent INSTALLED&lt;br /&gt; 8&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; start 8&lt;br /&gt; [OSGi Console] DEBUG org.ops4j.pax.swissbox.extender.BundleWatcher - Scanning bundle [pl.jaceklaskowski.osgi.spring-osgi&lt;br /&gt; -webapp]&lt;br /&gt; ...&lt;br /&gt; [OSGi Console] INFO org.ops4j.pax.web.service.internal.HttpServiceProxy - Setting context paramters [{webapp.context=pl.&lt;br /&gt; jaceklaskowski.osgi.spring-osgi-webapp}] for http context [org.ops4j.pax.web.extender.war.internal.WebAppHttpContext@15e&lt;br /&gt; 2075]&lt;br /&gt; ...&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; ss&lt;br /&gt;&lt;br /&gt; Framework is launched.&lt;br /&gt;&lt;br /&gt; id      State       Bundle&lt;br /&gt; 0       ACTIVE      org.eclipse.osgi_3.4.0.v20080605-1900&lt;br /&gt; 1       ACTIVE      org.eclipse.osgi.util_3.1.300.v20080303&lt;br /&gt; 2       ACTIVE      org.eclipse.osgi.services_3.1.200.v20070605&lt;br /&gt; 3       ACTIVE      org.ops4j.pax.logging.pax-logging-api_1.1.1&lt;br /&gt; 4       ACTIVE      org.ops4j.pax.logging.pax-logging-service_1.1.1&lt;br /&gt; 5       ACTIVE      org.ops4j.pax.web.service_0.5.1&lt;br /&gt; 6       ACTIVE      org.ops4j.pax.web.jsp_0.5.1&lt;br /&gt; 7       ACTIVE      org.ops4j.pax.web.extender.war_0.4.0&lt;br /&gt; 8       ACTIVE      pl.jaceklaskowski.osgi.spring-osgi-webapp_1.0.0&lt;/pre&gt;I uruchomienie aplikacji w przeglądarce - http://localhost:8080/pl.jaceklaskowski.osgi.spring-osgi-webapp/index.jsp - działa jak należy.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wSeV_DMR2uA/SPJ0HgQeekI/AAAAAAAABeQ/9EsAITfRbRE/s1600-h/hello-world.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_wSeV_DMR2uA/SPJ0HgQeekI/AAAAAAAABeQ/9EsAITfRbRE/s320/hello-world.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5256391387361737282" /&gt;&lt;/a&gt;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ć.&lt;br /&gt;&lt;br /&gt;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 &lt;span style="font-weight:bold;"&gt;spring-dm-1.0.2&lt;/span&gt;. Wystarczy uruchomić i do dzieła!&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/418935391" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/2847727576819397602/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2008/10/pax-runner-w-akcji-uruchamianie.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/2847727576819397602?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/2847727576819397602?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2008/10/pax-runner-w-akcji-uruchamianie.html" title="pax-runner w akcji - uruchamianie aplikacji webowych jako pakunków OSGi" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_wSeV_DMR2uA/SPJ0HgQeekI/AAAAAAAABeQ/9EsAITfRbRE/s72-c/hello-world.gif" height="72" width="72" /></entry><entry gd:etag="W/&quot;DEAHQHY5eyp7ImA9WxRQFUU.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-4938833761877916751</id><published>2008-10-09T23:11:00.000+02:00</published><updated>2008-10-09T23:12:11.823+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-09T23:12:11.823+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="warszawa-jug" /><title>35. spotkanie Warszawskiej Grupy Użytkowników Technologii Java (Warszawa JUG)</title><content type="html">&lt;a href="http://www.warszawa.jug.pl"&gt;Warszawska Grupa Użytkowników Technologii Java (Warszawa JUG)&lt;/a&gt; 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.&lt;br /&gt;&lt;br /&gt;Temat prezentacji: &lt;b&gt;Wstęp do Drools/JBoss Rules&lt;/b&gt;&lt;br /&gt;Prowadzący: &lt;b&gt;Bartek Jabłoński&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;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).&lt;br /&gt;W czasie prezentacji poznamy:&lt;br /&gt; - co to jest silnik reguł, kiedy go używać, a kiedy nie&lt;br /&gt; - podstawowe konstrukcje języka&lt;br /&gt; - Domain Specyfic Language, czyli jak reguły zapisać w strawnej formie&lt;br /&gt; - Decision Tables, czyli jak w to wszystko włączyć Excela&lt;br /&gt; - mały rzut oka na IDE&lt;br /&gt;&lt;br /&gt;Nie zabraknie kilku prezentacji na żywym kodzie.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Bartek Jabłoński&lt;/b&gt; jest programistą w firmie &lt;a href="http://www.eo.pl"&gt;eo Networks&lt;/a&gt;. 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 - &lt;a href="http://www.gps-sport.net/users/jabol20"&gt;jabol20's Athlete Homepage&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Planowany czas prezentacji to 1,5 godziny, po której planuje się 15-30-minutową dyskusję.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Wstęp wolny!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Zapraszam w imieniu grupy Warszawa JUG!&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/416143943" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/4938833761877916751/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2008/10/35-spotkanie-warszawskiej-grupy.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/4938833761877916751?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/4938833761877916751?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2008/10/35-spotkanie-warszawskiej-grupy.html" title="35. spotkanie Warszawskiej Grupy Użytkowników Technologii Java (Warszawa JUG)" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email></author></entry><entry gd:etag="W/&quot;CUIMRng8cCp7ImA9WxRQFEw.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-6303614935703882866</id><published>2008-10-07T22:59:00.003+02:00</published><updated>2008-10-07T23:06:27.678+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-07T23:06:27.678+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="eclipse" /><category scheme="http://www.blogger.com/atom/ns#" term="netbeans" /><title>NetBeansowy pracowniks oraz czyszczenie eclipsowego p2</title><content type="html">Zainspirowany problemem tworzenia aplikacji ze szkieletem Visual Web JavaServer Faces (vel Woodstock) w dyskusji &lt;br /&gt;&lt;a href="http://groups.google.com/group/pl.comp.lang.java/browse_thread/thread/36fcdc9810a4d18a#"&gt;Połączyć DataModel z komponentami Visual Web JSF&lt;/a&gt; na &lt;span style="font-weight:bold;"&gt;pl.comp.lang.java&lt;/span&gt; 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 &lt;a href="http://webdev2.sun.com/woodstock-tlddocs/webuijsf/tableRowGroup.html"&gt;webuijsf:tableRowGroup&lt;/a&gt;, której atrybut &lt;span style="font-weight:bold;"&gt;sourceData&lt;/span&gt; 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 &lt;span style="font-weight:bold;"&gt;Ctrl+SPACJA&lt;/span&gt;. Wystarczyło napisać &lt;span style="font-style:italic;"&gt;private Pracownik[]&lt;/span&gt; i wcisnąć wspomnianą kombinację klawiszy Ctrl+SPACJA i...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wSeV_DMR2uA/SOvN2ZWv1kI/AAAAAAAABeI/PG7oqD8bwIs/s1600-h/pracowniks.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/SOvN2ZWv1kI/AAAAAAAABeI/PG7oqD8bwIs/s320/pracowniks.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5254519724660741698" /&gt;&lt;/a&gt;&lt;br /&gt;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?&lt;br /&gt;&lt;br /&gt;Kolejną ciekawostkę znalazłem na grupie &lt;span style="font-weight:bold;"&gt;eclipse.technology.equinox&lt;/span&gt;, która dotyczyła działania &lt;a href="http://wiki.eclipse.org/Equinox_p2_Getting_Started"&gt;Equinox p2&lt;/a&gt;. 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 &lt;span style="font-weight:bold;"&gt;p2/org.eclipse.equinox.p2.engine/profileRegistry/&lt;/span&gt;?&lt;pre&gt; jlaskowski@work /cygdrive/c/apps/eclipse&lt;br /&gt; $ du -sh p2/&lt;br /&gt; 249M    p2/&lt;br /&gt;&lt;br /&gt; jlaskowski@work /cygdrive/c/apps/eclipse&lt;br /&gt; $ du -sh features/ plugins/&lt;br /&gt; 6.8M    features/&lt;br /&gt; 215M    plugins/&lt;/pre&gt;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.&lt;pre&gt;&lt;br /&gt; jlaskowski@work /cygdrive/c/apps/eclipse&lt;br /&gt; $ ls p2/org.eclipse.equinox.p2.engine/profileRegistry/PlatformProfile.profile/ | wc -l&lt;br /&gt; 46&lt;br /&gt;&lt;br /&gt; jlaskowski@work /cygdrive/c/apps/eclipse&lt;br /&gt; $ cd p2/org.eclipse.equinox.p2.engine/profileRegistry/PlatformProfile.profile&lt;br /&gt;&lt;br /&gt; jlaskowski@work /cygdrive/c/apps/eclipse/p2/org.eclipse.equinox.p2.engine/profileRegistry/PlatformProfile.profile&lt;br /&gt; $ ls -t | tail -n +6 | xargs rm&lt;br /&gt;&lt;br /&gt; jlaskowski@work /cygdrive/c/apps/eclipse/p2/org.eclipse.equinox.p2.engine/profileRegistry/PlatformProfile.profile&lt;br /&gt; $ du -sh .&lt;br /&gt; 27M     .&lt;/pre&gt;Ja już mam to za sobą.&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/414169154" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/6303614935703882866/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2008/10/netbeansowy-pracowniks-oraz-czyszczenie.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/6303614935703882866?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/6303614935703882866?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2008/10/netbeansowy-pracowniks-oraz-czyszczenie.html" title="NetBeansowy pracowniks oraz czyszczenie eclipsowego p2" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_wSeV_DMR2uA/SOvN2ZWv1kI/AAAAAAAABeI/PG7oqD8bwIs/s72-c/pracowniks.gif" height="72" width="72" /></entry><entry gd:etag="W/&quot;C0UBQ3Y7fip7ImA9WxRRGEw.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-1924853127086598147</id><published>2008-09-30T23:23:00.004+02:00</published><updated>2008-09-30T23:47:32.806+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-30T23:47:32.806+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="osgi" /><title>Repozytoria pakunków OSGi</title><content type="html">Istnieje kilka repozytoriów pełnoprawnych pakunków OSGi (z odpowiednimi nagłówkami w manifeście) dla popularnych projektów otwartych:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.springsource.com/repository/app/"&gt;SpringSource Enterprise Bundle Repository (aka BRITS)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://static.springframework.org/osgi/docs/current/reference/html/appendix-osgi-repo.html"&gt;Spring-DM OSGi Repository&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.eclipse.org/orbit/"&gt;Eclipse Orbit&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.knopflerfish.org/repo/"&gt;Knopflerfish bundle repository&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://felix.apache.org/site/apache-felix-commons.html"&gt;Apache Felix Commons&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.osgi.org/Repository/HomePage"&gt;OSGi Bundle Repository (OBR)&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Naturalnym jest, że skoro pakunki OSGi są zwykłymi plikami jar z odpowiednimi nagłówkami w manifeście (cf. &lt;a href="http://jlaskowski.blogspot.com/2008/03/kolejny-yk-osgi-rozdzia-3-warstwa.html"&gt;Kolejny łyk OSGi - rozdział 3. Warstwa modułowa&lt;/a&gt;) dowolne repozytoria mavenowe (np. http://repo1.maven.org/maven2/) lub dowolne inne udostępniające jary, mogą być używane przy zestawianiu środowiska z wymaganymi zależnościami. Problemem jest określenie zależności między pakunkami poprzez nagłówki &lt;span style="font-weight: bold;"&gt;Import-Package&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;Export-Package&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;Ignore-Package&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;Private-Package&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;DynamicImport-Package&lt;/span&gt; i in. dla zwykłych plików jar, co nie jest obsługiwane przez Platformę OSGi bez dodatkowej pracy przy ich konfiguracji jako pakunki. Właśnie to jest zaletą pobrania plików jar z w/w repozytoriów - posiadanie gwarancji, że są one poprawnymi pakunkami. Założeniem repozytoriów jest udostępnianie poprawnie skonfigurowanych pakunków ze wszystkimi wymaganymi nagłówkami. Jako, że są to oddzielne repozytoria, zarządzane przez różne osoby, czasami prowadzi to do sytuacji, gdzie pakunek X w repozytorium R1 ma inne wymagania niż pakunek X w repozytorium R2 (niestety w tej chwili nie mogę znaleźć informacji o zgłoszonej rozbieżności między Orbit a BRITS). Światło na ich przydatność może rzucić wątek - &lt;a href="http://forum.springframework.org/showthread.php?t=60957"&gt;BRITS vs. Temporary Spring-DM Repo&lt;/a&gt;, gdzie mimo prowadzenia dwóch repozytoriów przez pojedyńczą firmę SpringSource, nawet one mają niepoprawnie zdefiniowane pakunki.&lt;br /&gt;&lt;br /&gt;Rozwiązaniem rozmieszczenia pakunków w repozytorium jest specyfikacja &lt;a href="http://www.osgi.org/Download/File?url=/download/rfc-0112_BundleRepository.pdf"&gt;OSGi RFC 112 Bundle Repository&lt;/a&gt;. Innym sposobem zaradzenia problemom z nieścisłymi deklaracjami pakunków jest projekt &lt;a href="http://wiki.ops4j.org/confluence/display/ops4j/Pax+URL"&gt;Pax URL&lt;/a&gt;, który pozwala na instalację dowolnego pliku jar dostępnego poprzez inne protokoły dostępu niż domyślne http czy file, np. classpath, mvn, wrap lub narzędzie &lt;a href="http://www.aqute.biz/Code/Bnd"&gt;bnd&lt;/a&gt;. Bez względu jakiego narzędzia zastosujemy, część pracy i tak będziemy musieli wykonać samodzielnie, np. przy wykorzystaniu mechanizmu prześwietlania w Javie (Reflection API), gdzie nazwa klasy podawana jest niejawnie. W takiej sytuacji skorzystanie z gotowego pakunku dla popularnego projektu otwartego z w/w repozytoriów może być najmniej czasochłonnym rozwiązaniem (jeśli istnieje).&lt;br /&gt;&lt;br /&gt;Zabawa dla wytrwałych i dociekliwych: Co oznacza skrót BRITS będący alternatywną nazwą dla repozytorium SpringSource Enterprise Bundle Repository? (odpowiedzi można szukać w &lt;a href="http://underlap.blogspot.com/2008/04/springsource-application-platform-ships.html"&gt;SpringSource Application Platform ships&lt;/a&gt;).&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/407650131" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/1924853127086598147/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2008/09/repozytoria-pakunkw-osgi.html#comment-form" title="Komentarze (1)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/1924853127086598147?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/1924853127086598147?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2008/09/repozytoria-pakunkw-osgi.html" title="Repozytoria pakunków OSGi" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email></author></entry><entry gd:etag="W/&quot;CkIFRn89eSp7ImA9WxRRF08.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-6073186087009376276</id><published>2008-09-29T22:22:00.004+02:00</published><updated>2008-09-29T22:35:17.161+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-29T22:35:17.161+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="eclipse" /><category scheme="http://www.blogger.com/atom/ns#" term="osgi" /><title>Eclipse IDE 3.5M2 a Eclipse Equinox i OSGi R4.2</title><content type="html">Dzisiaj, podczas pobierania pełnej wersji Equinoksa (wraz ze wszystkimi dostępnymi pakunkami) - &lt;a href="http://download.eclipse.org/equinox/drops/S-3.5M1-200808071402/index.php"&gt;eclipse-equinox-3.5M1.zip&lt;/a&gt; pojawił się poniższy komunikat:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;The Equinox downloads are meant as a base for building OSGi applications. As such, they do not include an application of their own and simply running the framework will do nothing.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Teraz już wiem, co autorzy mieli na myśli. Po prostu pobieram samo środowisko uruchomieniowe dla pakunków OSGi (w świecie Eclipse będą to wtyczki), bez których nie ma co oczekiwać funkcjonalności oferowanej przez Eclipse IDE. Podobnie jak z serwerem aplikacyjnym Java EE 5, bez aplikacji korporacyjnych, nie ma czego więcej oczekiwać od niego, poza udostępnieniem usług, na bazie których można je konstruować. Dodatkowo, komunikat może być o tyle ważny, gdyż po pobraniu paczki &lt;span style="font-weight:bold;"&gt;Eclipse Equinox 3.5M1&lt;/span&gt; i rozpakowaniu, pojawi się katalog &lt;span style="font-weight:bold;"&gt;eclipse&lt;/span&gt; z podkatalogami &lt;span style="font-weight:bold;"&gt;features&lt;/span&gt; oraz &lt;span style="font-weight:bold;"&gt;plugins&lt;/span&gt;, co idealnie odpowiada strukturze bogatego funkcjonalnie Eclipse IDE (w końcu to nic innego jak zestaw wtyczek w katalogu plugins uruchamianych na Equinoksie).&lt;br /&gt;&lt;br /&gt;Uważni obserwatorzy projektu Eclipse IDE zauważyli zapewne pojawienie się wersji &lt;span style="font-weight:bold;"&gt;Eclipse IDE 3.5M2&lt;/span&gt;, w której pojawiły się zmiany w obszarze Equinoksa (opisane w dokumencie &lt;a href="http://download.eclipse.org/eclipse/downloads/drops/S-3.5M2-200809180100/eclipse-news-M2.html#Equinox"&gt;Eclipse 3.5 M2 - New and Noteworthy&lt;/a&gt; dla Equinox):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;span style="font-weight:bold;"&gt;Security Manager enhancements&lt;/span&gt;&lt;br /&gt;This milestone includes an implementation of RFC 120 from the OSGi R4.2 draft specification. RFC 120 specifies enhancements to the Conditional Permission Admin service which is used to manage the permissions assigned to bundles. The enhancements include adding the ability to grant or deny permissions based on conditions, and to manage conditions as an ordered list of rules. For more information see the &lt;a href="http://www.osgi.org/Download/File?url=/download/osgi-4.2-early-draft.pdf"&gt;OSGi R4.2 draft spec&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;oraz&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;span style="font-weight:bold;"&gt;New publisher bundle&lt;/span&gt;&lt;br /&gt;&lt;a href="http://wiki.eclipse.org/p2"&gt;p2&lt;/a&gt; has introduced a new bundle called the publisher, which provides infrastructure for generating, packaging, and publishing metadata and artifacts into p2 repositories. The publisher provides an extensible API that clients can extend to perform customized publishing to repositories, and includes an advice mechanism for injecting additional metadata into the generation and packaging process.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nie powinno dziwić, że Equinox przewodzi peletonowi platform OSGi zabierając się za realizację specyfikacji OSGi R4.2, która jakkolwiek w fazie szkicu, potrzebuje środowiska referencyjnego, aby pomóc w akceptacji proponowanych funkcjonalności przez programistów. Dla Java EE 5 referencyjną implementacją jest GlassFish, a dla OSGi jest nią Eclipse Equinox. Zastanawiam się jednak, czy powinienem prowadzić doświadczenia z Equinoksem dystrybuowanym w ramach Eclipse IDE (org.eclipse.osgi_3.5.0.v20080916-2300.jar), czy pobierać bezpośrednio ze strony domowej Eclipse Equinox (org.eclipse.osgi_3.5.0.v20080804-1730.jar). Aktualność samodzielnego Equinoksa nie pozostawia złudzeń - ten dystrybuowany z Eclipse jest aktualniejszy oraz gwarantuje się jego działanie przez włączenie do Eclipse IDE, więc od razu przechodzę na niego. Kilka dni temu próbowałem pobrać wersję Eclipse Equinox 3.5M2 i niestety, ale kończyło się na "404 File Not Found". Może jutro?&lt;br /&gt;&lt;br /&gt;p.s. Od momentu zainteresowania OSGi doszła mi kolejna sekcja, którą monitoruję pod kątem zmian w Eclipse - sekcja "Equinox" w "New and Noteworthy". A u Ciebie? ;-)&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/406595231" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/6073186087009376276/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2008/09/eclipse-ide-35m2-eclipse-equinox-i-osgi.html#comment-form" title="Komentarze (2)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/6073186087009376276?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/6073186087009376276?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2008/09/eclipse-ide-35m2-eclipse-equinox-i-osgi.html" title="Eclipse IDE 3.5M2 a Eclipse Equinox i OSGi R4.2" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email></author></entry><entry gd:etag="W/&quot;AkcGSHY7fSp7ImA9WxRRFk4.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-2191943568275072226</id><published>2008-09-28T23:29:00.002+02:00</published><updated>2008-09-28T23:40:29.805+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-28T23:40:29.805+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="osgi" /><title>Katalog plugins i automatyczna instalacja pakunków OSGi na Equinoksie</title><content type="html">Już kiedyś wspominałem o tym dokumentcie - &lt;a href="http://www.eclipse.org/equinox/documents/quickstart.php"&gt;Equinox QuickStart Guide&lt;/a&gt; - ale nigdy jakoś nie usiadłem nad nim i dokładnie przeanalizowałem jego treści. Tym razem jednak, po kilku dniach zestawiania potrzebnych pakunków do uruchomienia &lt;span style="font-weight:bold;"&gt;Spring-DM 1.2.0-m2-SNAPSHOT&lt;/span&gt; na &lt;a href="http://www.eclipse.org/equinox/"&gt;Eclipse Equinox&lt;/a&gt; i przekroczeniu 10 pakunków koniecznych do jego uruchomienia, stwierdziłem, że wystarczy tych ręcznych robótek i pora skrócić moje cierpienia - pójść po rozum do głowy i skorzystać z ułatwień, które są na wyciągnięcie ręki - automatyczne uruchamianie pakunków przy starcie Equinoksa. Przy okazji, poznając działanie Equinoksa poznajemy działanie całego Eclipse, który mechanizm wtyczek oparł całkowicie o OSGi z Equinox w roli środowiska uruchomieniowego.&lt;br /&gt;&lt;br /&gt;Podczas uruchamiania Equinoksa poleceniem&lt;pre&gt; java -jar org.eclipse.osgi_3.5.0.v20080804-1730.jar -console&lt;/pre&gt;uruchomiony zostaje automatycznie pakunek systemowy - &lt;span style="font-weight:bold;"&gt;org.eclipse.osgi&lt;/span&gt;. Ma on identyfikator 0 i będzie tak na każdej platformie OSGi (oczywiście nazwa pakunku systemowego będzie inna, specyficzna dla danej platformy).&lt;pre&gt; jlaskowski@work /cygdrive/c/apps/equinox&lt;br /&gt; $ java -jar org.eclipse.osgi_3.5.0.v20080804-1730.jar -console&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; ss&lt;br /&gt;&lt;br /&gt; Framework is launched.&lt;br /&gt;&lt;br /&gt; id      State       Bundle&lt;br /&gt; 0       ACTIVE      org.eclipse.osgi_3.5.0.v20080804-1730&lt;/pre&gt;Przy pierwszym uruchomieniu tworzony jest katalog &lt;span style="font-weight:bold;"&gt;configuration&lt;/span&gt; w katalogu bieżącym (z możliwością wskazania innego parametrem &lt;span style="font-weight:bold;"&gt;-configuration&lt;/span&gt;).&lt;pre&gt; jlaskowski@work /cygdrive/c/apps/equinox&lt;br /&gt; $ ls -lt&lt;br /&gt; total 988&lt;br /&gt; drwxr-xr-x+ 3 jlaskowski None       0 Sep 28 21:27 configuration&lt;br /&gt; -rwx------+ 1 jlaskowski None 1009283 Sep 22 16:07 org.eclipse.osgi_3.5.0.v20080804-1730.jar&lt;/pre&gt;Instalacja pakunków odbywa się poleceniem &lt;span style="font-weight:bold;"&gt;install&lt;/span&gt; &amp;lt;plik_pakunku&amp;gt;. Jeśli założę katalog &lt;span style="font-weight:bold;"&gt;plugins&lt;/span&gt; (na razie przyjmijmy, że jest to nazwa całkowicie przypadkowa), a w nim umieszczę pakunek spring-osgi-core-1.2.0-m2-SNAPSHOT.jar, jego instalacja będzie wyglądała następująco:&lt;pre&gt; jlaskowski@work /cygdrive/c/apps/equinox&lt;br /&gt; $ java -jar org.eclipse.osgi_3.5.0.v20080804-1730.jar -console&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; ss&lt;br /&gt;&lt;br /&gt; Framework is launched.&lt;br /&gt;&lt;br /&gt; id      State       Bundle&lt;br /&gt; 0       ACTIVE      org.eclipse.osgi_3.5.0.v20080804-1730&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; install file:plugins/spring-osgi-core-1.2.0-m2-SNAPSHOT.jar&lt;br /&gt; Bundle id is 1&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; ss&lt;br /&gt;&lt;br /&gt; Framework is launched.&lt;br /&gt;&lt;br /&gt; id      State       Bundle&lt;br /&gt; 0       ACTIVE      org.eclipse.osgi_3.5.0.v20080804-1730&lt;br /&gt; 1       INSTALLED   org.springframework.bundle.osgi.core_1.2.0.m2-SNAPSHOT&lt;/pre&gt;Kolejne uruchomienie platformy OSGi gwarantuje uruchomienie pakunków do stanu, który był bieżącym przed zatrzymaniem całej Platformy, np. poleceniem &lt;span style="font-weight:bold;"&gt;close&lt;/span&gt; dla Equinoksa. Właśnie katalog &lt;span style="font-style:italic;"&gt;configuration&lt;/span&gt; jest katalogiem, gdzie utrwalone zostają informacje o stanie pakunku (i skasowanie go powoduje skasowanie danych pakunków, co równoważne jest z uruchomieniem początkowym Equinoksa).&lt;pre&gt; jlaskowski@work /cygdrive/c/apps/equinox&lt;br /&gt; $ java -jar org.eclipse.osgi_3.5.0.v20080804-1730.jar -console&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; ss&lt;br /&gt;&lt;br /&gt; Framework is launched.&lt;br /&gt;&lt;br /&gt; id      State       Bundle&lt;br /&gt; 0       ACTIVE      org.eclipse.osgi_3.5.0.v20080804-1730&lt;br /&gt; 1       INSTALLED   org.springframework.bundle.osgi.core_1.2.0.m2-SNAPSHOT&lt;/pre&gt;Przy pojedyńczym pakunku sprawa jego instalacji i uruchomienia nie jest poważnym zadaniem. Sprawa zaczyna się komplikować, kiedy przychodzi nam uruchomić, powiedzmy, 20 pakunków. Wtedy pozostaje nam liczyć na poprawny katalog &lt;span style="font-style:italic;"&gt;configuration&lt;/span&gt;, albo...&lt;span style="font-weight:bold;"&gt;config.ini&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Plik &lt;span style="font-weight:bold;"&gt;config.ini&lt;/span&gt; w katalogu &lt;span style="font-style:italic;"&gt;configuration&lt;/span&gt; jest plikiem konfiguracyjnym Equinoksa, w którym definiuje się, jakie pakunki mają zostać uruchomione i gdzie one w ogóle się znajdują. Dodając do tego wsparcie pakunku &lt;span style="font-weight:bold;"&gt;org.eclipse.update.configurator&lt;/span&gt; nie musimy umieszczać nazw wszystkich pakunków do instalacji w pliku config.ini, a wystarczy umieścić je w katalogu &lt;span style="font-weight:bold;"&gt;plugins&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Zatem plik config.ini prezentuje się następująco:&lt;pre&gt; eclipse.ignoreApp=true&lt;br /&gt; osgi.bundles=org.eclipse.equinox.common@2:start, org.eclipse.update.configurator@3:start&lt;/pre&gt;a sama struktura katalogowa tak:&lt;pre&gt; |____configuration&lt;br /&gt; | |____config.ini&lt;br /&gt; |____org.eclipse.equinox.common_3.4.0.v20080421-2006.jar&lt;br /&gt; |____org.eclipse.osgi_3.5.0.v20080804-1730.jar&lt;br /&gt; |____org.eclipse.update.configurator_3.2.200.v20080417.jar&lt;br /&gt; |____plugins&lt;br /&gt; | |____spring-osgi-core-1.2.0-m2-SNAPSHOT.jar&lt;/pre&gt;Pakunek org.eclipse.equinox.common pobrałem ze strony &lt;a href="http://download.eclipse.org/eclipse/equinox/drops/S-3.5M1-200808071402/index.php"&gt;Equinox Stable Build: 3.5M1&lt;/a&gt;, natomiast org.eclipse.update.configurator znalazłem w katalogu Eclipse Ganymede w plugins (nigdzie indziej nie mogłem go namierzyć).&lt;br /&gt; &lt;br /&gt;Przy powyższej konfiguracji każdy z pakunków umieszczonych w katalogu &lt;span style="font-style:italic;"&gt;plugins&lt;/span&gt; będzie zainstalowany automatycznie podczas uruchomienia Equinoksa.&lt;pre&gt; jlaskowski@work /cygdrive/c/apps/equinox&lt;br /&gt; $ java -jar org.eclipse.osgi_3.5.0.v20080804-1730.jar -console&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; ss&lt;br /&gt;&lt;br /&gt; Framework is launched.&lt;br /&gt;&lt;br /&gt; id      State       Bundle&lt;br /&gt; 0       ACTIVE      org.eclipse.osgi_3.5.0.v20080804-1730&lt;br /&gt; 1       ACTIVE      org.eclipse.equinox.common_3.4.0.v20080421-2006&lt;br /&gt; 2       ACTIVE      org.eclipse.update.configurator_3.2.200.v20080417&lt;br /&gt; 3       INSTALLED   org.springframework.bundle.osgi.core_1.2.0.m2-SNAPSHOT&lt;/pre&gt;Z pewnością znacząco uprości zabawę z uruchomieniem wszystkich pakunków Spring-DM niezbędnych do uruchomienia aplikacji webowych na Apache Tomcat 6.0.18 w ramach Equinoksa. Do tej pory wymagało to ręcznego uruchamiania około 20 pakunków przy każdorazowym usunięciu katalogu configuration (!)&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/405702050" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/2191943568275072226/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2008/09/katalog-plugins-i-automatyczna.html#comment-form" title="Komentarze (1)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/2191943568275072226?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/2191943568275072226?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2008/09/katalog-plugins-i-automatyczna.html" title="Katalog plugins i automatyczna instalacja pakunków OSGi na Equinoksie" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email></author></entry><entry gd:etag="W/&quot;D0MHRXczeyp7ImA9WxRRFEg.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-5903951690327078499</id><published>2008-09-26T20:17:00.005+02:00</published><updated>2008-09-26T20:57:14.983+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-26T20:57:14.983+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="websphere" /><category scheme="http://www.blogger.com/atom/ns#" term="konferencje" /><title>WAS 7.0 już jest oraz JDD 2008 i NetBeans Day 2008 nadchodzą</title><content type="html">Nie mogłem doczekać się, aż to opublikuję i w końcu jest! Wielki dzień dla społeczności Korporacyjnej 5-tki (Java EE 5), gdyż IBM wypuścił na runek długooczekiwany produkt &lt;a href="http://www.ibm.com/software/webservers/appserv/was/"&gt;IBM WebSphere Application Server V7.0&lt;/a&gt; (&lt;a href="  http://www-01.ibm.com/common/ssi/rep_ca/6/897/ENUS208-266/index.html"&gt;IBM WebSphere Application Server V7.0 delivers an agile, solid foundation for SOA to align the advancements of business and IT&lt;/a&gt;). Nie planuję rozpisywać się nad jego możliwościami, bo są one znane i (nie)lubiane ;-) Ważne, że czekamy jedynie na JBoss AS 5, który ma zamknąć okres rozwoju serwerów aplikacyjnych w ich krucjacie do pełnego wsparcia specyfikacji Java EE 5. Szczęśliwcy, którzy mogą już pracować z Korporacyjną 5-tką, a wszystkim pozostałym zaleca się natychmiastową migrację na nową platformę. Zdaje się, że kolejnym obowiązkowym elementem serwerów aplikacyjnych Java EE 5 będzie OSGi. Niewiele serwerów udostępnia możliwość uruchamiania aplikacji korporacyjnych budowanych na bazie pakunków, ale wiele korzysta z nich wewnętrznie. Sądzę, że wsparcie dla OSGi będzie kolejnym dużym krokiem w rozwoju serwerów aplikacyjnych, czym znacznie powinny uprościć tworzenie złożonych aplikacji korporacyjnych. W niezwykle ciekawych czasach żyjemy (i wciąż żyjemy, mimo codziennych ochów, echów, i innych sercowych atrakcji, nie wspominając o wszechobecnym stresie ;-))!&lt;br /&gt;&lt;br /&gt;Korzystając z chwili rozgłoszę również dwie nadchodzące imprezy, których mam przyjemność być aktywnym uczestnikiem - &lt;a href="http://08.jdd.org.pl/"&gt;JDD 2008&lt;/a&gt; w Krakowie oraz &lt;a href="http://netbeansday.pl/"&gt;NetBeans Day 2008&lt;/a&gt; w Poznaniu i Gdańsku. Pierwsza już za niecałe 3 tygodnie - &lt;span style="font-weight:bold;"&gt;16 października&lt;/span&gt;, a druga tydzień później - &lt;span style="font-weight:bold;"&gt;25 października&lt;/span&gt; w Poznaniu, po czym kolejnego dnia - &lt;span style="font-weight:bold;"&gt;26 października&lt;/span&gt; - przenosi się do Gdańska. Już nie mogę doczekać się podzielenia się z Wami nowinkami z obszaru OSGi i Spring Dynamic Modules (Spring-DM) w Krakowie, a przeglądem nowości NetBeans 6.5 w Poznaniu i Gdańsku. Już od miesięcy przygotowuję się do występów, więc merytorycznie jestem przygotowany conajmniej na 3+ ;-) Dodatkowe pytania i sugestie, o czym chcielibyście posłuchać w kontekście Spring-DM, a później NetBeans IDE 6.5 mile widziane. Nikt nie życzy sobie spędzenia godziny na moim przedłużającym się wystąpieniu, więc stwórzmy miejsce wymiany doświadczeń, gdzie zostanie zaprezentowanego wiele technicznego materiału i pojawią się ciekawe pytania. Liczę na Was, nie mniej niż Wy na mnie!&lt;br /&gt;&lt;br /&gt;Za kilka dni - &lt;span style="font-weight:bold;"&gt;7 października o godz. 19:00&lt;/span&gt; - w Warszawie odbędzie się &lt;span style="font-style:italic;"&gt;pierwsze spotkanie blogerów piszących o IT dla pasjonatów IT&lt;/span&gt; - &lt;a href="http://bloggersunderground.spaces.live.com/"&gt;Bloggers Underground&lt;/a&gt;. Spotkanie organizowane przez grupę microsoftową, aczkolwiek obiecano, że będzie wyłącznie merytorycznie (czyli nie pojawią się wstawki jaka to Vista jest cacy i takie tam). Zaproszony, od razu zapisałem się z nadzieją podpatrzenia, jak inni sobie radzą w temacie dzielenia się wiedzą poprzez blogi (nawet, jeśli zajmują się niszowymi rozwiązaniami spod znaku MS ;-)). Zawsze wierzę, że poznawanie nowych osób, to miejsce na nowe pomysły i tym razem jestem przekonany, że nie będzie inaczej. Zapraszam w imieniu organizatorów.&lt;br /&gt;&lt;br /&gt;Jeśli Ty wciąż zastanawiasz się, czy blog mógłby być dla Ciebie źródłem inspiracji i pomysłów zapraszam do lektury &lt;a href="http://www.pozaschematy.pl/2008/09/23/najlepsze-nasiona/"&gt;Najlepsze nasiona&lt;/a&gt; (gdzie nie będzie ziaren EJB, a jedynie nasiona, ale i tak warto). Autorka już niejeden raz ciekawie przedstawiła otaczającą mnie rzeczywistość i chętnie czytam jej wpisy, a teraz mogę wskazać jeden jako argument do założenia własnego bloga. Jeśli go nie masz, to właśnie dzisiaj jest ten dzień, abyś miał. Jeśli nie blog, to przynajmniej udział w grupie jugowej w Twoim mieście, organizacja konferencji, albo chociażby nieformalne spotkanie w grupie entuzjastów javowych. Cokolwiek, ale odejdź w końcu od komputera i spotkaj się z kimś nowym! Niedługo &lt;a href="http://www.warsjava.pl"&gt;Warsjava+Eclipse DemoCamp 2008&lt;/a&gt; w Warszawie, więc będzie okazja się spotkać i przegadać to i owo. A może udział w spotkaniu &lt;a href="http://www.warszawa.jug.pl"&gt;Warszawa JUG&lt;/a&gt; na MIMUW 30-tego? Będzie Szimano, więc dobra zabawa murowana (a że się doktoryzuje, więc i naukowo trochę również będzie ;-)). Zapraszam!&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/404025944" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/5903951690327078499/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2008/09/was-70-ju-jest-oraz-jdd-2008-i-netbeans.html#comment-form" title="Komentarze (3)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/5903951690327078499?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/5903951690327078499?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2008/09/was-70-ju-jest-oraz-jdd-2008-i-netbeans.html" title="WAS 7.0 już jest oraz JDD 2008 i NetBeans Day 2008 nadchodzą" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email></author></entry><entry gd:etag="W/&quot;A0YASHgyfCp7ImA9WxRREkU.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-2521807889807453582</id><published>2008-09-24T22:35:00.004+02:00</published><updated>2008-09-24T22:45:49.694+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-24T22:45:49.694+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="osgi" /><category scheme="http://www.blogger.com/atom/ns#" term="spring-dm" /><title>Equinox i jego diag do analizy wymagań pakunku OSGi</title><content type="html">Dzisiaj postanowiłem spróbować odpowiedzieć kilku osobom o roli &lt;a href="http://www.springframework.org/osgi"&gt;Spring Dynamic Modules (Spring-DM)&lt;/a&gt; w integracji &lt;span style="font-weight:bold;"&gt;Spring Framework&lt;/span&gt;, &lt;span style="font-weight:bold;"&gt;OSGi&lt;/span&gt; i aplikacji webowych. Efektem prac miała być demonstracyjna aplikacja webowa, gdzie biblioteki z &lt;span style="font-weight:bold;"&gt;WEB-INF/lib&lt;/span&gt; byłyby osobnymi pakunkami, a sam katalog byłby pusty. Już rozpisałem sobie plan działania - stworzenie projektu aplikacji webowej, pakunków, itp., uruchomienie platformy OSGi (w tej roli Equinox) ze Spring-DM, gdzie w roli głównej występowałby pakunek &lt;span style="font-weight:bold;"&gt;Spring-DM web extender&lt;/span&gt; (&lt;span style="font-weight:bold;"&gt;spring-osgi-web-extender&lt;/span&gt;), i...właśnie, w chwili kiedy napisałem nazwę tego pakunku postanowiłem zacząć od tyłu - od uruchomienia pakunku spring-osgi-web-extender. Jego rolą jest nasłuchiwanie na zdarzenia instalacji i odinstalowywania pakunków, i przy spełnieniu warunków dla pakunków OSGi będących aplikacjami webowymi - rozszerzenie war lub posiadanie katalogu WEB-INF - przekazanie ich do kontenera servletów (dostępne są Apache Tomcat lub Jetty). Już pisałem o nim trochę w notce &lt;a href="http://jlaskowski.blogspot.com/2008/05/aplikacja-webowa-jako-pakunek-osgi-ze.html"&gt;Aplikacja webowa jako pakunek OSGi ze Spring Dynamic Modules&lt;/a&gt;, ale tamto dotyczyło Spring-DM 1.1.0 M2, a teraz pracuję z &lt;span style="font-weight:bold;"&gt;Spring-DM 1.2.0-m2-SNAPSHOT&lt;/span&gt; (zbudowanym samodzielnie ze źródeł - instrukcja w notce &lt;a href="http://jlaskowski.blogspot.com/2008/09/budowanie-spring-dm-ze-rde.html"&gt;Budowanie Spring-DM ze źródeł&lt;/a&gt;) i wiele się zmieniło. Stwierdziłem, że do tematu podejdę na opak, gdzie narzędziami diagnostycznymi Equinoksa rozpoznam zależności pakunku spring-osgi-web-extender i po kolei będę je wczytywał. W końcu zbudowałem Spring-DM ze źródeł z włączonymi testami jednostkowymi, więc miałem pewność, że wszystkie niezbędne biblioteki-pakunki miałem w moim lokalnym repozytorium mavenowym.&lt;br /&gt;&lt;br /&gt;Rozpocząłem od uruchomienia platformy OSGi, którą był &lt;span style="font-weight:bold;"&gt;Eclipse Equinox&lt;/span&gt;.&lt;pre&gt; jlaskowski@work /cygdrive/c/apps/equinox&lt;br /&gt; $ java -jar org.eclipse.osgi_3.5.0.v20080804-1730.jar -console&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; ss&lt;br /&gt;&lt;br /&gt; Framework is launched.&lt;br /&gt;&lt;br /&gt; id      State       Bundle&lt;br /&gt; 0       ACTIVE      org.eclipse.osgi_3.5.0.v20080804-1730&lt;/pre&gt;Następnie zainstalowałem pakunek spring-osgi-web-extender (z lokalnego repozytorium mavenowego).&lt;pre&gt; osgi&amp;gt; install file:/C:/.m2/org/springframework/osgi/spring-osgi-web-extender/&lt;br /&gt;   1.2.0-m2-SNAPSHOT/spring-osgi-web-extender-1.2.0-m2-SNAPSHOT.jar&lt;br /&gt; Bundle id is 1&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; headers 1&lt;br /&gt; Bundle headers:&lt;br /&gt;  Bnd-LastModified = 1222091464343&lt;br /&gt;  Build-Jdk = 1.5.0_14&lt;br /&gt;  Built-By = jlaskowski&lt;br /&gt;  Bundle-Activator = org.springframework.osgi.web.extender.internal.activator.WarLoaderListener&lt;br /&gt;  Bundle-Description = Spring/OSGi web extender. Detects war bundles and deployes them into the configured web container.&lt;br /&gt;  Bundle-DocURL = http://www.springframework.org&lt;br /&gt;  Bundle-License = http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;  Bundle-ManifestVersion = 2&lt;br /&gt;  Bundle-Name = spring-osgi-web-extender&lt;br /&gt;  Bundle-SymbolicName = org.springframework.bundle.osgi.web.extender&lt;br /&gt;  Bundle-Vendor = Spring Framework&lt;br /&gt;  Bundle-Version = 1.2.0.m2-SNAPSHOT&lt;br /&gt;  Import-Package = org.apache.commons.logging,org.osgi.framework;version="1.3",org.springframework.beans.factory;version="2.5.4",&lt;br /&gt;   org.springframework.core;version="2.5.4",org.springframework.core.task;version="2.5.4",org.springframework.osgi;version="1.2.0.m2",&lt;br /&gt;   org.springframework.osgi.context;version="1.2.0.m2",org.springframework.osgi.context.support;version="1.2.0.m2",&lt;br /&gt;   org.springframework.osgi.util;version="1.2.0.m2",org.springframework.osgi.web.deployer;version="1.2.0.m2",&lt;br /&gt;   org.springframework.osgi.web.deployer.jetty;resolution:=optional;version="1.2.0.m2",&lt;br /&gt;   org.springframework.osgi.web.deployer.support;version="1.2.0.m2",org.springframework.osgi.web.deployer.tomcat;&lt;br /&gt;   resolution:=optional;version="1.2.0.m2",org.springframework.scheduling.timer;version="2.5.4",&lt;br /&gt;   org.springframework.util;version="2.5.4"&lt;br /&gt;  Manifest-Version = 1.0&lt;br /&gt;  Private-Package = org.springframework.osgi.extender.internal.util,&lt;br /&gt;   org.springframework.osgi.extender.internal.util.concurrent,&lt;br /&gt;   org.springframework.osgi.web.extender.internal.activator,&lt;br /&gt;   org.springframework.osgi.web.extender.internal.scanner&lt;br /&gt;  Spring-DM-Version = 1.2.0-m2-SNAPSHOT&lt;br /&gt;  Spring-Version = 2.5.6-SNAPSHOT&lt;br /&gt;  Tool = Bnd-0.0.238&lt;/pre&gt;&lt;span style="font-weight:bold;"&gt;UWAGA&lt;/span&gt;: Na zrzucie linia z poleceniem install oraz dla nagłówków Import-Package i Private-Package są "złamane" dla celów prezentacji.&lt;br /&gt;&lt;br /&gt;Jak widać na powyższym zrzucie, w nagłówku &lt;span style="font-weight:bold;"&gt;Import-Package&lt;/span&gt;, pakunek spring-osgi-web-extender wymaga wielu pakietów udostępnianych przez inne (wspierające) pakunki. To właśnie wybrałem jako temat rozpoczynający prace - poprawnie zdefiniować wszystkie wymagane zależności pakunku spring-osgi-web-extender na podstawie Import-Package.&lt;br /&gt;&lt;br /&gt;Przeglądając źródła Spring-DM, a konkretnie pomy, doszedłem do pierwszych wymaganych pakunków, które spełnią istnienie pierwszego pakietu na liście Import-Package - &lt;span style="font-weight:bold;"&gt;org.apache.commons.logging&lt;/span&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;org/slf4j/com.springsource.slf4j.org.apache.commons.logging/1.5.0/com.springsource.slf4j.org.apache.commons.logging-1.5.0.jar&lt;/li&gt;&lt;li&gt;org/slf4j/com.springsource.slf4j.api/1.5.0/com.springsource.slf4j.api-1.5.0.jar&lt;/li&gt;&lt;li&gt;org/slf4j/com.springsource.slf4j.log4j/1.5.0/com.springsource.slf4j.log4j-1.5.0.jar&lt;/li&gt;&lt;li&gt;org/springframework/osgi/log4j.osgi/1.2.15-SNAPSHOT/log4j.osgi-1.2.15-SNAPSHOT.jar&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Po ich zainstalowaniu i uruchomieniu pozostało określić dostawców pozostałych pakietów. Tylko, że po jakimś czasie może pojawić się pytanie - które jeszcze pakiety/pakunki nie są dostępne? Zacząłem rozmyślać, jak fajnie byłoby mieć narzędzie ala Maven w OSGi, które pobierze wymagane pakunki, aby środowisko było poprawnie zestawione dla wybranego pakunku, albo co najmniej ujawni brakujące pakiety. I jakoś szczęśliwie się zdarzyło, że przeglądając wynik equinoksowego polecenia &lt;span style="font-weight:bold;"&gt;help&lt;/span&gt; znalazłem odpowiedź - &lt;span style="font-weight:bold;"&gt;diag&lt;/span&gt;.&lt;pre&gt; osgi&amp;gt; help&lt;br /&gt; ---Eclipse Runtime commands---&lt;br /&gt;   diag - Displays unsatisfied constraints for the specified bundle(s).&lt;br /&gt;   enableBundle - enable the specified bundle(s)&lt;br /&gt;   disableBundle - disable the specified bundle(s)&lt;br /&gt;   disabledBundles - list disabled bundles in the system&lt;/pre&gt;Polecenie diag dokładnie spełnia moje oczekiwania - wyświetla wymagania niespełnione w środowisku dla wybranego pakunku.&lt;pre&gt; osgi&amp;gt; diag 1&lt;br /&gt; file:/C:/.m2/org/springframework/osgi/spring-osgi-web-extender/&lt;br /&gt;  1.2.0-m2-SNAPSHOT/spring-osgi-web-extender-1.2.0-m2-SNAPSHOT.jar [1]&lt;br /&gt;   Direct constraints which are unresolved:&lt;br /&gt;    Missing imported package org.springframework.beans.factory_2.5.4.&lt;br /&gt;    Missing imported package org.springframework.core_2.5.4.&lt;br /&gt;    Missing imported package org.springframework.core.task_2.5.4.&lt;br /&gt;    Missing imported package org.springframework.osgi_1.2.0.m2.&lt;br /&gt;    Missing imported package org.springframework.osgi.context_1.2.0.m2.&lt;br /&gt;    Missing imported package org.springframework.osgi.context.support_1.2.0.m2.&lt;br /&gt;    Missing imported package org.springframework.osgi.util_1.2.0.m2.&lt;br /&gt;    Missing imported package org.springframework.osgi.web.deployer_1.2.0.m2.&lt;br /&gt;    Missing imported package org.springframework.osgi.web.deployer.jetty_1.2.0.m2.&lt;br /&gt;    Missing imported package org.springframework.osgi.web.deployer.support_1.2.0.m2.&lt;br /&gt;    Missing imported package org.springframework.osgi.web.deployer.tomcat_1.2.0.m2.&lt;br /&gt;    Missing imported package org.springframework.scheduling.timer_2.5.4.&lt;br /&gt;    Missing imported package org.springframework.util_2.5.4.&lt;/pre&gt;I to jest dokładnie to! Tych pakietów jeszcze nie zainstalowałem. To jest jednakże już praca na kolejne dni.&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/402142820" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/2521807889807453582/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2008/09/equinox-i-jego-diag-do-analizy-wymaga.html#comment-form" title="Komentarze (2)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/2521807889807453582?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/2521807889807453582?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2008/09/equinox-i-jego-diag-do-analizy-wymaga.html" title="Equinox i jego diag do analizy wymagań pakunku OSGi" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email></author></entry><entry gd:etag="W/&quot;DkcNSHsycSp7ImA9WxRREk0.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-8712714105231682923</id><published>2008-09-23T23:07:00.000+02:00</published><updated>2008-09-23T23:08:19.599+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-23T23:08:19.599+02:00</app:edited><title>34. spotkanie Warszawskiej Grupy Użytkowników Technologii Java (Warszawa JUG)</title><content type="html">&lt;a href="http://www.warszawa.jug.pl"&gt;Warszawska Grupa Użytkowników Technologii Java (Warszawa JUG)&lt;/a&gt; zaprasza na 34. spotkanie, które odbędzie się 30.09.2008 o godzinie 18:00 w sali 5440 Wydziału MIMUW przy ul. Banacha 2 w Warszawie.&lt;br /&gt;&lt;br /&gt;Temat prezentacji: &lt;b&gt;Podstawy języków formalnych, ANTLR i ANTLRWorks&lt;/b&gt;&lt;br /&gt;Prowadzący: &lt;a href="http://szimano.org/"&gt;Tomek Szymański&lt;/a&gt; (vel szimano)&lt;br /&gt;&lt;br /&gt;Pisząc różne programy często zdarza się, że mamy jakieś źródło, które wcale nie jest w XMLu ani nawet JSONie... są różne Scannery, Matchery, wyrażenia regularne, ale często to jest za mało i więcej czasu tracimy na "przeczytanie" tego źródła niż na jego "obrobienie". I tutaj wybawieniem jest ANTLR, którego staram się pokazać.&lt;br /&gt;&lt;br /&gt;Ale niech nie zrazi was straszny tutuł - podstawy języków formalnych poznać trzeba, ale będzie jak naprzystępniej a potem to już zajmiemy się wyłącznie kodowaniem w naszej ulubionej Javie !&lt;br /&gt;&lt;br /&gt;Co jeszcze ? ANTLRWorks - narzędzie z ładnym GUI i różnymi bajerami ułatwiające prace z ANTLRem, zrobienie tego, co mamy na myśli mówiąc "kompilator" - czyli czegoś co wygeneruje program z naszego języka, robienie parserów, obalanie paru mitów i tymczasowe oderwanie od, mogących się na chwile znudzić, technologii webowych, którymi karmimy się na codzień.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://szimano.org/"&gt;Tomek Szymański&lt;/a&gt; (vel szimano) - Kontraktor pewnej firmy, która właśnie wypuściła CR2 Application Servera zgodnego z EE 5.0. Zainteresowany narzędziami typu compiler-compiler od momentu, kiedy uczestniczył w odpowiednim przedmiocie na studiach... potem napisał pracę magisterską na ten temat, żeby przez pół roku prowadzić, już jako doktorant (którym nie jest), laboratorium z tych zajęć. Postanowił, że skoro jeszcze coś z tego pamięta, to się podzieli zanim zapomni. Poza tym jest miły, sympatyczny, kulturalny i lubi chodzić w kaszkiecie.&lt;br /&gt;&lt;br /&gt;Planowany czas prezentacji to 1,5 godziny, po której planuje się 15-30-minutową dyskusję.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Wstęp wolny!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Zapraszam w imieniu grupy Warszawa JUG!&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/401156282" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/8712714105231682923/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2008/09/34-spotkanie-warszawskiej-grupy.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/8712714105231682923?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/8712714105231682923?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2008/09/34-spotkanie-warszawskiej-grupy.html" title="34. spotkanie Warszawskiej Grupy Użytkowników Technologii Java (Warszawa JUG)" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email></author></entry><entry gd:etag="W/&quot;DUMNSXc_fyp7ImA9WxRREUs.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-740434431046347453</id><published>2008-09-22T22:03:00.004+02:00</published><updated>2008-09-23T12:58:18.947+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-23T12:58:18.947+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="osgi" /><category scheme="http://www.blogger.com/atom/ns#" term="spring-dm" /><title>Pakunki częściowe OSGi w akcji z Equinox</title><content type="html">Już wiem, że pakunki częściowe (ang. &lt;span style="font-style:italic;"&gt;fragment bundles&lt;/span&gt;) nie są wspierane przez &lt;a href="http://felix.apache.org"&gt;Apache Felix&lt;/a&gt; (więcej o nich i braku wsparcia przez Feliksa w &lt;a href="http://jlaskowski.blogspot.com/2008/09/osgi-314-pakunki-czciowe.html"&gt;OSGi - 3.14 Pakunki częściowe&lt;/a&gt;), więc nie pozostaje mi nic innego jak korzystać z &lt;a href="http://www.eclipse.org/equinox"&gt;Eclipse Equinox&lt;/a&gt; do dalszych testów. Tak długo, jak wymagane będzie wsparcie pakunków częściowych Platformą OSGi nie będzie Apache Felix. To jest właśnie ów techniczny powód, dla którego, w kontekście Spring-DM, często pojawiał się będzie Equinox. Zainteresowanych zmianami w tej materii uprasza się o śledzenie rozwoju zgłoszenia &lt;a href="http://issues.apache.org/jira/browse/FELIX-29"&gt;FELIX-29 Implement bundle fragments&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Rozpocznę praktyczne rozpoznanie pakunków częściowych od stworzenia dwóch pakunków - &lt;span style="font-weight:bold;"&gt;pakunku macierzystego&lt;/span&gt; i &lt;span style="font-weight:bold;"&gt;pakunku częściowego&lt;/span&gt; - z pomocą &lt;span style="font-weight:bold;"&gt;spring-osgi-bundle-archetype&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;UWAGA: Użyłem zadania &lt;a href="http://maven.apache.org/plugins/maven-archetype-plugin/generate-mojo.html"&gt;archetype:generate&lt;/a&gt; z parametrem &lt;span style="font-weight:bold;"&gt;-Darchetype.interactive=false&lt;/span&gt;, gdyż wcześniejużywany &lt;span style="font-weight:bold;"&gt;archetype:create&lt;/span&gt; został oznaczony jako nieaktualny (&lt;span style="font-style:italic;"&gt;[WARNING] This goal is deprecated. Please use mvn archetype:generate instead&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;Najpierw pakunek macierzysty &lt;span style="font-weight:bold;"&gt;springdm-host-bundle&lt;/span&gt;:&lt;pre&gt; mvn archetype:generate \&lt;br /&gt;  -DarchetypeGroupId=org.springframework.osgi \&lt;br /&gt;  -DarchetypeArtifactId=spring-osgi-bundle-archetype \&lt;br /&gt;  -DarchetypeVersion=1.2.0-m2-SNAPSHOT \&lt;br /&gt;  -DgroupId=pl.jaceklaskowski.springdm.fragment \&lt;br /&gt;  -DartifactId=springdm-host-bundle \&lt;br /&gt;  -Dversion=1.0 \&lt;br /&gt;  -Darchetype.interactive=false&lt;/pre&gt;, po którym tworzę pakunek częściowy &lt;span style="font-weight:bold;"&gt;springdm-fragment-bundle&lt;/span&gt;:&lt;pre&gt; mvn archetype:generate \&lt;br /&gt;  -DarchetypeGroupId=org.springframework.osgi \&lt;br /&gt;  -DarchetypeArtifactId=spring-osgi-bundle-archetype \&lt;br /&gt;  -DarchetypeVersion=1.2.0-m2-SNAPSHOT \&lt;br /&gt;  -DgroupId=pl.jaceklaskowski.springdm.fragment \&lt;br /&gt;  -DartifactId=springdm-fragment-bundle \&lt;br /&gt;  -Dversion=1.0 \&lt;br /&gt;  -Darchetype.interactive=false&lt;/pre&gt;Możnaby utworzyć je w ramach większego projektu mavenowego (packaging=pom), ale pozostawiam to dla zaangażowanych.&lt;br /&gt;&lt;br /&gt;Na początku zadeklaruję pakunek springdm-fragment-bundle jako pakunek częściowy dla springdm-host-bundle za pomocą nagłówka &lt;span style="font-weight:bold;"&gt;Fragment-Host&lt;/span&gt;. Jako, że projekt pakunku częściowego springdm-fragment-bundle zarządzany jest przez &lt;a href="http://maven.apache.org"&gt;Apache Maven 2&lt;/a&gt; nagłówek dodaję do konfiguracji wtyczki &lt;span style="font-weight:bold;"&gt;maven-bundle-plugin&lt;/span&gt; w &lt;span style="font-weight:bold;"&gt;pom.xml&lt;/span&gt;.&lt;pre&gt; &amp;lt;Fragment-Host&amp;gt;pl.jaceklaskowski.springdm.fragment.springdm-host-bundle&amp;lt;/Fragment-Host&amp;gt;&lt;/pre&gt;Nazwę pakunku macierzystego można poznać przez utworzenie docelowego manifestu przez wykonanie polecenia &lt;span style="font-weight:bold;"&gt;mvn package&lt;/span&gt; i odczytanie nagłówka &lt;span style="font-weight:bold;"&gt;Bundle-SymbolicName&lt;/span&gt; w utworzonym &lt;span style="font-weight:bold;"&gt;META-INF/MANIFEST.MF&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Tworzę pakunki poleceniem &lt;span style="font-weight:bold;"&gt;mvn package&lt;/span&gt; i uruchamiam na Equinoksie (najświeższa wersja do pobrania ze strony &lt;a href="http://download.eclipse.org/equinox/"&gt;equinox osgi downloads&lt;/a&gt;, np. &lt;a href="http://download.eclipse.org/equinox/drops/S-3.5M2-200809180100/index.php"&gt;Equinox Stable Build: 3.5M2&lt;/a&gt;, chociaż adres na stronie nie działa! Można skorzystać z jeszcze innego adresu &lt;a href="http://download.eclipse.org/eclipse/equinox/"&gt;equinox osgi downloads&lt;/a&gt;, gdzie można pobrać &lt;a href="http://download.eclipse.org/eclipse/equinox/drops/S-3.5M1-200808071402/index.php"&gt;Equinox Stable Build: 3.5M1&lt;/a&gt;). Początkowo korzystałem z Equinoksa dostarczanego w ramach Eclipse Ganymede - &lt;span style="font-weight:bold;"&gt;plugins/org.eclipse.osgi_3.4.0.v20080605-1900.jar&lt;/span&gt;, ale przy finalnym uruchomieniu przeniosłem się na nowszą wersję - &lt;span style="font-weight:bold;"&gt;org.eclipse.osgi_3.5.0.v20080804-1730.jar&lt;/span&gt;, wyłącznie ze względów bycia na bieżąco.&lt;br /&gt;&lt;br /&gt;Dla dociekliwych zaleca się lekturę niewielkiego podręcznika Equinoksa - &lt;a href="http://www.eclipse.org/equinox/documents/quickstart.php"&gt;Equinox QuickStart Guide&lt;/a&gt;.&lt;pre&gt; jlaskowski@work /cygdrive/c/apps/eclipse&lt;br /&gt; $ java -jar plugins/org.eclipse.osgi_3.4.0.v20080605-1900.jar -console&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; ss&lt;br /&gt;&lt;br /&gt; Framework is launched.&lt;br /&gt;&lt;br /&gt; id      State       Bundle&lt;br /&gt; 0       ACTIVE      org.eclipse.osgi_3.4.0.v20080605-1900&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; install file:/C:/projs/sandbox/springdm-fragment-bundle/target/springdm-fragment-bundle-1.0.jar&lt;br /&gt; Bundle id is 1&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; ss&lt;br /&gt;&lt;br /&gt; Framework is launched.&lt;br /&gt;&lt;br /&gt; id      State       Bundle&lt;br /&gt; 0       ACTIVE      org.eclipse.osgi_3.4.0.v20080605-1900&lt;br /&gt; 1       INSTALLED   pl.jaceklaskowski.springdm.fragment.springdm-fragment-bundle_1.0.0&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; start 1&lt;br /&gt; org.osgi.framework.BundleException: A fragment bundle cannot be started: &lt;br /&gt; file:/C:/projs/sandbox/springdm-fragment-bundle/target/springdm-fragment-bundle-1.0.jar [1]&lt;br /&gt;  at org.eclipse.osgi.framework.internal.core.BundleFragment.startWorker(BundleFragment.java:224)&lt;br /&gt;  at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:265)&lt;br /&gt;  at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:257)&lt;br /&gt;  at org.eclipse.osgi.framework.internal.core.FrameworkCommandProvider._start(FrameworkCommandProvider.java:257)&lt;br /&gt;  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;br /&gt;  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)&lt;br /&gt;  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)&lt;br /&gt;  at java.lang.reflect.Method.invoke(Method.java:585)&lt;br /&gt;  at org.eclipse.osgi.framework.internal.core.FrameworkCommandInterpreter.execute(FrameworkCommandInterpreter.java:150)&lt;br /&gt;  at org.eclipse.osgi.framework.internal.core.FrameworkConsole.docommand(FrameworkConsole.java:302)&lt;br /&gt;  at org.eclipse.osgi.framework.internal.core.FrameworkConsole.console(FrameworkConsole.java:287)&lt;br /&gt;  at org.eclipse.osgi.framework.internal.core.FrameworkConsole.run(FrameworkConsole.java:223)&lt;br /&gt;  at java.lang.Thread.run(Thread.java:595)&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; ss&lt;br /&gt;&lt;br /&gt; Framework is launched.&lt;br /&gt;&lt;br /&gt; id      State       Bundle&lt;br /&gt; 0       ACTIVE      org.eclipse.osgi_3.4.0.v20080605-1900&lt;br /&gt; 1       INSTALLED   pl.jaceklaskowski.springdm.fragment.springdm-fragment-bundle_1.0.0&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; install file:/C:/projs/sandbox/springdm-host-bundle/target/springdm-host-bundle-1.0.jar&lt;br /&gt; Bundle id is 2&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; start 2&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; ss&lt;br /&gt;&lt;br /&gt; Framework is launched.&lt;br /&gt;&lt;br /&gt; id      State       Bundle&lt;br /&gt; 0       ACTIVE      org.eclipse.osgi_3.4.0.v20080605-1900&lt;br /&gt; 1       RESOLVED    pl.jaceklaskowski.springdm.fragment.springdm-fragment-bundle_1.0.0&lt;br /&gt;                     Master=2&lt;br /&gt; 2       ACTIVE      pl.jaceklaskowski.springdm.fragment.springdm-host-bundle_1.0.0&lt;br /&gt;                     Fragments=1&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; bundle 1&lt;br /&gt; file:/C:/projs/sandbox/springdm-fragment-bundle/target/springdm-fragment-bundle-1.0.jar [1]&lt;br /&gt;   Id=1, Status=RESOLVED    Data Root=C:\apps\eclipse\plugins\configuration\org.eclipse.osgi\bundles\1\data&lt;br /&gt;   No registered services.&lt;br /&gt;   No services in use.&lt;br /&gt;   Exported packages&lt;br /&gt;     pl.jaceklaskowski.springdm.fragment; version="0.0.0"[exported]&lt;br /&gt;   No imported packages&lt;br /&gt;   Host bundles&lt;br /&gt;     file:/C:/projs/sandbox/springdm-host-bundle/target/springdm-host-bundle-1.0.jar [2]&lt;br /&gt;   No named class spaces&lt;br /&gt;   No required bundles&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; bundle 2&lt;br /&gt; file:/C:/projs/sandbox/springdm-host-bundle/target/springdm-host-bundle-1.0.jar [2]&lt;br /&gt;   Id=2, Status=ACTIVE      Data Root=C:\apps\eclipse\plugins\configuration\org.eclipse.osgi\bundles\2\data&lt;br /&gt;   No registered services.&lt;br /&gt;   No services in use.&lt;br /&gt;   Exported packages&lt;br /&gt;     pl.jaceklaskowski.springdm.fragment; version="0.0.0"[exported]&lt;br /&gt;   No imported packages&lt;br /&gt;   Fragment bundles&lt;br /&gt;     file:/C:/projs/sandbox/springdm-fragment-bundle/target/springdm-fragment-bundle-1.0.jar [1]&lt;br /&gt;   Named class space&lt;br /&gt;     pl.jaceklaskowski.springdm.fragment.springdm-host-bundle; bundle-version="1.0.0"[provided]&lt;br /&gt;   No required bundles&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; close&lt;/pre&gt;Dodam do pakunku macierzystego funkcjonalność, która przy każdorazowym zainstalowaniu nowego pakunku będącym rozszerzeniem (pakunkiem częściowym) dla niego, wypisze dostępne pliki wchodzącego w skład przestrzeni pakunku. Dzięki metodzie &lt;a href="http://www.osgi.org/javadoc/r4/org/osgi/framework/Bundle.html#findEntries(java.lang.String,%20java.lang.String,%20boolean)"&gt;org.osgi.framework.Bundle.findEntries(String,String,boolean)&lt;/a&gt; pakunek ma możliwość przejrzenia wszystkich zasobów zawartych w nim (bezpośrednio w jego pliku jar) oraz wszystkich rozszerzeniach (pakunkach częściowych). Nie należy mylić działania tej metody z metodą &lt;span style="font-weight:bold;"&gt;Bundle.getResource(String)&lt;/span&gt; czy &lt;span style="font-weight:bold;"&gt;Bundle.getResources(String)&lt;/span&gt;, które działają na całej przestrzeni klas dostęnych dla pakunku (co może być rozbudowane w porównaniu z przestrzenią pakunku o deklaracje w nagłówku &lt;span style="font-weight:bold;"&gt;Import-Package&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;Definiuję aktywator w pakunku macierzystym, który zarejestruje słuchacza reagującego na zdarzenia rozwiązania (stan RESOLVED) pakunków (podpieram się artykułem &lt;a href="http://www.jaceklaskowski.pl/wiki/Bundle.findEntries()_i_spring-osgi-bundle-archetype_w_akcji_-_monitorowanie_pakunk%C3%B3w_OSGi_z_okre%C5%9Blon%C4%85_struktur%C4%85_katalogow%C4%85"&gt;Bundle.findEntries() i spring-osgi-bundle-archetype w akcji - monitorowanie pakunków OSGi z określoną strukturą katalogową&lt;/a&gt;).&lt;pre&gt; package pl.jaceklaskowski.springdm.fragment.internal;&lt;br /&gt;&lt;br /&gt; import java.util.Dictionary;&lt;br /&gt; import java.util.Enumeration;&lt;br /&gt;&lt;br /&gt; import org.osgi.framework.Bundle;&lt;br /&gt; import org.osgi.framework.BundleActivator;&lt;br /&gt; import org.osgi.framework.BundleContext;&lt;br /&gt; import org.osgi.framework.BundleEvent;&lt;br /&gt; import org.osgi.framework.BundleListener;&lt;br /&gt;&lt;br /&gt; public class Aktywator implements BundleActivator {&lt;br /&gt;&lt;br /&gt;     private final class Sluchacz implements BundleListener {&lt;br /&gt;         private String nazwaPakunkuMacierzystego;&lt;br /&gt;&lt;br /&gt;         public Sluchacz(String nazwaPakunkuMacierzystego) {&lt;br /&gt;             this.nazwaPakunkuMacierzystego = nazwaPakunkuMacierzystego;&lt;br /&gt;         }&lt;br /&gt;&lt;br /&gt;         public void bundleChanged(BundleEvent event) {&lt;br /&gt;             Bundle bundle = event.getBundle();&lt;br /&gt;             String nazwaPakunku = bundle.getSymbolicName();&lt;br /&gt;             // Sprawdź, czy jest pakunkiem częściowym&lt;br /&gt;             Dictionary&amp;lt;?, ?&amp;gt; headers = bundle.getHeaders();&lt;br /&gt;             String pakunekMacierzysty = (String) headers.get("Fragment-Host");&lt;br /&gt;             if (!nazwaPakunkuMacierzystego.equalsIgnoreCase(pakunekMacierzysty)) {&lt;br /&gt;                 return;&lt;br /&gt;             }&lt;br /&gt;             switch (event.getType()) {&lt;br /&gt;             case BundleEvent.RESOLVED:&lt;br /&gt;                 System.out.println("Pakunek czesciowy " + nazwaPakunku + " w stanie RESOLVED");&lt;br /&gt;                 wyswietlLiczbeDostepnychPlikow(bundle);&lt;br /&gt;                 break;&lt;br /&gt;             case BundleEvent.STOPPED:&lt;br /&gt;                 System.out.println("Pakunek czesciowy " + nazwaPakunku + " w stanie STOPPED");&lt;br /&gt;                 wyswietlLiczbeDostepnychPlikow(bundle);&lt;br /&gt;                 break;&lt;br /&gt;             }&lt;br /&gt;         }&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     private BundleListener sluchacz;&lt;br /&gt;&lt;br /&gt;     public void start(BundleContext context) throws Exception {&lt;br /&gt;         String nazwaPakunku = context.getBundle().getSymbolicName();&lt;br /&gt;         System.out.println("Pakunek macierzysty " + nazwaPakunku + " w stanie STARTING");&lt;br /&gt;         sluchacz = new Sluchacz(nazwaPakunku);&lt;br /&gt;         System.out.println("...instalacja " + sluchacz);&lt;br /&gt;         context.addBundleListener(sluchacz);&lt;br /&gt;         wyswietlLiczbeDostepnychPlikow(context.getBundle());&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     public void stop(BundleContext context) throws Exception {&lt;br /&gt;         String nazwaPakunku = context.getBundle().getSymbolicName();&lt;br /&gt;         System.out.println("Pakunek macierzysty " + nazwaPakunku + " w stanie STOPPING");&lt;br /&gt;         System.out.println("...usuniecie " + sluchacz);&lt;br /&gt;         context.removeBundleListener(sluchacz);&lt;br /&gt;         wyswietlLiczbeDostepnychPlikow(context.getBundle());&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     private void wyswietlLiczbeDostepnychPlikow(Bundle bundle) {&lt;br /&gt;         int liczbaPlikow = 0;&lt;br /&gt;         Enumeration&amp;lt;?&amp;gt; entries = bundle.findEntries("/", "*", true);&lt;br /&gt;         for (; entries.hasMoreElements(); entries.nextElement()) {&lt;br /&gt;             liczbaPlikow++;&lt;br /&gt;         }&lt;br /&gt;         System.out.println("+++ Liczba plikow: " + liczbaPlikow);&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt; }&lt;/pre&gt;Pierwsze uruchomienie przykładu zakończyło się niepowodzeniem.&lt;pre&gt; jlaskowski@work /cygdrive/c/apps/eclipse&lt;br /&gt; $ java -jar plugins/org.eclipse.osgi_3.4.0.v20080605-1900.jar -console&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; ss&lt;br /&gt;&lt;br /&gt; Framework is launched.&lt;br /&gt;&lt;br /&gt; id      State       Bundle&lt;br /&gt; 0       ACTIVE      org.eclipse.osgi_3.4.0.v20080605-1900&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; install file:/C:/projs/sandbox/springdm-host-bundle/target/springdm-host-bundle-1.0.jar&lt;br /&gt; Bundle id is 1&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; ss&lt;br /&gt;&lt;br /&gt; Framework is launched.&lt;br /&gt;&lt;br /&gt; id      State       Bundle&lt;br /&gt; 0       ACTIVE      org.eclipse.osgi_3.4.0.v20080605-1900&lt;br /&gt; 1       INSTALLED   pl.jaceklaskowski.springdm.fragment.springdm-host-bundle_1.0.0&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; start 1&lt;br /&gt; org.osgi.framework.BundleException: The bundle could not be resolved. Reason: &lt;br /&gt; Missing Constraint: Import-Package: pl.jaceklaskowski.springdm.fragment.internal; version="0.0.0"&lt;br /&gt;  at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:305)&lt;br /&gt;  at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:265)&lt;br /&gt;  at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:257)&lt;br /&gt;  at org.eclipse.osgi.framework.internal.core.FrameworkCommandProvider._start(FrameworkCommandProvider.java:257)&lt;br /&gt;  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;br /&gt;  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)&lt;br /&gt;  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)&lt;br /&gt;  at java.lang.reflect.Method.invoke(Method.java:585)&lt;br /&gt;  at org.eclipse.osgi.framework.internal.core.FrameworkCommandInterpreter.execute(FrameworkCommandInterpreter.java:150)&lt;br /&gt;  at org.eclipse.osgi.framework.internal.core.FrameworkConsole.docommand(FrameworkConsole.java:302)&lt;br /&gt;  at org.eclipse.osgi.framework.internal.core.FrameworkConsole.console(FrameworkConsole.java:287)&lt;br /&gt;  at org.eclipse.osgi.framework.internal.core.FrameworkConsole.run(FrameworkConsole.java:223)&lt;br /&gt;  at java.lang.Thread.run(Thread.java:595)&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; close&lt;/pre&gt;O dziwo nie doświadczałem tych problemów podczas pracy z Apache Felix (!) Najwyraźniej Equinox jest bardziej restrykcyjny i sprawdzając poprawność nagłówków, dla każdego &lt;span style="font-weight:bold;"&gt;Import-Package&lt;/span&gt; weryfikuje widoczność pakietów w przestrzeni klas. Jako, że domyślnie pakiet &lt;span style="font-weight:bold;"&gt;pl.jaceklaskowski.springdm.fragment.internal&lt;/span&gt; jest domyślnie wyłączany z &lt;span style="font-weight:bold;"&gt;Export-Package&lt;/span&gt; przez Spring-DM (a właściwie niewprost przez &lt;span style="font-weight:bold;"&gt;bnd&lt;/span&gt; wywoływane przez wtyczkę &lt;span style="font-weight:bold;"&gt;maven-bundle-plugin&lt;/span&gt;, która jest tak konfigurowana przez archetyp &lt;span style="font-weight:bold;"&gt;spring-osgi-bundle-archetype&lt;/span&gt; w pom.xml) pojawia się komunikat błędu o niespełnieniu wymagania nałożonego przez Import-Package. Analizując źródła projektu Spring-DM (dokładniej pomy w &lt;span style="font-weight:bold;"&gt;spring-osgi-extender&lt;/span&gt; oraz &lt;span style="font-weight:bold;"&gt;spring-osgi&lt;/span&gt;) kończę z następującą konfiguracją dla maven-bundle-plugin:&lt;pre&gt; &amp;lt;plugin&amp;gt;&lt;br /&gt;   &amp;lt;groupId&amp;gt;org.apache.felix&amp;lt;/groupId&amp;gt;&lt;br /&gt;   &amp;lt;artifactId&amp;gt;maven-bundle-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;   &amp;lt;extensions&amp;gt;true&amp;lt;/extensions&amp;gt;&lt;br /&gt;   &amp;lt;version&amp;gt;1.4.0&amp;lt;/version&amp;gt;&lt;br /&gt;   &amp;lt;configuration&amp;gt;&lt;br /&gt;     &amp;lt;manifestLocation&amp;gt;META-INF&amp;lt;/manifestLocation&amp;gt;&lt;br /&gt;     &amp;lt;instructions&amp;gt;&lt;br /&gt;       &amp;lt;Export-Package&amp;gt;!pl.jaceklaskowski.springdm.fragment.*internal*&amp;lt;/Export-Package&amp;gt;&lt;br /&gt;       &amp;lt;Private-Package&amp;gt;pl.jaceklaskowski.springdm.fragment.*internal*&amp;lt;/Private-Package&amp;gt;&lt;br /&gt;       &amp;lt;Include-Resource&amp;gt;src/main/resources&amp;lt;/Include-Resource&amp;gt;&lt;br /&gt;       &amp;lt;Bundle-Activator&amp;gt;pl.jaceklaskowski.springdm.fragment.internal.Aktywator&amp;lt;/Bundle-Activator&amp;gt;&lt;br /&gt;       &amp;lt;Bundle-Version&amp;gt;2&amp;lt;/Bundle-Version&amp;gt;&lt;br /&gt;     &amp;lt;/instructions&amp;gt;&lt;br /&gt;   &amp;lt;/configuration&amp;gt;&lt;br /&gt; &amp;lt;/plugin&amp;gt;&lt;/pre&gt;Kluczem do sukcesu jest nagłówek &lt;span style="font-weight:bold;"&gt;Private-Package&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Warto pomiędzy uruchomieniami Equinoksa usuwać jego katalog konfiguracyjny - &lt;span style="font-weight:bold;"&gt;configuration&lt;/span&gt;, aby poprzednia konfiguracja nie kolidowała na bieżące testy. Katalog &lt;span style="font-style:italic;"&gt;configuration&lt;/span&gt; tworzony jest w katalogu, w którym znajduje się uruchomieniowy jar Equinoksa.&lt;pre&gt; jlaskowski@work /cygdrive/c/apps/equinox&lt;br /&gt; $ rm -rf configuration&lt;/pre&gt;Podczas analizy poniższego działania pakunków macierzystego i częściowego na Equinoksie proszę zwrócić uwagę na komunikat &lt;span style="font-style:italic;"&gt;+++ Liczba plikow&lt;/span&gt;, który informuje o liczbie plików dostępnych w pakunku macierzystym (przypominam, że pakunek częściowy nie jest pełnoprawnym pakunkiem OSGi, tzn. obostrzenia OSGi zugożają go sprowadzając do roli pakunku rozszerzającego).&lt;pre&gt; jlaskowski@work /cygdrive/c/apps/equinox&lt;br /&gt; $ java -jar org.eclipse.osgi_3.5.0.v20080804-1730.jar -console&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; ss&lt;br /&gt;&lt;br /&gt; Framework is launched.&lt;br /&gt;&lt;br /&gt; id      State       Bundle&lt;br /&gt; 0       ACTIVE      org.eclipse.osgi_3.5.0.v20080804-1730&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; install file:/C:/projs/sandbox/springdm-host-bundle/target/springdm-host-bundle-1.0.jar&lt;br /&gt; Bundle id is 1&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; ss&lt;br /&gt;&lt;br /&gt; Framework is launched.&lt;br /&gt;&lt;br /&gt; id      State       Bundle&lt;br /&gt; 0       ACTIVE      org.eclipse.osgi_3.5.0.v20080804-1730&lt;br /&gt; 1       INSTALLED   pl.jaceklaskowski.springdm.fragment.springdm-host-bundle_2.0.0&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; start 1&lt;br /&gt; Pakunek macierzysty pl.jaceklaskowski.springdm.fragment.springdm-host-bundle w stanie STARTING&lt;br /&gt; ...instalacja pl.jaceklaskowski.springdm.fragment.internal.Aktywator$Sluchacz@ca470&lt;br /&gt; +++ Liczba plikow: 18&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; ss&lt;br /&gt;&lt;br /&gt; Framework is launched.&lt;br /&gt;&lt;br /&gt; id      State       Bundle&lt;br /&gt; 0       ACTIVE      org.eclipse.osgi_3.5.0.v20080804-1730&lt;br /&gt; 1       ACTIVE      pl.jaceklaskowski.springdm.fragment.springdm-host-bundle_2.0.0&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; install file:/C:/projs/sandbox/springdm-fragment-bundle/target/springdm-fragment-bundle-1.0.jar&lt;br /&gt; Bundle id is 2&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; ss&lt;br /&gt;&lt;br /&gt; Framework is launched.&lt;br /&gt;&lt;br /&gt; id      State       Bundle&lt;br /&gt; 0       ACTIVE      org.eclipse.osgi_3.5.0.v20080804-1730&lt;br /&gt; 1       ACTIVE      pl.jaceklaskowski.springdm.fragment.springdm-host-bundle_2.0.0&lt;br /&gt; 2       INSTALLED   pl.jaceklaskowski.springdm.fragment.springdm-fragment-bundle_1.0.0&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; refresh 1&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; Pakunek macierzysty pl.jaceklaskowski.springdm.fragment.springdm-host-bundle w stanie STOPPING&lt;br /&gt; ...usuniecie pl.jaceklaskowski.springdm.fragment.internal.Aktywator$Sluchacz@ca470&lt;br /&gt; +++ Liczba plikow: 18&lt;br /&gt; Pakunek macierzysty pl.jaceklaskowski.springdm.fragment.springdm-host-bundle w stanie STARTING&lt;br /&gt; ...instalacja pl.jaceklaskowski.springdm.fragment.internal.Aktywator$Sluchacz@42552c&lt;br /&gt; +++ Liczba plikow: 29&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; ss&lt;br /&gt;&lt;br /&gt; Framework is launched.&lt;br /&gt;&lt;br /&gt; id      State       Bundle&lt;br /&gt; 0       ACTIVE      org.eclipse.osgi_3.5.0.v20080804-1730&lt;br /&gt; 1       ACTIVE      pl.jaceklaskowski.springdm.fragment.springdm-host-bundle_2.0.0&lt;br /&gt;                     Fragments=2&lt;br /&gt; 2       RESOLVED    pl.jaceklaskowski.springdm.fragment.springdm-fragment-bundle_1.0.0&lt;br /&gt;                     Master=1&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; uninstall 2&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; refresh 1&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; Pakunek macierzysty pl.jaceklaskowski.springdm.fragment.springdm-host-bundle w stanie STOPPING&lt;br /&gt; ...usuniecie pl.jaceklaskowski.springdm.fragment.internal.Aktywator$Sluchacz@42552c&lt;br /&gt; Pakunek macierzysty pl.jaceklaskowski.springdm.fragment.springdm-host-bundle w stanie STARTING&lt;br /&gt; ...instalacja pl.jaceklaskowski.springdm.fragment.internal.Aktywator$Sluchacz@1113622&lt;br /&gt; +++ Liczba plikow: 18&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; osgi&amp;gt; close&lt;br /&gt;&lt;br /&gt; Pakunek macierzysty pl.jaceklaskowski.springdm.fragment.springdm-host-bundle w stanie STOPPING&lt;br /&gt; ...usuniecie pl.jaceklaskowski.springdm.fragment.internal.Aktywator$Sluchacz@1113622&lt;br /&gt; +++ Liczba plikow: 18&lt;/pre&gt;Ciekawe przedstawienie tematu dostępne również w bezpłatnej książce &lt;a href="http://neilbartlett.name/blog/osgibook/"&gt;OSGi in Practice&lt;/a&gt; w rozdziale &lt;span style="font-weight:bold;"&gt;The Extender Model&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Pojawił się nowy harmonogram nowej wersji NetBeans 6.5 - &lt;a href="http://wiki.netbeans.org/NB65Milestones"&gt;NetBeans NB65Milestones&lt;/a&gt;. Przyjdzie jeszcze trochę poczekać na finalną wersję NetBeans 6.5 - &lt;span style="font-weight:bold;"&gt;12 listopada 2008&lt;/span&gt;.&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/400109006" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/740434431046347453/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2008/09/pakunki-czciowe-osgi-w-akcji-z-equinox.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/740434431046347453?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/740434431046347453?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2008/09/pakunki-czciowe-osgi-w-akcji-z-equinox.html" title="Pakunki częściowe OSGi w akcji z Equinox" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email></author></entry><entry gd:etag="W/&quot;DEQDR34ycCp7ImA9WxRREE4.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-6930189220218698748</id><published>2008-09-21T22:47:00.001+02:00</published><updated>2008-09-22T00:32:56.098+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-22T00:32:56.098+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="spring framework" /><category scheme="http://www.blogger.com/atom/ns#" term="osgi" /><title>Spring Dynamic Modules a aplikacje webowe</title><content type="html">Już pisałem o tym 4 maja 2008 w &lt;a href="http://jlaskowski.blogspot.com/2008/05/aplikacja-webowa-jako-pakunek-osgi-ze.html"&gt;Aplikacja webowa jako pakunek OSGi ze Spring Dynamic Modules&lt;/a&gt;, ale po sobie widzę, że warto wspomnieć o tym jeszcze raz.&lt;br /&gt;&lt;br /&gt;Rozdział &lt;a href="http://static.springframework.org/osgi/docs/1.2.0-m1/reference/html/web.html"&gt;8. Web Support&lt;/a&gt; nie pozostawia złudzeń, czego możemy dodatkowo oczekiwać od &lt;span style="font-weight:bold;"&gt;Spring Dynamic Modules (Spring-DM)&lt;/span&gt; poza podstawową cechą jako jest wsparcie dla tworzenia pakunków OSGi korzystając ze Spring Framework. Mowa w nim o wsparciu dla aplikacji webowych (będącymi dystrybuowane jako war - plik jar z odpowiednią strukturą katalogową, np. konieczność istnienia WEB-INF/web.xml) będącymi de facto pakunkami OSGi. Jeśli ktokolwiek zastanawiał się nad sensownością zastosowania OSGi w swoich aplikacjach, to przynajmniej obszar aplikacji webowych powinien być już rozwikłany z pomocą tego rozdziału. Spring-DM łączy cechy OSGi z Korporacyjną Javą udostępniając niezbędne elementy jako pakunki OSGi - kontener servletów jak i samą aplikację webową - które wiąże mechanizmami OSGi. Spring-DM to po prostu warstwa wspierająca uruchamianie aplikacji springowych oraz webowych na Platformie OSGi. &lt;br /&gt;&lt;br /&gt;Przyjrzyjmy się dokładniej, co takiego oferuje Spring-DM, czego nie znajdziemy w innych środowiskach. Do poprawnego uruchomienia aplikacji webowej potrzebny jest kontener servletów (być może z jsp, ale kto by tego obecnie używał?!). Podstawowym bytem Platformy OSGi jest pakunek. Jeśli cokolwiek miałoby być uruchomione na Platformie OSGi musi być pakunkiem. Pakunek OSGi to zwykły plik jar z odpowiednimi nagłówkami w META-INF/MANIFEST.MF i stąd wypływa niezwykłość OSGi - niby nic szczególnego, a za darmo mamy możliwości niebagatelnej wartości, m.in. wersjonowanie, dedykowane ładowarki klas, uprawnienia, co z kolei składa się na funkcjonalność uktualniania aplikacji bez konieczności jej zatrzymywania. Połączenie elementów Java EE z OSGi polega na udostępnieniu tych pierwszych jako pakunków OSGi i...tyle. Już możemy okrzyknąć nasze rozwiązanie jako zgodne z pryncypiami OSGi. Do tego wcale nie potrzeba Spring-DM. Gdzie dostrzeżemy zaletę jego wykorzystania, to w sposobie integracji trzech (!) technologii OSGi, Java EE oraz Spring Framework - podczas uruchomienia pakunku OSGi z rozszerzeniem pliku .war, lub zawierającego specyficzne dla Spring-DM nagłówki w manifeście, nastąpi ich automatyczne "związanie" z pakunkiem będącym kontenerem servletów (obecnie Tomcat i Jetty). Właśnie owe rozszerzenie Platformy OSGi o funkcjonalność rozpoznawania pakunków będących faktycznie aplikacjami korporacyjnymi - aplikacjami webowymi - jest wartością Spring-DM. Wprowadzając Spring-DM do naszej aplikacji wprowadzamy jednocześnie cechy OSGi, Spring Framework oraz Java EE. Takie 3-w-1, albo po prostu OSprin-JEE-i.&lt;br /&gt;&lt;br /&gt;Porównując wsparcie Spring-DM dla uruchamiania aplikacji springowych a aplikacjami webowymi (potencjalnie korzystającymi z elementów springowych) można zauważyć, że w przypadku aplikacji webowych są one jedynie rozpoznawane i przekazywane do kontenera servletów (który uruchomiony jest na Platformie OSGi jako pełnoprawny pakunek OSGi). Nic poza rozpoznaniem aplikacji webowych nie pozostaje w gestii Spring-DM. Tymczasem rozpoznanie aplikacji springowych skutkuje wzbudzeniem &lt;a href="http://static.springframework.org/osgi/docs/1.2.0-m1/reference/html/bnd-app-ctx.html#bnd-app-ctx:extender"&gt;Spring-DM Extender&lt;/a&gt;, który wykonuje całą pracę uruchomienia pełnej maszyneri springowej.&lt;br /&gt;&lt;br /&gt;Jest kilka istotnych kwestii do zapamiętania, aby aplikację webową uruchomić w ramach Spring-DM, które są implikowane przez prawa rządzące OSGi - kwestia widoczności klas. Domyślnie klasy należące do pakietów javax.servlet.*, WEB-INF/lib/*.jar oraz WEB-INF/classes są widoczne dla aplikacji webowej w "zwykłym" kontenerze servletów. Dodatkowo kontener ma możliwość zdefiniowania wspólnej przestrzeni klas/bibliotek dołączanych do aplikacji webowych, o którą ją rozszerza. W przypadku środowiska OSGi obowiązują bardziej restrykcyjne reguły wymagające, aby pakunek deklarował swoją przestrzeń klas przez nagłówki Import-Package oraz Bundle-Classpath w manifeście. Za ich pomocą należy skonstruować wymaganą przestrzeń klas - zawartość ładowarki klas związanej z pakunkiem. Bez nich zasady obowiązujące w specyfikacji Java Servlet są niepełne w środowisku Spring-DM. Zgodnie z adnotacją w 8. Web Support możnaby oczekiwać, aby owe deklaracje były automatycznie dodawane do pakunku przez Spring-DM, ale póki co, taka funkcjonalność nie jest dostępna. Cechą, która jest niezwykle interesująca, a wręcz wskazana, przy konstruowaniu aplikacji webowej w ramach OSGi (za pomocą Spring-DM) jest wyniesienie bibliotek aplikacji poza jej strukturę katalogową, co przy bardzo radykalnym podejściu skończy się pustymi katalogami WEB-INF/lib oraz WEB-INF/classes, a ich zawartość zostanie uruchomiona w ramach OSGi jako osobne pakunki związane z aplikacją przez nagłówki Import-Package (opcjonalnie Require-Bundle) w manifeście. Uaktualnienie aplikacji o nową funkcjonalność, bądź wdrożenie poprawek, to wyłącznie uaktualnienie pakunków OSGi. Niezwykle potężne oręże upraszczające tworzenie aplikacji webowych ze Spring-DM.&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/399242120" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/6930189220218698748/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2008/09/spring-dynamic-modules-aplikacje-webowe.html#comment-form" title="Komentarze (5)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/6930189220218698748?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/6930189220218698748?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2008/09/spring-dynamic-modules-aplikacje-webowe.html" title="Spring Dynamic Modules a aplikacje webowe" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email></author></entry><entry gd:etag="W/&quot;D0UGRHs_eCp7ImA9WxRSGE0.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-4563949486045480917</id><published>2008-09-18T23:55:00.005+02:00</published><updated>2008-09-19T08:20:25.540+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-19T08:20:25.540+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="osgi" /><title>OSGi - 3.14 Pakunki częściowe</title><content type="html">Ostatnimi czasy wielokrotnie spotykałem się z terminami &lt;span style="font-weight:bold;"&gt;OSGi fragment&lt;/span&gt; lub &lt;span style="font-weight:bold;"&gt;OSGi fragment bundle&lt;/span&gt; i zawsze kończyło się na...odłożeniu rozpoznania tematu na później (nawet podczas relacji lektury rozdziału &lt;span style="font-weight:bold;"&gt;3. Warstwa modułowa&lt;/span&gt; w &lt;a href="http://jlaskowski.blogspot.com/2008/03/kolejny-yk-osgi-rozdzia-3-warstwa.html"&gt;Kolejny łyk OSGi - rozdział 3. Warstwa modułowa&lt;/a&gt; nie napisałem o nich ani słowa!). Rozdział &lt;span style="font-weight:bold;"&gt;3.14 Fragment Bundles&lt;/span&gt; to jedynie 4 strony (plus niewielki diagram), więc samej lektury na niecałe 5-10 minut i można ją powtórzyć (nawet kilkakrotnie).&lt;br /&gt;&lt;br /&gt;Przyjrzyjmy się dokładniej, cóż specyfikacja ma do powiedzenia nt. pakunków częściowych w rodziale &lt;span style="font-weight:bold;"&gt;3.14 Fragment Bundles&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Pakunki częściowe&lt;/span&gt; (ang. &lt;span style="font-style:italic;"&gt;fragment bundles&lt;/span&gt;) są całkowicie zależne od &lt;span style="font-weight:bold;"&gt;pakunku wiodącego&lt;/span&gt; (&lt;span style="font-weight:bold;"&gt;przewodniego&lt;/span&gt;, ang. &lt;span style="font-style:italic;"&gt;host bundle&lt;/span&gt;). Podczas fazy rozwiązywania (zależności) pakunku wiodącego Platforma OSGi dołącza do niego wszystkie dostępne pakunki częściowe. Innymi słowy pakunki częściowe stają się logicznie integralną częścią pakunku wiodącego (aczkolwiek fizycznie są wciąż osobnymi bytami). Stąd też pakunki częściowe współdzielą ładowarkę klas (ang. &lt;span style="font-style:italic;"&gt;classloader&lt;/span&gt;) pakunku wiodącego.&lt;br /&gt;&lt;br /&gt;Specyfikacja OSGi określa rolę pakunków częściowych jako dostawców tłumaczeń, co umożliwia dostarczanie ich niezależnie od pakunku wiodącego (w późniejszym terminie). Można sobie wyobrazić działanie pakunku wiodącego jako aplikacji webowej, do której tłumaczenia są dostarczane jako osobne pakunki częściowe, które ostatecznie stają się częścią aplikacji webowej. Wszystko obsługuje Platforma OSGi.&lt;br /&gt;&lt;br /&gt;Aktualizacja pakunku częściowego jest widoczna dla pakunku wiodącego dopiero po ponownym uruchomieniu Platformy OSGi lub odświeżeniu pakunku wiodącego. Do tego momentu uaktualniony pakunek częściowy jest dołączony do pakunku wiodącego równolegle do poprzedniej wersji, ale pozostaje nieaktywny.&lt;br /&gt;&lt;br /&gt;Usługa &lt;span style="font-weight:bold;"&gt;Package Admin&lt;/span&gt; zwraca ostatnią wersję dołączonego pakunku częściowego.&lt;br /&gt;&lt;br /&gt;Pakunek częściowy może deklarować import części chronionej (prywatnej) pakunku wiodącego.&lt;br /&gt;&lt;br /&gt;Podczas rozwiązywania środowiska dla pakunku częściowego jakikolwiek konflikt w deklaracjach z pakunkiem wiodącym działają na niekorzyść tego pierwszego, co w efekcie prowadzi do niezwiązania go z pakunkiem wiodącym. Poprawne rozwiązanie pakunku częściowego to pomyślnie związanie go z pakunkiem wiodącym i przejście do stanu RESOLVED.&lt;br /&gt;&lt;br /&gt;Przeszukiwanie zasobów pakunku częściowego odbywa się po przeszukaniu zawartości pakunku wiodącego.&lt;br /&gt;&lt;br /&gt;Pakunek częściowy nie może być zadeklarowany jako obowiązkowy przez nagłówek &lt;span style="font-weight:bold;"&gt;Require-Bundle&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Deklaracja środowiska pakunku częściowego zadeklarowana w jego META-INF/MANIFEST.MF jest dołączana na końcu odpowiednich deklaracji pakunku wiodącego (patrz: &lt;span style="font-weight:bold;"&gt;Bundle-Classpath&lt;/span&gt;). Kolejność dowiązania pakunków częściowych odpowiada porządkowi ładowania poszczególnych pakunków częściowych, czyli zgodnie z ich identyfikatorami, rosnąco.&lt;br /&gt;&lt;br /&gt;Pakunek staje się pakunkiem częściowym przez użycie nagłówka &lt;span style="font-weight:bold;"&gt;Fragment-Host&lt;/span&gt; ze wskazaniem na pakunek wiodący z opcjonalnym wskazaniem na jego wersję (domyślnie najwyższa), np.&lt;pre&gt; Fragment-Host: org.springframework.bundle.osgi.extender;bundle-version=1.1.0&lt;/pre&gt;Nazwa pakunku wiodącego użyta w Fragment-Host musi być inna niż pakunku częściowego.&lt;br /&gt;&lt;br /&gt;Pakunek wiodący zezwala na dowiązanie pakunków częściowych, jeśli zadeklarował &lt;span style="font-weight:bold;"&gt;BundlePermission[&amp;lt;nazwa symboliczna pakunku&amp;gt;,HOST]&lt;/span&gt;, podczas gdy pakunek częściowy musi zadeklarować &lt;span style="font-weight:bold;"&gt;BundlePermission[&amp;lt;nazwa symboliczna pakunku&amp;gt;,FRAGMENT]&lt;/span&gt;, aby został związany.&lt;br /&gt;&lt;br /&gt;Pakunek częściowy jest związany, dopóty jego pakunek wiodący jest w stanie RESOLVED. Przejście w stan INSTALLED powoduje odłączenie pakunków częściowych. Wywołanie metod &lt;a href="http://www.osgi.org/javadoc/r4/org/osgi/service/packageadmin/PackageAdmin.html#refreshPackages(org.osgi.framework.Bundle[])"&gt;org.osgi.service.packageadmin.PackageAdmin.refreshPackages(Bundle[] bundles)&lt;/a&gt; lub &lt;a href="http://www.osgi.org/javadoc/r4/org/osgi/service/packageadmin/PackageAdmin.html#resolveBundles(org.osgi.framework.Bundle[])"&gt;org.osgi.service.packageadmin.PackageAdmin.resolveBundles(Bundle[] bundles)&lt;/a&gt; z pakunkiem wiodącym i/lub częściowym może spowodować zmianę stanu pakunku częściowego na INSTALLED.&lt;br /&gt;&lt;br /&gt;Zabronione jest, aby pakunek częściowy deklarował własny aktywator (nagłówek &lt;span style="font-weight:bold;"&gt;Bundle-Activator&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;Ostatecznie, dla utrwalenia wiadomości, warto zapoznać się z dokumentem &lt;a href="http://static.springframework.org/osgi/docs/1.2.0-m1/reference/html/appendix-tips.html#appendix-tips:fragments"&gt;E.1. OSGi Fragments&lt;/a&gt; w dokumentacji Spring Dynamic Modules (Spring-DM).&lt;br /&gt;&lt;br /&gt;Niezwykle istotną informacją dotyczącą wsparcia pakunków częściowych (i potencjalnie dalszej ewaluacji Spring-DM) przez dostępne platformy OSGi jest jego brak w Apache Felix - &lt;a href="http://issues.apache.org/jira/browse/FELIX-29"&gt;FELIX-29 Implement bundle fragments&lt;/a&gt; oraz &lt;a href="http://issues.apache.org/jira/browse/FELIX-656"&gt;FELIX-656 Implement fragment support for extending a host's bundle class path&lt;/a&gt;. Ciekawy jest komentarz do zgłoszenia FELIX-656, gdzie można przeczytać &lt;span style="font-style:italic;"&gt;"I got some feedback from the GlassFish team that after I fixed the last bug it has started working for their test case, so I am resolving this for now, but there is definitely more work to be done in this area."&lt;/span&gt; autorstwa Richard'a Hall'a, a przecież Richard przeszedł niedawno do Sun - &lt;a href="http://www.osgi.org/blog/2008/08/sun-hires-richard-hall.html"&gt;Sun Hires Richard Hall&lt;/a&gt;, więc można spodziewać się więcej tego typu komentarzy (w końcu GlassFish v3 pracuje na kontenerze OSGi, podobnie jak IBM WebSphere Application Server 6.1 czy Eclipse IDE).&lt;br /&gt;&lt;br /&gt;Dla zainteresowanych do czego zmierzam z rozpoznawaniem roli pakunków częściowych polecam lekturę dokumentu &lt;a href="http://static.springframework.org/osgi/docs/1.2.0-m1/reference/html/web.html"&gt;8.4. Configuring the web extender&lt;/a&gt; w dokumentacji Spring-DM. Zdaje się, że bez zrozumienia pakunków częściowych nie ma co marzyć o zrozumieniu działania Spring-DM i jego poprawnej konfiguracji (z potencjalnym rozwiązywaniem błędów). Wciąż żądni wiedzy o OSGi?! Niedługo kolejne odsłony i relacje z moich rekonesansów po terenach OSGi.&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/396637285" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/4563949486045480917/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2008/09/osgi-314-pakunki-czciowe.html#comment-form" title="Komentarze (1)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/4563949486045480917?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/4563949486045480917?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2008/09/osgi-314-pakunki-czciowe.html" title="OSGi - 3.14 Pakunki częściowe" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email></author></entry><entry gd:etag="W/&quot;D0IBQHc-eSp7ImA9WxRSF0k.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-7454590379528590593</id><published>2008-09-16T23:20:00.005+02:00</published><updated>2008-09-18T15:45:51.951+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-18T15:45:51.951+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="różne" /><category scheme="http://www.blogger.com/atom/ns#" term="warszawa-jug" /><title>Nowy sezon spotkań Warszawa JUG rozpoczęty i moje lokalne repozytorium SVN</title><content type="html">Nie potrafię tego wytłumaczyć, ale czy to wdzięk i powab &lt;a href="http://bdawidowicz.blogspot.com/"&gt;Bolesława Dawidowicza&lt;/a&gt;, czy też tematyka - &lt;span style="font-weight:bold;"&gt;LDAP, czyli kiedy relacyjna baza danych nie jest najlepszym rozwiązaniem&lt;/span&gt;, ale na otwierające, 33. spotkanie grupy &lt;a href="http://www.warszawa.jug.pl"&gt;Warszawa JUG&lt;/a&gt; przyszły tłumy - naliczyłem ponad 60 osób, w tym kilka płci żeńskiej (!) Tym samym nowy sezon spotkań grupy mamy rozpoczęty, a kolejne - &lt;span style="font-weight:bold;"&gt;30 września&lt;/span&gt; - powinno spotkać się z niemniejszym zainteresowaniem, gdyż nie tylko, że temat ciekawy &lt;span style="font-weight:bold;"&gt;Zrób to sam: kompilator - podstawy języków formalnych, ANTLR i ANTLRWorks&lt;/span&gt;, ale któż będzie go prezentował - sam Tom (aka Szimano) ;-) Co tu dużo ukrywać - po prostu zapowiada się "tłumny" wrzesień. Szkoda, że nie wziąłem aparatu, bo zdjęcia z pewnością uatrakcyjniłyby wpis i sami moglibyście przekonać się o celowości przybycia na spotkanie (chociażby, aby znaleźć się na zdjęciu). A jakie dyskusje się toczyły. Widać, że ludzikom brakowało rzeczowych dyskusji o technologiach, bo można było odczyć pewny letni "niedosyt technologiczny". Przygotowujemy się do kolejnej konferencji &lt;a href="http://groups.google.com/group/warszawa-jug/t/359c81eaa0b1346a"&gt;Warsjava + Eclipse DemoCamp 2008&lt;/a&gt; w dniu &lt;span style="font-weight:bold;"&gt;22 listopada 2008&lt;/span&gt; i dyskusje będą z pewnością jeszcze bardziej ożywione. Do zobaczenia na kolejnym 34. spotkaniu 30-tego!&lt;br /&gt;&lt;br /&gt;Zanim jednak pojawiłem się na spotkaniu rozwiązałem pewien problem organizacyjny. Ileż to razy przyszło mi pracować lokalnie z dokumentem czy projektem, kiedy to chciałem móc wrócić do poprzedniej wersji? Na pewno uzbierałoby się tego trochę, ale jakimś cudem, mimo ciągłej pracy z repozytoriami SVN, nigdy nie przyszło mi do głowy, aby założyć własne...lokalnie. W końcu nic nie kosztuje, a może uratować cenny czas. Dzisiaj przypadkiem trafiłem na stronę &lt;a href="http://www.abbeyworkshop.com/howto/misc/svn01/"&gt;Subversion Cheat Sheet&lt;/a&gt; i zrozumiałem, że koniec dumania czy warto, a po prostu należy skorzystać, bo jest i to całkowicie bezpłatnie (finansowo i czasowo). Teraz każdorazowo przy utrzymywaniu jakiegokolwiek pliku tekstowego umieszczę go w moim lokalnym repozytorium. W końcu zamiast serii Ctrl+Z można skorzystać z svn revert, czyż nie? &lt;br /&gt;&lt;br /&gt;Rozpoczynam od utworzenia lokalnego repozytorium SVN.&lt;pre&gt; jlaskowski@work /cygdrive/c/projs/sandbox&lt;br /&gt; $ svnadmin create 'c:/projs/sandbox/.svn_repo'&lt;/pre&gt;Pora na zestawienie początkowej struktury katalogowej projektu, który trafi do repozytorium. Zaleca się utworzenie podkatalogów trunk (główna gałąź rozwojowa), branches (odgałęzienia) oraz tags (wersje oznakowane).&lt;pre&gt; jlaskowski@work /cygdrive/c/projs/sandbox/projekt&lt;br /&gt; $ mkdir trunk branches tags&lt;/pre&gt;W trunk umieszczam przykładowy plik README.txt.&lt;pre&gt; jlaskowski@work /cygdrive/c/projs/sandbox/projekt&lt;br /&gt; $ ls -lR&lt;br /&gt; .:&lt;br /&gt; total 0&lt;br /&gt; drwxr-xr-x+ 2 jlaskowski None 0 Sep 16 23:24 branches&lt;br /&gt; drwxr-xr-x+ 2 jlaskowski None 0 Sep 16 23:24 tags&lt;br /&gt; drwxr-xr-x+ 2 jlaskowski None 0 Sep 16 23:24 trunk&lt;br /&gt;&lt;br /&gt; ./branches:&lt;br /&gt; total 0&lt;br /&gt;&lt;br /&gt; ./tags:&lt;br /&gt; total 0&lt;br /&gt;&lt;br /&gt; ./trunk:&lt;br /&gt; total 0&lt;br /&gt; -rw-r--r-- 1 jlaskowski None 0 Sep 16 23:23 README.txt&lt;/pre&gt;Wszystko do tej pory robię z poziomu katalogu projektu, który ostatecznie importuję do lokalnego repozytorium.&lt;pre&gt; jlaskowski@work /cygdrive/c/projs/sandbox/projekt&lt;br /&gt; $ svn import . 'file:///c:/projs/sandbox/.svn_repo/projekt' -m 'Rozpoczynamy'&lt;br /&gt; Adding         trunk&lt;br /&gt; Adding         trunk/README.txt&lt;br /&gt; Adding         branches&lt;br /&gt; Adding         tags&lt;br /&gt;&lt;br /&gt; Committed revision 1.&lt;/pre&gt;Pierwsza wersja znalazła się w repozytorium. Teraz wystarczy pobrać projekt na dowolne miejsce na dysku.&lt;pre&gt; jlaskowski@work /cygdrive/c/projs/sandbox&lt;br /&gt; $ svn co 'file:///c:/projs/sandbox/.svn_repo/projekt/trunk' projekt&lt;br /&gt; A    projekt/README.txt&lt;br /&gt; Checked out revision 1.&lt;br /&gt;&lt;br /&gt; jlaskowski@work /cygdrive/c/projs/sandbox&lt;br /&gt; $ ls -l projekt/&lt;br /&gt; total 0&lt;br /&gt; -rw-r--r-- 1 jlaskowski None 0 Sep 16 23:26 README.txt&lt;/pre&gt;I tyle. Projekt jest już utrzymywany przez SVN. Oczywiście nie uchroni to przed awarią komputera, ale jako wsparcie kopii zapasowych, powinno być wręcz nieodzowne. Teraz mogę już zmieniać pliki dowolnie i przy najmniejszym wahaniu wrócić do poprzednich wersji. Mam wybór i o to chodzi.&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/394593796" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/7454590379528590593/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2008/09/nowy-sezon-spotka-warszawa-jug.html#comment-form" title="Komentarze (3)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/7454590379528590593?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/7454590379528590593?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2008/09/nowy-sezon-spotka-warszawa-jug.html" title="Nowy sezon spotkań Warszawa JUG rozpoczęty i moje lokalne repozytorium SVN" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email></author></entry><entry gd:etag="W/&quot;CkUBQHg4cCp7ImA9WxRSFEQ.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-5138499062501397324</id><published>2008-09-15T16:43:00.002+02:00</published><updated>2008-09-15T16:50:51.638+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-15T16:50:51.638+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="maven2" /><category scheme="http://www.blogger.com/atom/ns#" term="spring framework" /><category scheme="http://www.blogger.com/atom/ns#" term="osgi" /><title>Bundle.findEntries() i spring-osgi-bundle-archetype w akcji - monitorowanie pakunków OSGi z określoną strukturą katalogową</title><content type="html">&lt;a href="http://www.springframework.org/osgi"&gt;Spring Dynamic Modules&lt;/a&gt; (dalej &lt;span style="font-weight:bold;"&gt;Spring-DM&lt;/span&gt;) umożliwia tworzenie ziaren springowych jako pakunki &lt;a href="http://www.osgi.org/"&gt;OSGi&lt;/a&gt; umożliwiając skorzystanie z cech obu środowisk - Spring Framework i OSGi. Tak określiłbym motto projektu. Jednym z elementów wspomagających tworzenie aplikacji korporacyjnych ze Spring-DM jest stworzenie środowiska uruchomieniowego, w którym cechy OSGi są integralną częścią środowiska. W ten sposób aplikacja webowa może być dystrybuowana w postaci pakunku (wystarczy jedynie dopisanie kilku nagłówków w META-INF/MANIFEST.MF) i uruchomiona w ramach Platformy OSGi (Equinox, Felix czy Knopflerfish). Teoretycznie (jeszcze) możemy sobie wyobrazić sytuację, w której poszczególne części aplikacji są dystrybuowane jako pakunki OSGi, które z kolei składają się na większy pakunek OSGi będący nota bene aplikacją webową. &lt;span style="font-style:italic;"&gt;"A po co?"&lt;/span&gt; - możnaby zapytać. Odpowiedź sama się nasuwa - wprowadzenie/podniesienie modularności w aplikacji. Jeśli weźmiemy za przykład aplikację webową, to jej jedną z części mogą być servlety zgrupowane jako pakunek OSGi, który dzięki mechanizmom OSGi moglibyśmy podmienić...w trakcie działania naszej aplikacji (!) Czyż nie jest to cecha, której wprowadzenia pożądalibyśmy w naszych aplikacjach? Z pewnością!&lt;br /&gt;&lt;br /&gt;W moim nowym artykule &lt;a href="http://www.jaceklaskowski.pl/wiki/Bundle.findEntries()_i_spring-osgi-bundle-archetype_w_akcji_-_monitorowanie_pakunków_OSGi_z_określoną_strukturą_katalogową"&gt;Bundle.findEntries() i spring-osgi-bundle-archetype w akcji - monitorowanie pakunków OSGi z określoną strukturą katalogową&lt;/a&gt; przedstawiłem funkcjonowanie metody &lt;span style="font-weight:bold;"&gt;org.osgi.framework.Bundle.findEntries()&lt;/span&gt;, której zadaniem jest zwrócenie zawartości odpytywanego pakunku jako listę URLi. W ten sposób możemy prześwietlić zawartość pakunków i poznać ich strukturę katalogową. Dodając do tego możliwość rejestracji słuchacza zdarzeń instalacja/odinstalowanie pakunków przy pomocy &lt;span style="font-weight:bold;"&gt;org.osgi.framework.BundleListener&lt;/span&gt; mamy doskonały sposób na monitorowanie zmian na Platformie OSGi i weryfikację, czy zainstalowany właśnie pakunek nie jest przypadkiem specjalnego traktowania przez naszą aplikację monitorującą. Zgłoszenie zdarzenia podmiany (=odinstalowania i instalacji) pakunku ponownie powoduje wzbudzenie BundleListener i wykonanie właściwej akcji. Mam wrażenie, że jest to jedyny tego typu szkielet aplikacyjny, który znosi z nas obowiązek własnoręcznego tworzenia mechanizmu monitorowania zmian w środowisku - w OSGi wystarczy jedynie implementacja BundleListener. Więcej w samym artykule. Miłej lektury!&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/393276375" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/5138499062501397324/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2008/09/bundlefindentries-i-spring-osgi-bundle.html#comment-form" title="Komentarze (2)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/5138499062501397324?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/5138499062501397324?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2008/09/bundlefindentries-i-spring-osgi-bundle.html" title="Bundle.findEntries() i spring-osgi-bundle-archetype w akcji - monitorowanie pakunków OSGi z określoną strukturą katalogową" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email></author></entry><entry gd:etag="W/&quot;CUUDSHY_fip7ImA9WxRSE00.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-1238421976563392303</id><published>2008-09-13T12:53:00.001+02:00</published><updated>2008-09-13T12:54:39.846+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-13T12:54:39.846+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="warszawa-jug" /><title>33. spotkanie Warszawskiej Grupy Użytkowników Technologii Java (Warszawa JUG)</title><content type="html">&lt;a href="http://www.warszawa.jug.pl"&gt;Warszawska Grupa Użytkowników Technologii Java (Warszawa JUG)&lt;/a&gt; zaprasza na 33. spotkanie, które odbędzie się 16.09.2008 (nadchodzący wtorek) o godzinie 18:00 w sali 5440 Wydziału MIMUW przy ul. Banacha 2 w Warszawie.&lt;br /&gt;&lt;br /&gt;Temat prezentacji: &lt;b&gt;LDAP - czyli kiedy relacyjna baza danych nie jest najlepszym rozwiązaniem&lt;/b&gt;&lt;br /&gt;Prowadzący: &lt;a href="http://bdawidowicz.blogspot.com/"&gt;Bolesław Dawidowicz&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Celem spotkania jest zaprezentowanie podstaw technologii LDAP oraz jej zastosowań. Słuchacze dowiedzą się czym różni się serwer katalogowy od bazy danych oraz w jakich sytuacjach warto rozważyć jego użycie. Zostanie przedstawione w jaki sposób można wykorzystywać usługi katalogowe z poziomu Javy oraz w jaki sposób mogą one wspomóc zabezpieczanie aplikacji JEE&lt;br /&gt;&lt;br /&gt;Plan prezentacji:&lt;br /&gt;- Wprowadzenie do technologii usług katalogowych&lt;br /&gt;- Historia i zastosowanie protokołu LDAP oraz dostępne serwery&lt;br /&gt;- LDAP a Java - krótkie wprowadzenie do JNDI&lt;br /&gt;- LDAP i testy jednostkowe - Embedded OpenDS&lt;br /&gt;- JEE Security i JAAS - krótkie wprowadzenie&lt;br /&gt;- Uwierzytelnienie i autoryzacja aplikacji JEE w oparciu o LDAP - na przykładzie JBoss AS&lt;br /&gt;&lt;br /&gt;Prezentacja prowadzona głównie w oparciu o slajdy acz nie zabraknie również kilku pokazów "na żywo" z otwartym IDE:&lt;br /&gt;&lt;br /&gt;Wymagana wiedza: minimalna&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bdawidowicz.blogspot.com/"&gt;Bolesław Dawidowicz&lt;/a&gt; - miłośnik i pasjonat Javy, zawodowo związany z projektem JBoss Portal. Interesuje się rozwiązaniami z kręgu Identity Management. Stara się aktywnie uczestniczyć w życiu Warszawa JUG. Przyrzeka spróbować tym razem nic nie powiedzieć o portletach ;)&lt;br /&gt;&lt;br /&gt;Planowany czas prezentacji to 1,5 godziny, po której planuje się 15-30-minutową dyskusję.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Wstęp wolny!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Zapraszam w swoim imieniu i grupy Warszawa JUG!&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/391462861" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/1238421976563392303/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2008/09/33-spotkanie-warszawskiej-grupy.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/1238421976563392303?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/1238421976563392303?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2008/09/33-spotkanie-warszawskiej-grupy.html" title="33. spotkanie Warszawskiej Grupy Użytkowników Technologii Java (Warszawa JUG)" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email></author></entry><entry gd:etag="W/&quot;CUcDRHw8fip7ImA9WxRSEUs.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-714001438070894795</id><published>2008-09-11T21:52:00.002+02:00</published><updated>2008-09-11T21:57:55.276+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-11T21:57:55.276+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="spring framework" /><title>DSL dla konfiguracji Spring Framework</title><content type="html">Nie pamiętam, co dokładnie sprawiło, że zacząłem poszukiwania znaczenia plików &lt;span style="font-weight:bold;"&gt;META-INF/spring.handlers&lt;/span&gt; oraz &lt;span style="font-weight:bold;"&gt;META-INF/spring.schemas&lt;/span&gt; w Spring Framework, ale pamiętam, że jednym z powodów było z pewnością znalezienie ich w źródłach &lt;span style="font-weight:bold;"&gt;Spring Dynamic Modules&lt;/span&gt; (moduł &lt;span style="font-weight:bold;"&gt;spring-osgi-core&lt;/span&gt;). A może to była lektura &lt;a href="http://blog.linkedin.com/blog/2008/06/osgi-at-linke-2.html"&gt;OSGi at LinkedIn: Integrating Spring DM (Part 1)&lt;/a&gt;? Postanowiłem samodzielnie spróbować się z tematem i po lekturze &lt;a href="http://static.springframework.org/spring/docs/2.5.x/reference/extensible-xml.html"&gt;Appendix B. Extensible XML authoring&lt;/a&gt; sprawdzić w działaniu. &lt;br /&gt;&lt;br /&gt;I po 10-15 minutach miałem temat rozpoznany. Na tyle, że kiedy dzisiaj pojawiło się pytanie w temacie &lt;a href="http://forum.springframework.org/showthread.php?t=60027"&gt;The matching wildcard is strict, but no declaration can be found for element 'osgi:reference'&lt;/a&gt; od razu pośpieszyłem z odpowiedzią. To się nazywa proaktywna postawa wobec potrzeb klientów ;-)&lt;br /&gt;&lt;br /&gt;Więcej o mechaniźmie upraszczania konfiguracji Spring Framework w moim artykule &lt;a href="http://www.jaceklaskowski.pl/wiki/DSL_dla_konfiguracji_Spring_Framework"&gt;DSL dla konfiguracji Spring Framework&lt;/a&gt;.&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/389962016" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/714001438070894795/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2008/09/dsl-dla-konfiguracji-spring-framework.html#comment-form" title="Komentarze (2)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/714001438070894795?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/714001438070894795?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2008/09/dsl-dla-konfiguracji-spring-framework.html" title="DSL dla konfiguracji Spring Framework" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email></author></entry><entry gd:etag="W/&quot;DE4FRXwyeCp7ImA9WxRSEE4.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-2890550774647769397</id><published>2008-09-10T10:28:00.009+02:00</published><updated>2008-09-10T10:55:14.290+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-10T10:55:14.290+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="różne" /><title>Silesia JUG już jest!</title><content type="html">I po spotkaniu. Po rozgłoszeniu go przez &lt;a href="http://lukaszlipka.blogspot.com/"&gt;Łukasza Lipkę&lt;/a&gt; na grupie &lt;span style="font-weight:bold;"&gt;pl.comp.lang.java&lt;/span&gt; - &lt;a href="http://groups.google.com/group/pl.comp.lang.java/browse_thread/thread/18715afa45b791a0#"&gt;JUG Śląsk??? i spotkanie z Jackiem&lt;/a&gt; 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!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wSeV_DMR2uA/SMeINoUp5YI/AAAAAAAABd4/fZLLaaAcrDg/s1600-h/przybarze.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_wSeV_DMR2uA/SMeINoUp5YI/AAAAAAAABd4/fZLLaaAcrDg/s320/przybarze.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5244310058839958914" /&gt;&lt;/a&gt;&lt;br /&gt;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 &lt;a href="http://pl.wikipedia.org/wiki/Silesia"&gt;Silesia&lt;/a&gt; (potencjalna nazwa dla Katowic i przyległych miast, coś na wzór Trójmiasta), więc naturalnie można oczekiwać nazwy &lt;span style="font-weight:bold;"&gt;Silesia JUG&lt;/span&gt;. Uważam, że obszar katowicki wymaga reprezentacji w postaci JUGa i mówi się, że coś może się pojawić niebawem.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wSeV_DMR2uA/SMeGSfxEr3I/AAAAAAAABdw/XfaYLCx9n-w/s1600-h/my.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_wSeV_DMR2uA/SMeGSfxEr3I/AAAAAAAABdw/XfaYLCx9n-w/s320/my.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5244307943419326322" /&gt;&lt;/a&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wSeV_DMR2uA/SMeJn-G5KhI/AAAAAAAABeA/0SN1Wh5xAYg/s1600-h/swiatla.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/SMeJn-G5KhI/AAAAAAAABeA/0SN1Wh5xAYg/s320/swiatla.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5244311610876045842" /&gt;&lt;/a&gt;&lt;br /&gt;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). &lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;Z ostatniej chwili - właśnie otrzymałem zaproszenie do &lt;a href="http://groups.google.com/group/silesia-jug"&gt;Silesia JUG&lt;/a&gt;! 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".&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/388491247" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/2890550774647769397/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2008/09/silesia-jug-ju-jest.html#comment-form" title="Komentarze (1)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/2890550774647769397?v=2" /><link rel="self" type="application/atom+xml" href="http://www