Руководство Бизнес-аналитика

Page tree

Руководство Бизнес-аналитика. Платформа Web-BPM 2.0

Skip to end of metadata
Go to start of metadata


Доброго времени суток, если Вы читаете эту статью, то, скорее всего, Вы счастливый разработчик приложения, разрабатываемого с использованием принципов OSGI и работающего в OSGI контейнере. Обозначим проблему - далеко не все библиотеки, расположенные в репозитории Maven предназначены для использования в OSGI среде. Разница, побольшому счету, в метаинформации, обозначенной в файле MANIFEST.MF, расположенном внутри библиотеки.


Ниже я приведу примеры манифестов OSGI-ready и обычной библиотеки:

Манифест OSGI-ready зависимостиМанифест стандартной зависимости
Manifest-Version: 1.0
Export-Package: org.apache.commons.codec;version="1.10",org.apache.com
mons.codec.binary;version="1.10",org.apache.commons.codec.digest;vers
ion="1.10",org.apache.commons.codec.language;version="1.10",org.apach
e.commons.codec.language.bm;version="1.10",org.apache.commons.codec.n
et;version="1.10"
Implementation-Title: Apache Commons Codec
Built-By: ggregory
Tool: Bnd-2.3.0.201405100607
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.6))"
Implementation-Vendor: The Apache Software Foundation
Implementation-Vendor-Id: org.apache
Specification-Title: Apache Commons Codec
Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt
Bundle-SymbolicName: org.apache.commons.codec
X-Compile-Target-JDK: 1.6
Implementation-Version: 1.10
Specification-Vendor: The Apache Software Foundation
Bundle-Name: Apache Commons Codec
Created-By: Apache Maven Bundle Plugin
X-Compile-Source-JDK: 1.6
Bundle-Vendor: The Apache Software Foundation
Build-Jdk: 1.7.0_71
Bundle-Version: 1.10.0
Bnd-LastModified: 1415283265384
Bundle-ManifestVersion: 2
Bundle-Description: The Apache Commons Codec package contains simple e
ncoder and decoders for various formats such as Base64 and Hexade
cimal. In addition to these widely used encoders and decoders, t
he codec package also maintains a collection of phonetic encoding
utilities.
Bundle-DocURL: http://commons.apache.org/proper/commons-codec/
Import-Package: javax.crypto,javax.crypto.spec
Include-Resource: org/apache/commons/codec/language/bm/sep_rule
s_spanish.txt=src/main/resources/org/apache/commons/codec/language/bm
/sep_rules_spanish.txt,org/apache/commons/codec/language/dmrules.txt=
src/main/resources/org/apache/commons/codec/language/dmrules.txt,META
-INF/LICENSE.txt=LICENSE.txt,META-INF/NOTICE.txt=NOTICE.txt
Specification-Version: 1.10
Implementation-Build: trunk@r1637108; 2014-11-06 14:14:12+0000
Archiver-Version: Plexus Archiver
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: jwilson
Created-By: Apache Maven 3.2.3
Build-Jdk: 1.8.0_45

Основные маркеры - это наличие Bundle-Name, Bundle-Version, Import-Package и т.д.


Библиотеки, изначально не предназначенные для использования в OSGI контейнере, не работают! Компиляция будет проходить, но во время разворачивания приложения Вы получите примерно такие ошибки:

15:46:56,529 WARN  [org.jboss.as.osgi] (MSC service thread 1-5) JBAS011910: Cannot resolve requirements: [XPackageRequirement[dirs={filter=(osgi.wiring.package=sun.security.action)},[jai-imageio-core:1.3.1]]]


Как же быть? Использовать исключительно то небольшое количество библиотек, предназначенных для использования в OSGI?

К счастью, выход есть, нашими доблестными коллегами был разработан проект osgi-wrapper. Его можно скачать с внутреннего сервера командой git clone git@10.10.31.70:/osgi-wrapper.


Итак, порядок действий, необходимый для добавления зависимости в Ваш проект:

  1. Заглянуть в файл MANIFEST.MF. Если зависимость OSGI-ready, прыгать от счастья, собрать всех коллег и закатить вечеринку необходимо просто добавить ее в проект. Дальше можно не читать.
  2. Вам не повезло, необходимо обернуть зависимость самостоятельно с помощью osgi-wrapper.


Как обернуть зависимость в osgi-wrapper:

Последовательнсть действийПример на основе добавления зависимости
<groupId>org.elasticsearch.client</groupId>
<artifactId>rest</artifactId>
<version>5.4.0</version>
1. Необходимо создать новую ветку от ветки master.
2. Cоздать новый Maven модуль в корне проекта osgi-wrapper. Добавить модуль в pom.xml
<modules>
<module>apache-httpcomponents</module>
<module>com.github.spullara.mustache.java-compiler-0.9.0</module>
<module>jaxb-api</module>
<module>javax.inject-jav

<module>org.elasticsearch.client-5.4.0</module>

3. Родительским модулем будет корневой проект, groupId и artifactId оставить такой же, как и в оригинальной зависимости,

а номер версии изменить по паттерну {origin.version}.bundle_{bundle.version}. Обязательно указать packaging - bundle

<parent>
<groupId>ru.cg</groupId>
<artifactId>osgi-wrapper</artifactId>
<version>0.11</version>
</parent>
<groupId>org.elasticsearch.client</groupId>
<artifactId>rest</artifactId>
<version>5.4.0.bundle_1</version>
<packaging>bundle</packaging>
4. Добавить блок <dependencies> в которую включить оригинальную зависимость со scope - provided.
<dependencies>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>rest</artifactId>
<version>5.4.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpasyncclient</artifactId>
<version>4.1.2-bundle_1</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2-bundle_1</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.5-bundle_1</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore-nio</artifactId>
<version>4.4.5-bundle_1</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
</dependencies>

5. Проанализировать ВСЕ транзитивные зависимости. OSGI-ready зависимости со слезами счастья на лице просто добавляем

в секцию <dependencies>, а те, которые нужно обернуть, оборачиваем самостоятельно и затем добавляем добавляем.

Добавлять необходимо уже обернутую зависимость (bundle)!!!

6. Добавить секцию <build> с настройками плагинов
<build>
<sourceDirectory>${project.build.directory}/sources</sourceDirectory>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack-sources</id>
<phase>prepare-package</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>${project.groupId}</groupId>
<artifactId>${project.artifactId}</artifactId>
<version>5.4.0</version>
<type>java-source</type>
<outputDirectory>${project.build.directory}/sources</outputDirectory>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
</plugin>
</plugins>
</build>
7. Инкрементировать версию ТОЛЬКО тех pom.xml, которые были Вами изменены.
8. Добавить в секцию <profiles> settings.xml мавена профайл cg-artifactory

<profile>
<id>cg-artifactory</id>
<repositories>
<repository>
<id>central</id>
<name>CG Repo</name>
<url>http://artifactory.cg.ru/artifactory/all</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>CG plugins-releases</name>
<url>http://artifactory.cg.ru/artifactory/all</url>
</pluginRepository>
</pluginRepositories>
</profile>

9. Собрать мавеном проект osgi-wrapper (clean install), добавить в проект обернутую зависимость и запустить.
10. Убедиться что все работает, запушить ветку в удаленный репозиторий и создать review. В reviewers указать Урманчеева Тимура и Сулейманова Рината.

P.S.: osgi-wrapper - проект мистический, и перед каждым новым пользователем может предстать в новом свете. В связи с чем, большая просьба дополнять эту статью, при столкновении с новыми аспектами и возможностями проекта.

  • No labels