AEM OSGI сторонняя зависимость, пакет не активен - PullRequest
0 голосов
/ 10 мая 2019

Я работаю над проектом AEM, я новичок в AEM, кстати.Я пытаюсь использовать пару сторонних библиотек не OSGI, таких как Dozer и Spring.Я действительно борюсь с этим, это боль в заднице, может быть, это потому, что OSGI - это старая школа.Мои пакеты устанавливаются, но не активны в консоли OSGI, так как они жалуются на отсутствующие пакеты.

Я хочу сделать шаг за шагом.Сначала я хочу заставить свои связки работать только с Dozer и ничего больше.Это мои зависимости pom:

<dependency>
   <groupId>net.sf.dozer</groupId>
   <artifactId>dozer-osgi</artifactId>
   <version>5.5.1</version>
</dependency>

Вот моя конфигурация maven-bundle-plugin:

<plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <extensions>true</extensions>
                <version>4.1.0</version>
                <configuration>
                    <instructions>
                        <Export-Package>somepackages*</Export-Package>
                        <Private-Package/>
                        <Import-Package>*</Import-Package>
                        <Sling-Bundle-Resources>/META-INF</Sling-Bundle-Resources>
                    </instructions>
                </configuration>
            </plugin>

Как вы можете видеть, я уже использую dozer-osgi.Я не уверен, почему это не поднимает это.Он жалуется на это:

org.dozer,version=[5.5,6) -- Cannot be resolved
org.dozer.loader.api,version=[5.5,6) -- Cannot be resolved

Во-первых, я не понимаю, почему он говорит [5.5,6), потому что я говорю ему использовать 5.5.1.Во-вторых, я уже использую dozer-osgi, я думаю, что он должен поднять его автоматически.

Я пробовал также использовать:

<Embed-Dependency>dozer-osgi</Embed-Dependency>

Whit dozer-osgi добавлено, что вещи начинают становиться лучше и сложнее одновременно.Кажется, что теперь он загружает Dozer, но начинает жаловаться на транзитивные зависимости:

android.dalvik -- Cannot be resolved
dalvik.system -- Cannot be resolved
javassist.util.proxy -- Cannot be resolved
org.apache.commons.beanutils,version=[1.9,2) -- Cannot be resolved
org.apache.commons.beanutils.converters,version=[1.9,2) -- Cannot be resolved

Утилиты beanutils легко исправить.Мне просто нужно добавить относящиеся зависимости как это:

    <dependency>
        <groupId>commons-beanutils</groupId>
        <artifactId>commons-beanutils</artifactId>
        <version>1.9.2</version>
    </dependency>

и добавить здесь "commons-beanutils":

<Embed-Dependency>dozer-osgi,commons-beanutils</Embed-Dependency>

Теперь он жалуется на:

android.dalvik -- Cannot be resolved
dalvik.system -- Cannot be resolved
javassist.util.proxy -- Cannot be resolved
org.hibernate.proxy -- Cannot be resolved

Ошибка зависимости гибернации является новой.Я думал, что beanutils зависит от hibernate, но не зависит ли Dozer от него.

Я пытался добавить hibernate, например:

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>3.6.9.Final</version>
    </dependency>


<Embed-Dependency>dozer-osgi,commons-beanutils,hibernate-core</Embed-Dependency>

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

<Embed-Dependency>dozer-osgi</Embed-Dependency>
<Embed-Transitive>true</Embed-Transitive>

Результат:

android.dalvik -- Cannot be resolved
dalvik.system -- Cannot be resolved
javassist.util.proxy -- Cannot be resolved
org.hibernate.proxy -- Cannot be resolved
org.apache.commons.beanutils -- Cannot be resolved
org.apache.commons.beanutils.converters -- Cannot be resolved

Это как если бы Embed-Transitive неработать вообще.

Каков наилучший способ работы со сторонними библиотеками при использовании Maven и AEM?В моем случае Maven использует для установки пакетов в моем экземпляре AEM.

1 Ответ

1 голос
/ 10 мая 2019

В OSGi вы должны различать сборку и время выполнения.Во время сборки ваш первоначальный подход был полностью в порядке.

Вы используете dozer, а maven-bundle-plugin создает подходящие операторы Import-Package.Вы можете проверить это, заглянув в Манифест банки.Правила для импорта пакетов приводят к диапазону версий, которые должны работать с вашим кодом.Таким образом, [5.5,6) является точно ожидаемым диапазоном импорта.

Теперь для выполнения.Здесь вы должны предоставить все зависимости вашего кода (включая транзитивные) в виде пакетов в AEM (или, в более общем случае, во время выполнения OSGi).Так что вам также необходимо установить Dozer OSGi в комплекте.Если это снова подает жалобу, то вам также нужно установить его зависимости.

Это подход по умолчанию, и обычно он вполне подходит.

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

Имейте в виду, что это не легко.Если ваш код использует некоторые из встроенных классов в своем собственном API, то вы сталкиваетесь с множеством проблем с встраиванием.Поэтому, если вы не очень опытны, тогда лучше пойти по пути установки всех зависимостей в виде пакетов.

Чтобы упростить процесс установки, вы можете создать пакет содержимого, содержащий все необходимые пакеты.

Вы также должны проверить, что все зависимости на самом деле являются пакетами.В некоторых случаях нормальные зависимости maven не подходят.В этом случае взгляните на пакеты Apache Servicemix.Это проект, который создает пакеты OSGi для популярных зависимостей и развертывает их в maven central.

...