Naming (JNDI)

The Apache Karaf Naming (JNDI) is an optional enterprise feature.

You have to install the jndi feature first:

karaf@root()> feature:install jndi

Apache Karaf provides a complete JNDI support.

You have two parts in the Apache Karaf JNDI support:

  • a fully compliant implementation of the OSGi Alliance JNDI Service specification.

  • a more "regular" JNDI context, containing different names that you can administrate.

OSGi Services Registry and JNDI

The OSGi Service Registry provides a centralized register/query capabilities for OSGi services.

A common pattern outside of OSGi is to make use of JNDI API to access services from a directory system. The OSGi service registry can be viewed as an example of such a system.

Apache Karaf supports the osgi:service lookup scheme as defined by the JNDI Service Specification.

The schema is:

osgi:service/<interface>[/<filter>]

For instance, you can directly use JNDI to get a OSGi service:

Context ctx = new InitialContext();
Runnable r = (Runnable) ctx.lookup("osgi:service/java.lang.Runnable");
JNDI service

Apache Karaf also supports regular JNDI, including a directoy system where you can register name bindings, sub-context, etc.

It supports the standard JNDI API:

Context ctx = new InitialContext();
Runnable r = (Runnable) ctx.lookup("this/is/the/name");

It also allows you to bind some OSGi services as "pure" JNDI name. In that case, you don’t have to use the specific osgi:service scheme.

Commands

Apache Karaf provides specific commands to manipulate the JNDI service.

jndi:names

The jndi:names command lists all JNDI names. It groups both the JNDI names from the osgi:service scheme and the regular JNDI names:

karaf@root()> jndi:names
JNDI Name         | Class Name
------------------------------------------------------------------
osgi:service/jndi | org.apache.karaf.jndi.internal.JndiServiceImpl
jndi/service      | org.apache.karaf.jndi.internal.JndiServiceImpl

We can see here the osgi:service/jndi name (using the osgi:service scheme) and jndi/service name (using the regular JNDI service).

The jndi:names command accepts an optional context argument to list names on the given context.

For instance, you can list only names in the jndi sub-context:

karaf@root()> jndi:names jndi
JNDI Name | Class Name
----------------------------------------------------------
service   | org.apache.karaf.jndi.internal.JndiServiceImpl
Note

The jndi:names lists only names (the full qualified name). It means that the empty JNDI sub-contexts are not displayed. To display all JNDI sub-contexts (empty or not), you can use the jndi:contexts command.

jndi:contexts

The jndi:contexts command lists all JNDI sub-contexts:

karaf@root()> jndi:contexts
JNDI Sub-Context
----------------
other/context
foo/bar
jndi:create

The jndi:create command creates a new JNDI sub-context:

karaf@root()> jndi:create my/company
jndi:delete

The jndi:delete command deletes a JNDI sub-context:

karaf@root()> jndi:delete my/company
jndi:alias

The jndi:alias command creates a new JNDI name (alias) with an existing one.

The existing JNDI name can be a regular one:

karaf@root()> jndi:alias bean/services/jndi aliases/services/jndi
karaf@root()> jndi:names
JNDI Name             | Class Name
----------------------------------------------------------------------
osgi:service/jndi     | org.apache.karaf.jndi.internal.JndiServiceImpl
bean/services/jndi    | org.apache.karaf.jndi.internal.JndiServiceImpl
aliases/services/jndi | org.apache.karaf.jndi.internal.JndiServiceImpl

or a name from the osgi:service schema:

karaf@root()> jndi:alias osgi:service/jndi alias/jndi/service
karaf@root()> jndi:names
JNDI Name          | Class Name
-------------------------------------------------------------------
osgi:service/jndi  | org.apache.karaf.jndi.internal.JndiServiceImpl
alias/jndi/service | org.apache.karaf.jndi.internal.JndiServiceImpl
Note

The jndi:alias automatically creates all required JNDI sub-contexts.

jndi:bind

The jndi:bind command binds an OSGi service with a JNDI name.

The jndi:bind command requires an OSGi service ID and a JNDI name. The OSGi service ID can be found using the service:list command.

For instance, we can bind the OSGi service with ID 344 with the JNDI name services/kar:

karaf@root()> jndi:bind 344 services/kar
karaf@root()> jndi:names
JNDI Name         | Class Name
-------------------------------------------------------------------------------
osgi:service/jndi | org.apache.karaf.jndi.internal.JndiServiceImpl
services/kar      | org.apache.karaf.kar.internal.KarServiceImpl
jndi:unbind

The jndi:unbind command unbind a given JNDI name:

karaf@root()> jndi:names
JNDI Name         | Class Name
-------------------------------------------------------------------------------
osgi:service/jndi | org.apache.karaf.jndi.internal.JndiServiceImpl
services/kar      | org.apache.karaf.kar.internal.KarServiceImpl
karaf@root()> jndi:unbind services/kar
karaf@root()> jndi:names
JNDI Name         | Class Name
-------------------------------------------------------------------------------
osgi:service/jndi | org.apache.karaf.jndi.internal.JndiServiceImpl
Note

It’s not possible to unbind a name from the osgi:service schema, as it’s linked to a OSGi service.

JMX JndiMBean

The JMX JndiMBean provides the JNDI names, and the operations to manipulate the JNDI service.

The object name to use is org.apache.karaf:type=jndi,name=*.

Attributes

The Names attribute provides a map containing all JNDI names and class names from both osgi:service scheme and the regular JNDI service.

The Contexts attribute provides a list containing all JNDI sub-contexts.

Operations
  • getNames(context) provides a map containing JNDI names and class names in a given JNDI sub-context.

  • create(context) creates a new JNDI sub-context.

  • delete(context) deletes a JNDI sub-context.

  • alias(name, alias creates a JNDI name (alias) for a given one.

  • bind(serviceId, name binds a JNDI name using an OSGi service (identified by its ID).

  • unbind(name) unbinds a JNDI name.