Java JNDI 名称 java:/

Java JNDI Name java:/

我正在学习教程:https://docs.oracle.com/javase/tutorial/jndi/index.html

我的冒险之旅始于使用 WildFly 应用程序服务器为数据源设置 JNDI 名称。名称以 "java:/" 开头。我很好奇它是什么以及它是如何工作的。

我在本地设置了 Apache 目录 LDAP 服务器,我可以通过以下方式连接到它:

Hashtable<String, Object> env = new Hashtable<String, Object>();
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.PROVIDER_URL, "ldap://localhost:10389/o=JNDITutorial");
    env.put(Context.SECURITY_PRINCIPAL, "uid=admin,ou=system");
    env.put(Context.SECURITY_CREDENTIALS, "secret");

    try {
        Context ctx = new InitialContext(env);
        Object obj = ctx.lookup("cn=Rosanna Lee,ou=People");
    } catch (NamingException e) {
        e.printStackTrace();
    }

我的困惑是 JNDI 名称 "java:/"。

谁能解释一下 "java:/" 是什么以及我如何使用 JNDI 与之交互?

我假设它是位于我计算机某处的目录。

谢谢。

名称中的解释是:JNDI 是"Java Naming and Directory Interface"。它是 Java EE 规范的一部分,并为 java 客户端提供 API 以按名称发现和查找数据和对象。这些对象可以通过某些上下文访问,例如

The names of system-provided objects, such as JTA UserTransaction objects, are stored in the environment naming context java:comp/env. The Java EE platform allows a component to name user-defined objects, such as enterprise beans, environment entries, JDBC DataSource objects, and message connections. An object should be named within a subcontext of the naming environment according to the type of the object. For example, enterprise beans are named within the subcontext java:comp/env/ejb, and JDBC DataSource references are named within the subcontext java:comp/env/jdbc.

参考:http://docs.oracle.com/cd/E19798-01/821-1841/girdr/index.html

正如 Pawel 在他的评论中指出的那样,Wildfly 文档在这里非常有用:

Java EE 平台规范定义了以下 JNDI 上下文:

  • java:comp - 命名空间的范围限定为当前组件(即 EJB)
  • java:module - 作用域为当前模块
  • java:app - 作用于当前应用程序
  • java:global - 作用域为应用程序服务器

除了标准的命名空间,WildFly还提供以下两种全局命名空间:

  • java:jboss
  • java:/

所以 "java:/" 只是 Wildfly 中的全局命名空间(和上下文),应该与文件夹混淆。它只是目录中的一个 "named address",用于访问对象和服务,如 JDBC、EJB、LDAP 等

有关详细信息,Java EE 规范很有用: