Я создаю пакет OSGi Liferay 7.1, в котором есть некоторые внешние зависимости. Учитывая время, мы решили встроить внешний JAR в наш пакет OSGi. Мне удалось создать файл bnd, который включает все зависимости ElasticSearch, и поместить их в путь к классам пакета. Я использовал исходный код с github (https://github.com/liferay/liferay-portal/blob/master/modules/apps/portal-search-elasticsearch6/portal-search-elasticsearch6-impl/build.gradle) и файл bnd.bnd, чтобы проверить, что импортируется.
При активации пакета выбрасывается исключение:
The activate method has thrown an exception
java.util.ServiceConfigurationError: org.elasticsearch.common.xcontent.XContentBuilderExtension: Provider org.elasticsearch.common.xcontent.XContentElasticsearchExtension not a subtype
at java.util.ServiceLoader.fail(ServiceLoader.java:239)
at java.util.ServiceLoader.access$300(ServiceLoader.java:185)
at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:376)
at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
at org.elasticsearch.common.xcontent.XContentBuilder.<clinit>(XContentBuilder.java:118)
at org.elasticsearch.common.settings.Setting.arrayToParsableString(Setting.java:1257)
XContentBuilderExtension взят из elasticsearch-x-content-6.5.0.jar, класс XContentElasticsearchExtension включен в elasticsearch-6.5.0.jar. Оба являются включенными ресурсами и помещены в путь к классам.
Метод Activate инициализирует TransportClient в другой моей банке, следовательно, это происходит при активации;).
Редактировать:
Я заметил, что эта ошибка НЕ возникает при первой установке или при перезапуске портала. Так что это происходит только тогда, когда я удаляю и переустанавливаю пакет. (Это функциональность, которую я действительно предпочитаю!). Может быть, глупая мысль.. Но может быть, есть какая-то «висящая нить»? Что пакет установлен неправильно или что TransportClient все еще жив? Я проверяю это. Любые подсказки приветствуются!
Редактировать 2:
Я боюсь, что это несовместимость между SPI и OSGi? Я проверил: у клиента отдыха высокого уровня такая же проблема. (Но тогда с другим расширением). Я собираюсь попробовать низкоуровневый клиент отдыха. Это должно работать, так как я предполагаю, что есть минимальные зависимости. Мне все еще очень любопытно, почему существует несовместимость. Я, конечно, не эксперт ни в OSGi, ни в SPI. (Время учиться новому!)