java.util.ServiceConfigurationError Provider не является подтипом при использовании пакета OSGi - PullRequest
0 голосов
/ 04 февраля 2019

Я создаю комплект Liferay 7.1 OSGi, в котором есть некоторые внешние зависимости.Из соображений времени мы решили добавить внешний JAR-файл в наш OSGi Bundle.Мне удалось создать файл 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 относится к классуasticsearch-x-content-6.5.0.jar, классу XContentElasticsearchExtension, включен вasticsearch-6.5.0.jar, оба являются включенными ресурсами и помещены в путь к классам.

Метод Activate инициализирует TransportClient в моем другом банке, следовательно, это происходит при активации;).

Редактировать:

Я заметил, что эта ошибка НЕ ​​возникаетпри первой установке или при перезапуске портала.Так что это происходит только когда я удаляю и переустанавливаю пакет.(Это функциональность, которую я действительно предпочитаю!).Может быть, глупая мысль ... Но может ли быть какая-то «висящая нить»?Что пакет не установлен правильно или что TransportClient все еще жив?Я проверяю это.Любые советы приветствуются!

Редактировать 2:

Боюсь, что это несовместимость между SPI и OSGi?Я проверил: клиент высокого уровня отдыха имеет ту же проблему.(Но потом с другим расширением).Я собираюсь попробовать Low-Level Rest Client.Это должно работать, так как, я думаю, есть минимальные зависимости.Мне все еще очень любопытно, почему существует несовместимость.Я, конечно, не эксперт по OSGi и SPI.(Время изучать новые вещи!)

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

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

Рассмотрение симптомов: это не происходитпри загрузке или перезапуске.Также это не подтип.

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

Выставляйте только необходимое, чтобы минимизировать последствия этого.Импортировать только если необходимо импортировать.Если вы используете конфигурацию Liferay Gradle, чтобы включить пакет внутри, остановитесь - это ужасный способ включить, так как он много раскрывает.Если вы используете файл bnd для включения ресурса и создания записи для местоположения дополнительного пути к классам, не открывайте его, если в этом нет необходимости.Если у вас есть несколько пакетов, использующих один в качестве зависимости, убедитесь в том, что они используют версию и если объекты обмена из проблемного класса, если они это делают, требуют особого внимания.

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

0 голосов
/ 07 февраля 2019

Вы можете иметь 2 эластичных поисковых соединения внутри одного Java-приложения, и Liferay по умолчанию не раскрывает соединение, которое оно удерживает.

Обойти это можно, восстановив разъем Liferay ES.Это не имеет большого значения, потому что вам не нужно изменять код только дескриптора OSGi, чтобы предоставить больше сервисов.

Я сделал это в одном проекте POC и работал нормально.Хитрость заключается в том, чтобы перестроить банку Liferay, но Петри объяснил это своим поисковым постом в Google.https://community.liferay.com/blogs/-/blogs/creating-a-google-like-search (это серия, но отчасти трудно ориентироваться в новых блогах Liferay, но Google, вероятно, поможет). В любом случае, здесь все хорошо документировано.нужно добавить org.elasticsearch.* в файл bnd.bnd в разделе экспорта.После этого вы сможете работать с собственным эластичным API.

...