Чад, чтобы более эффективно ответить на ваш вопрос, я бы хотел знать несколько вещей:
1) Как именно вы получаете сервисную ссылку из внешнего приложения?
2) Является ли внешнее приложение автономным или оно находится внутри другого контейнера? Если так, то есть способы сделать это.
Вопрос, который вы задаете, интересен. Давайте поместим это в контекст. Предположим, что вы можете получить ссылку на сервис OSGi от Феликса из внешнего приложения. Когда вы используете этот сервис, вы будете взаимодействовать с ним через интерфейс. В этом интерфейсе в OSGi вы будете иметь ссылки на операторы импорта, которые будут использоваться в сигнатурах методов интерфейса, а также в любых конечных атрибутах. Эти операторы импорта будут иметь соответствующие зависимые библиотеки, определенные в вашем файле pom.xml.
Чтобы использовать службу внешним приложением, вам нужно будет опубликовать файл API ".jar", который будет содержать интерфейс и ссылаться на зависимости интерфейсов. Ваше внешнее приложение должно будет использовать этот API и, скорее всего, соберет его в каталог lib вашего .war, .jar или .ear файла. Из-за этого ни одна из зависимостей вашего внешнего приложения не может конфликтовать с вашими зависимостями API.
Пока вы можете использовать API, вы правы, ни одна из зависимостей SPI не имеет значения. Вы можете использовать Spring 3.0.4.RELEASE во внешнем приложении и по-прежнему использовать Spring 2.5.6.SNAPSHOT в своем приложении OSGi. Пока API не имеет каких-либо зависимостей, которые конфликтуют с внешним приложением, вы должны быть в порядке. Хитрость заключается в том, что вам нужно поместить ваши интерфейсы в минимальный файл .jar в качестве вашего API, а затем поместить детали реализации в SPI. Ваш внешний AP будет использовать API, а внутри OSGI вы будете использовать как API, так и SPI.
Пожалуйста, дайте мне знать, если это поможет.