В главе 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.
Частичная трассировка стека:
javax.naming.NoInitialContextException: The calling code's 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)
Вопрос. Это правильное поведение или есть раздел спецификации, на который я могу сослаться и который нарушает это ограничение?