Я хотел бы, чтобы мой пакет был либо конфигурирован с помощью свойств системы, либо через 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
, что делает эту зависимость посылки действительно необязательной?
PackageAdmin устарел. Вместо этого используйте BundleWiring. –
Принимая этот ответ, потому что он отвечает на то, что было задано, хотя теперь я узнал, что мне действительно не нужно это делать, поскольку ConfigAdmin не нужно настраивать службу в DS ... Я просто не очень хорошо разбирался в DS. .. ну ладно, спасибо, ребята, что нашли время, чтобы помочь. – Renato
@ Renato Downvoting, потому что этот ответ просто неправильный! WireAdmin - совершенно другая спецификация, которая здесь не имеет отношения. Ответ BJ правильный, вы должны принять его вместо этого. –