Ссылочные интерфейсы сервисов Spring OSGI должны быть явно импортированы при использовании пакета? - PullRequest
4 голосов
/ 25 января 2012

Я знакомлюсь с Spring OSGI и Blueprint, но у меня трудности с "classpath" (как и у многих новичков).

У меня есть два пакета OSGI - один, который определяет различные компоненты (используя Blueprint, а не то, что это должно иметь значение) и экспортирует их как сервисы; и другой пакет, который ссылается на служебные бины (используя Spring OSGI) и включает их в некоторые маршруты Apache Camel.

Blueprint пакета поставщика услуг выглядит примерно так:

<service id="camelTsvDataFormat" 
    interface="org.apache.camel.spi.DataFormat"> 
    <bean class="org.apache.camel.component.flatpack.FlatpackDataFormat"/> 
</service> 

Контекст Spring комплекта услуг-потребителей выглядит примерно так:

<osgi:reference id="tsvDataFormat" 
    interface="org.apache.camel.spi.DataFormat" /> 

<camel:camelContext> 
    <route> 
        <from uri="vm:in"> 
        <setBody> 
            <constant>SELECT * FROM myTable</constant> 
        </setBody> 
        <to uri="jdbc:myDataSource" /> 
        <marshal ref="tsvDataFormat" /> 
        <to uri="file:/path/to/my/files/?fileName=out.tsv" /> 
    </route> 
</camel:camelContext> 

… Но при развертывании Spring «Не удается найти класс [org.apache.camel.spi.DataFormat]». Я могу добавить интерфейс в раздел Import-Package моих инструкций Bnd, но кажется излишним, чтобы вручную дважды перечислять класс в разных местах.

Альтернативный вариант - расширить интерфейс в моем собственном проекте, чтобы Bnd автоматически его поднял, но это примерно такая же проблема.

Полагаю, я ожидаю, что Spring выполнит поиск сервисов по имени интерфейса без фактического разрешения класса интерфейса. Это наивно? Или есть способ, позволяющий Bnd автоматически импортировать интерфейсы в ссылках на сервис моего appContext? Если Bnd может сделать это (например, с помощью плагинов), существует ли стандартный способ использования плагинов Bnd с комплектом плагинов Apache Felix для Maven?

Ответы [ 2 ]

3 голосов
/ 25 января 2012

Как предполагает Холли, bnd обычно находит этот пакет, на который ссылается любой байт-код внутри вашего пакета, который его вызывает.Также следует проанализировать XML-файлы Spring-DM, если они находятся в нужном месте.Однако я не знаю, поддерживает ли он все же XML-файлы Blueprint таким же образом, потому что они не находятся в одном месте пакета.Поэтому может потребоваться обновить вашу версию bnd или использовать плагин, поддерживающий Blueprint.

Однако я с подозрением отношусь ко всему этому.Если в интерфейсе нет ссылок на байт-код, значит, вы даже не используете ссылку на сервис?В таком случае, почему бы просто не удалить его?

1 голос
/ 26 января 2012

Как указал @Neil Bartlett, Bnd должен проанализировать файлы Spring и Blueprint в стандартном месте пакета (META-INF/spring и OSGI-INF/blueprint).Я вручную переопределил их как META-INF/spring/*.xml и OSGI-INF/blueprint/*.xml в моем POM.Я подумал, что это нормально, поскольку расширители Spring и Blueprint на моей платформе OSGI приняли заголовки и загрузили соответствующие контейнеры.Однако Bnd, похоже, ожидает более простой заголовок без глобусов (см. SpringXMLType.java).Я не хочу приписывать ошибку, потому что это удивительный инструмент, но этот застал меня врасплох

В любом случае, поскольку мои разметки Spring и Blueprint уже находятся в стандартном расположении, я просто удалил избыточные инструкции Bnd из моего POM, и все справочные интерфейсы службы Spring-DM были автоматически выбраны и Import-Package 'dв мою связку:

<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <version>2.3.6</version>
    <extensions>true</extensions>
    <configuration>
        <instructions>
            <Bundle-Version>${project.version}.${buildNumber}</Bundle-Version>
            <Bundle-Activator>com.example.BundleActivator</Bundle-Activator>
            <!-- 
                <Spring-Context>META-INF/spring/*.xml</Spring-Context> 
                <Bundle-Blueprint>OSGI-INF/blueprint*.xml</Bundle-Blueprint> 
            -->
        </instructions>
    </configuration>
</plugin>
...