Интеграция Cloudinary с Adobe AEM - PullRequest
2 голосов
/ 09 января 2020

Я пытаюсь интегрировать Adobe AEM 6.3 (работает на Java 1.8) с Cloudinary SDK . Я сделал следующее, но продолжаю использовать исключение, которое я не могу разрешить. Кто-нибудь интегрировал Cloudinary с AEM и сталкивался с подобными проблемами?

  1. Добавьте зависимость в pom.xml для компиляции кода.
<dependency>
  <groupId>com.cloudinary</groupId>
  <artifactId>cloudinary-core</artifactId>
  <version>1.24.0</version>  
</dependency>  
<dependency>
  <groupId>com.cloudinary</groupId>
  <artifactId>cloudinary-http44</artifactId>
  <version>1.24.0</version>         
</dependency>

Создайте плагин OSGI, чтобы AEM получал нужные файлы JAR. Для этого я следовал инструкциям для создания стороннего RESTful-сервиса . Чтобы собрать пакет, мне пришлось явно загрузить следующие jar-файлы: cloudinary-1.0.14.jar, cloudinary-core-1.21.0.jar, cloudinary-http44-1.21.0.jar, commons-codec-1.10.jar, commons-collections-3.2.2.jar, commons-lang3-3.1.jar, commons-logging-1.2.jar, httpclient-4.4.jar, httpmime-4.4.jar, jsp-api-2.0.jar

Несмотря на создание пакета с httpclient, я получаю следующее исключение при попытке загрузить изображение в Cloudinary. Вот код и исключение.

Фрагмент кода

import com.cloudinary.*;
..
Cloudinary cloudinary = new Cloudinary("<<credentials>>");
...

File toUpload = new File("/Users/akshayranganath/Downloads/background-2633962_1280.jpg");

try {
  Map uploadResult = cloudinary.uploader().upload(toUpload, ObjectUtils.emptyMap());
} catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
}

Исключение

Caused by: java.lang.NoClassDefFoundError: javax/net/ssl/HostnameVerifier
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
    at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.defineClass(BundleWiringImpl.java:2370)
    at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.findClass(BundleWiringImpl.java:2154)
    at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1542)
    at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:79)
    at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:2018)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
    at org.apache.http.impl.conn.SchemeRegistryFactory.createDefault(SchemeRegistryFactory.java:52)
    at org.apache.http.impl.client.AbstractHttpClient.createClientConnectionManager(AbstractHttpClient.java:321)
    at org.apache.http.impl.client.AbstractHttpClient.getConnectionManager(AbstractHttpClient.java:484)
    at org.apache.http.impl.client.AbstractHttpClient.createHttpContext(AbstractHttpClient.java:301)
    at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:818)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:55)
    at com.cloudinary.Uploader.callApi(Uploader.java:317)
    at com.cloudinary.Uploader.upload(Uploader.java:57)
    at com.aem.community.core.models.HelloWorldModel.init(HelloWorldModel.java:59)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.sling.models.impl.ModelAdapterFactory.invokePostConstruct(ModelAdapterFactory.java:792)
    at org.apache.sling.models.impl.ModelAdapterFactory.createObject(ModelAdapterFactory.java:607)
    ... 211 common frames omitted
Caused by: java.lang.ClassNotFoundException: javax.net.ssl.HostnameVerifier not found by MyBundle [550]
    at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1574)
    at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:79)
    at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:2018)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
    ... 236 common frames omitted

Это первый раз, когда я работаю с AEM, и, возможно, я не следую правильным шагам. Пожалуйста, дайте мне знать, если кому-то удалось обойти эту проблему.

Обновление

На основе предложения Александра и указателя из другого источника я добавил следующий код к родителю pom.xml файл.

<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <version>3.5.0</version>
    <configuration>
        <instructions>
        <Embed-Dependency>*;scope=compile|runtime</Embed-Dependency>
        <Embed-Directory>OSGI-INF/lib</Embed-Directory>
        <Embed-Transitive>true</Embed-Transitive>
        </instructions>
    </configuration>
</plugin>

После внесения этого изменения в пакет добавлялись облачные библиотеки. Вот вывод из AEM: http://localhost: 4502 / system / console / bundles

Embedded-Artifacts: OSGI-INF/lib/cloudinary-http44-1.21.0.jar; g="com.cloudinary"; a="cloudinary-http44"; v="1.21.0", OSGI-INF/lib/commons-lang3-3.1.jar; g="org.apache.commons"; a="commons-lang3"; v="3.1", OSGI-INF/lib/httpclient-4.4.jar; g="org.apache.httpcomponents"; a="httpclient"; v="4.4", OSGI-INF/lib/httpcore-4.4.jar; g="org.apache.httpcomponents"; a="httpcore"; v="4.4", OSGI-INF/lib/commons-logging-1.2.jar; g="commons-logging"; a="commons-logging"; v="1.2", OSGI-INF/lib/commons-codec-1.9.jar; g="commons-codec"; a="commons-codec"; v="1.9", OSGI-INF/lib/httpmime-4.4.jar; g="org.apache.httpcomponents"; a="httpmime"; v="4.4", OSGI-INF/lib/cloudinary-core-1.21.0.jar; g="com.cloudinary"; a="cloudinary-core"; v="1.21.0"

Однако теперь я получаю сообщение об ошибке:

org.apache.avalon.framework.logger -- Cannot be resolved
org.apache.log -- Cannot be resolved

Я могу устранить ошибку org.apache.avalon.framework.logger, добавив зависимость Avalon framework . Но я не могу справиться с проблемой org.apache.log. Похоже, что существует конфликт версий, который вызывает проблему.

Эта новая ошибка начинается, когда я включаю Cloudinary http44 библиотеку . Эта библиотека не имеет прямой ссылки на ведение журнала (см. здесь для зависимостей). Из-за этой ошибки приложение по-прежнему не может go из Установлено в Активно состояние.

1 Ответ

1 голос
/ 10 января 2020

Cloudinary-libs доступны как артефакты Maven. Такие JAR-файлы могут быть помещены в ваш пакет как частные библиотеки с помощью maven-bundle-plugin .

. Следующий пример работает для меня (даже с тестовой учетной записью Cloudinary)

...
<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <extensions>true</extensions>
    <executions>
        <execution>
            <!-- Create the bundle late in the compile-phase instead of the package-phase.
                 So the generated OSGi meta-data is available during JUnit tests. -->
            <id>run-before-tests</id>
            <phase>process-classes</phase>
            <goals>
                <goal>bundle</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <instructions>
            <Bundle-Name>Test Bundle</Bundle-Name>
            <Embed-Dependency>*;groupId=com.cloudinary;scope=compile|runtime</Embed-Dependency>
            <Embed-Directory>OSGI-INF/lib</Embed-Directory> <!-- not needed, but nice -->
            <Embed-Transitive>true</Embed-Transitive>
        </instructions>
    </configuration>
</plugin>
...

<dependencies>
    <dependency>
        <groupId>com.cloudinary</groupId>
        <artifactId>cloudinary-core</artifactId>
        <version>1.24.0</version>
    </dependency>
    <dependency>
        <groupId>com.cloudinary</groupId>
        <artifactId>cloudinary-http44</artifactId>
        <version>1.24.0</version>
    </dependency>
    ...

В общем случае встраивание внешней библиотеки может быть от простого, громоздкого до невозможного. Это зависит от зависимостей импортированных артефактов.

Проверьте дерево зависимостей вручную! (например, https://mvnrepository.com/)

Вы должны поиграть с 3 инструкциями:

Embed-Dependency

Это библиотеки, которые поставляются в вашем комплекте. Будьте осторожны с оператором звездочки, иначе вы можете включить слишком много зависимостей (в случае AEM - просто половина целого числа rnet). Но не включайте тоже меньше! Извлеките встроенный bundle.jar, чтобы увидеть, что на самом деле включено (в случае облачного хранилища это было легко).

Import-Package

Часто у библиотек тоже есть путь много зависимостей, особенно если библиотеки приходят в другую экосистему (например, контейнеры Spring или JEE) или имеют много необязательных зависимостей. С помощью этого параметра вы можете указать OSGi, что пакет можно активировать, даже если некоторые зависимости недоступны.

Это пример из реальной жизни:

<Import-Package>
    !com.sun.msv.*,
    !org.apache.log4j.jmx.*,
    !sun.misc.*,
    !org.jboss.logging.*,
    !org.apache.zookeeper.*,
    *
</Import-Package>

Export- Пакет

Обычно библиотека должна быть частной. Но иногда приходится импортировать по-другому, или библиотека делает что-то автоматически. Поэтому вы всегда должны проверять в системной консоли, что экспортирует ваш пакет. В случае, если это неверно, вы должны вручную поиграть с этим параметром:

Вот пример:

<Export-Package>
    !*.internal,
    !*.internal.*,
    !*.impl,
    !*.impl.*,
    com.mycompany.myproject.mybundle.*
</Export-Package>

По умолчанию все пакеты * экспортируются, кроме именованных impl или internal. Также их дочерние пакеты являются частными (правило !*.impl.*). Если значение по умолчанию не работает, экспортируйте с этой инструкцией только то, что вам нужно.

Все, что вы экспортируете, отправляется в глобальное пространство OSGi. Так как комплекты AEM и Sling-Bund не идеальны и не на 100% без ошибок, пожалуйста, убедитесь, что

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

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

Так что лучше всего НЕ экспортировать что-либо, импортированное каким-либо готовым комплектом AEM. Все остальное только для экспертов. И даже они переоценивают себя и недооценивают долгосрочные затраты на исправление AEM вручную.

PS: инструкция _removeheaders может удалить все osgi-инструкции, которые не нужны для выполнения. Но делайте это только в том случае, если вы хотите предоставить пакет для публикации c и сделать его полностью блестящим. Я бы оставил это как документацию.

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