Как я могу совместно использовать библиотеки не OSGi между пакетами в контейнере OSGi? - PullRequest
8 голосов
/ 05 августа 2009

Я сталкивался с этим вопросом, когда пытался поделиться пакетами Struts между несколькими пакетами внутри контейнера OSGi. Я хотел избежать как дублирования зависимостей внутри пакетов, так и введения новой зависимости между ними (так как один пакет экспортирует свои внутренние зависимости для совместного использования другим).

Оказывается, ответ очень прост, если вы используете Maven, а если нет, вы все равно можете использовать решение Maven, чтобы узнать, как создать тот же результат с другим механизмом.

Я нашел этот подход полезным несколько раз во время моего проекта, поэтому я опубликую пример здесь.

Ответы [ 2 ]

9 голосов
/ 05 августа 2009

Дополнительный путь для тех, кто не слишком увлечен Maven, не может портировать или совершенно доволен муравьем / плющом

Я обнаружил, что самый простой способ выполнить указанную задачу - превратить не-OSGi библиотеку в библиотеку OSGi, позволяя манифесту экспортировать каждый пакет и добавлять некоторые условные символические имена / версии. Я смог сделать это ОЧЕНЬ легко с помощью bnd с помощью задач ant (или даже прямого вызова из командной строки). Есть также репозитории , которые содержат "osgi-ified" версию многих популярных библиотек. Некоторые библиотеки (joda-time) уже поставляются с правильными манифестами OSGi.

8 голосов
/ 05 августа 2009

Используя Maven, очень легко создать пакет OSGi из любой библиотеки. Тем не менее, я думаю, что тот же результат может быть достигнут и с другими механизмами. Решение Maven помогло мне понять, как оно работает.

Создание пакета выполняется путем создания проекта, в котором библиотека является зависимостью, а затем упаковки проекта с использованием maven-bundle-plugin из проекта Apache Felix и указания пакеты библиотеки с инструкцией Export-Package. Я использовал это для совместного использования буферов протокола Google между пакетами внутри контейнера OSGi:

<?xml version="1.0" encoding="UTF-8" ?>
<project>
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example.lib</groupId>
  <artifactId>protobuf-dist</artifactId>
  <version>2.1.0</version>
  <name>Google Protocol Buffers OSGi Distribution</name>
  <packaging>bundle</packaging>

  <dependencies>
    <dependency>
      <groupId>com.google.protobuf</groupId>
      <artifactId>protobuf-java</artifactId>
      <version>2.1.0</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.felix</groupId>
        <artifactId>maven-bundle-plugin</artifactId>
        <extensions>true</extensions>
        <configuration>
          <instructions>
            <Export-Package>com.google.protobuf</Export-Package>
          </instructions>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

Если вы хотите, чтобы все транзитивные зависимости были также включены в пакет, используйте цель плагина bundleall.

Плагин распознает и учитывает существующие OSGi-манифесты в зависимости.

Вы также можете использовать плагин комплекта, чтобы просто создать манифест и указать плагину упаковки jar (или встроенной сборке jar-with-dependencies) использовать этот манифест через раздел архива. На странице плагина, указанной выше, показано, как это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...