2016-05-24 2 views
0

Я хотел бы, чтобы мой пакет был либо конфигурирован с помощью свойств системы, либо через OSGi Compendium Config Admin.Как создать рабочий пакет OSGi с дополнительным разрешением пакета?

Я компилирую свой пакет против пакета org.osgi:osgi.cmpn:6.0.0, который как made clear in the OSGi Alliance blog предназначен для использования только во время компиляции, с инфраструктурой, обеспечивающей фактические реализации во время выполнения.

Мой код, очевидно, должен использовать пакет ConfigAdmin (для обработки случая, в котором присутствует служба ConfigAdmin) ... что означает, что если среда выполнения не экспортирует пакет ConfigAdmin, мой пакет не будет исправляться должным образом.

Но я хотел, чтобы это разрешение будет необязательным ... поэтому я добавил это в манифесте:

org.osgi.service.cm;resolution:=optional;version="[1.5,2)" 

Теперь связка будет решать, но будет врезаться во время выполнения с java.lang.NoClassDefFoundError: org/osgi/service/cm/ManagedService, даже если пользователь не будет на самом деле используйте ConfigAdmin для настройки. Таким образом, это заставляет пользователя устанавливать пакет config-admin только для того, чтобы сделать мой пакет.

Я думаю, секрет заключается в том, чтобы не создавать экземпляры каких-либо классов, которые заставляют JVM загружать класс, который использует пакет org.osgi.service.cm ... но я не вижу, как я могу достичь этого без уродливых хаков с отражением ...

Кто-нибудь знает, как я могу проверить, доступен ли пакет во время выполнения, а если нет, во время выполнения избегайте java.lang.NoClassDefFoundError, что делает эту зависимость посылки действительно необязательной?

ответ

0

ПакетAdmin может использоваться для проверки метаданных пакета системы. Он устарел, и вместо этого вы должны использовать BundleWiring. Итак, у вас есть зависимость от PackageAdmin/BundleWiring и проверьте, экспортирован ли пакет cm ...

+0

PackageAdmin устарел. Вместо этого используйте BundleWiring. –

+0

Принимая этот ответ, потому что он отвечает на то, что было задано, хотя теперь я узнал, что мне действительно не нужно это делать, поскольку ConfigAdmin не нужно настраивать службу в DS ... Я просто не очень хорошо разбирался в DS. .. ну ладно, спасибо, ребята, что нашли время, чтобы помочь. – Renato

+1

@ Renato Downvoting, потому что этот ответ просто неправильный! WireAdmin - совершенно другая спецификация, которая здесь не имеет отношения. Ответ BJ правильный, вы должны принять его вместо этого. –

1

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

+0

Это невозможно, если я использую Declarative Services для экспорта сервиса, поскольку сама служба должна реализовать 'ManagedService 'для получения конфигурации из ConfigAdmin. Поэтому я предполагаю, что вы предлагаете мне вручную попытаться зарегистрировать «ManagedService», и если это выдает «NoClassDefFoundError», попробуйте зарегистрировать другое? Это довольно уродливо :( – Renato

+0

Использование дополнительных пакетов сложно, потому что вы хотите, чтобы код работал, когда отсутствует дополнительный пакет. Но если вы используете DS, почему вообще вы регистрируете ManagedService? DS будет обрабатывать взаимодействие с Config Admin для ваш компонент. –

+0

извините? Вы говорите, что мне не нужно реализовывать ManagedService в моей службе при использовании Declarative Services? – Renato

Смежные вопросы