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

StackOverflow https://stackoverflow.com/questions/1235129

  •  22-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение 2

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

Создание пакета выполняется путем создания проекта, в котором библиотека является зависимостью, а затем упаковка проекта с использованием maven-bundle-plugin из Apache Felix project и указание пакетов библиотеки с помощью инструкции 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-манифесты в зависимости.

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top