Z jakich plików XML korzystasz? Gdzie umieszczasz je w swoich pakietach OSGi (META-INF/wiosna, OSGi-INF)? Która z tych metod pozwoli Ci ponownie wykorzystać pakiety w połączeniu z implementacją inną niż Gemini Blueprint?
Gemini Blueprint traktuje obu tych katalogach równo, ale OSGI-INF/blueprint/*.xml
jest tylko jeden określony w ogólnej specyfikacji OSGi Blueprint.
Sugerowany praktyki z the Gemini Blueprint documentation jest:
[...] zasugerował praktyką jest podzielona konfigurację kontekstowego aplikacji na co najmniej dwóch plików, nazwany przez konferencyjnym modulename-context.xml i modulename-osgi-context.xml. Plik modulename-context.xml zawiera zwykłe definicje fasoli niezależne od wiedzy o OSGi . Plik modulename-osgi-context.xml zawiera definicje fasoli do importowania i eksportowania usług OSGi. Może (ale nie jest wymagane) używanie schematu Gemini Blueprint OSGi jako przestrzeni nazw najwyższego poziomu zamiast obszaru nazw Spring 'beans'.
Próbowałem tego i działa świetnie. Używam Gemini Blueprint do jednego z moich projektów, który ma pliki META-INF/spring/context.xml
, które definiują moje fasolki i ich relacje, oraz META-INF/spring/osgi-context.xml
, który określa, które ziarno eksponować jako/importować z usług OSGi i jak.context.xml
wygląda
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean id="myOrdinarySpringBean" class="com.acme.impl.Foo"/>
</beans>
i jest regularnym zwykły kontekst aplikacji Wiosna bez konfiguracji Blueprint/OSGi w ogóle. osgi-context.xml
wygląda
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
<service id="myOsgiService" ref="myOrdinarySpringBean" interface="com.acme.Foo"/>
</blueprint>
Można by oczywiście użyć elementu <beans>
namespace i korzeń tutaj jak dobrze, ale trzeba by zdefiniować xmlns:osgi
i prefiks usługę tak: <osgi:service .../>
za to do pracy. W moim przypadku nie potrzebuję rzeczy specyficznych dla Gemini, więc cieszę się z tej ogólnej konfiguracji Blueprint. Podobnie mógłbym używać przestrzeni nazw <blueprint>
również w context.xml
, ale ta konkretna aplikacja jest starą, która jest przeniesiona do OSGi, więc wolę zachować tę konfigurację Spring specyficzną dla teraz.
Inna aplikacja z kolei posiada własny osgi-context.xml
jak
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
<reference id="myOrdinarySpringBeanImportedFromOsgi" interface="com.acme.Foo" availability="mandatory"/>
</blueprint>
i w tej chwili nie, ale mogłaby mieć własną context.xml
jak
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean id="myOrdinaryOtherSpringBean" class="com.acme.impl.Bar">
<property name="foo" ref="myOrdinarySpringBeanImportedFromOsgi"/>
</bean>
</beans>
i nie troszczą się mniej czy myOrdinarySpringBeanImportedFromOsgi
jest importowany z usługi OSGi lub zdefiniowany jako zwykły zwykły Spring bean w tym samym kontekście aplikacji.
Te konfiguracje można łatwo przenieść na OSGI-INF/blueprint/
, jeśli chcę oddzielić się od realizacji Gemini Blueprint, ale na razie wolę trzymać dwie połówki w tym samym miejscu, aby uniknąć bałaganu w strukturze katalogów .
Nie sądzę, że działa w JBoss Fuse. Zaimportowana usługa w Aries OSGi xml nie może być rozpoznana w Spring DM xml. – sancho21
Nie sądzę, że można narazić na szwank i skonsumować usługę z tego samego pakietu. To nie jest problem współdziałania projektu/wiosny. Ten sam problem stanie się z samą wiosną lub po prostu planem. – mjmeno