В главе 126 в спецификации OSGI Enterprise Release 5 упоминается совместимость:
"Поддержка традиционной модели программирования JNDI, используемой клиентами Java SE и Java EE".
и использование OSGI-неосведомленного кода:
"Клиенты и поставщики контекста JNDI, которые не знают OSGi, используют статические методы для подключения к JRE JNDI. Класс InitialContext обеспечивает доступ к Контексту от поставщика и провайдеры используют статические методы NamingManager для преобразования объектов и поиска контекстов URL. Эта традиционная модель не знает OSGi и поэтому может быть использована только надежно, если последствия из-за этого отсутствия осведомленности OSGi".
но мне непонятно, относится ли этот текст к "устаревшему" коду, выполняемому внутри пакета OSGI, или также к коду вне контейнера OSGI, например, в сценарии, где контейнер OSGI встроен в приложение.
В сценарии внедрения может быть код приложения как снаружи, так и внутри контейнера OSGI, который выполняет вызовы JNDI, и, поскольку они выполняются в одной JVM, они будут совместно использовать реализацию JNDI.
Вопрос:. Если реализация OSGI JNDI, запущенная во встроенном контейнере OSGI, позволяет OSGI-неосведомленный код за пределами контейнера выполнять свои вызовы JNDI, как обычно, или какой-то портирование на "осведомленность OSGI" требуется
Пробовав это самостоятельно с Apache Karaf 2.3.0 (который использует Apache Aries JNDI 1.0.0), это, похоже, не работает, так как Apache Aries требует, чтобы клиентские вызовы JNDI происходили из пакета OSGI.
Частичная stacktrace:
javax.naming.NoInitialContextException: The calling code BundleContext could not be determined.
at org.apache.aries.jndi.OSGiInitialContextFactoryBuilder.getInitialContext(OSGiInitialContextFactoryBuilder.java:46)
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:684)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307)
at javax.naming.InitialContext.init(InitialContext.java:242)
at javax.naming.InitialContext.<init>(InitialContext.java:192)
Вопрос: Является ли это правильным поведением или есть раздел спецификации, на который я могу ссылаться, что нарушено этим ограничением?