什么是 java:comp/env? [复制]

Posted

技术标签:

【中文标题】什么是 java:comp/env? [复制]【英文标题】:what is java:comp/env? [duplicate] 【发布时间】:2012-07-22 19:53:07 【问题描述】:

java:comp/env 是什么意思?

看起来像什么:

Context envContext = (Context)initContext.lookup("java:comp/env");

做吗?

我理解这样的查询:

(DataSource)envContext.lookup("jdbc/MyDatasource")

context.xmlweb.xml 中查找名称MyDatasource 以获取数据库的URL。 是这样吗? !! 但是前者的查找有什么作用呢?

【问题讨论】:

@Marko Topolnik 但这并不能回答我的问题。 请在投票前打开并阅读链接以关闭此问题。不要只看标题。 这对我来说确实像是一个答案。它是容器提供的根命名空间,供您在其中查找资源。 这对于试图从 Weblogic 迁移到 Tomcat 的人来说是一个很好的问题 【参考方案1】:

java:comp/env 是 JNDI 树中的节点,您可以在其中找到当前 Java EE 组件(Web 应用程序或 EJB)的属性。

Context envContext = (Context)initContext.lookup("java:comp/env");

允许定义一个直接指向该节点的变量。它允许做

SomeBean s = (SomeBean) envContext.lookup("ejb/someBean");
DataSource ds = (DataSource) envContext.lookup("jdbc/dataSource");

而不是

SomeBean s = (SomeBean) initContext.lookup("java:comp/env/ejb/someBean");
DataSource ds = (DataSource) initContext.lookup("java:comp/env/jdbc/dataSource");

相对路径而不是绝对路径。这就是它的用途。

【讨论】:

this 节点是什么意思? JNDI 树中会有很多节点。 我还是不明白 java:comp/env 到底是什么。 每个 JEE 组件(webapp、EJB)都可以定义该组件的本地属性。这些属性可通过java:comp/env 访问。例如,请参阅tomcat.apache.org/tomcat-7.0-doc/…。 EJB 也有类似的东西。【参考方案2】:

这是一个内存中的全局哈希表,您可以在其中按名称存储全局变量。

“java:” url 方案导致 JNDI 查找 javaURLContextFactory 类,该类通常由您的应用容器提供,例如here is Tomcat's implementation javadoc

另见NamingManager.getURLContext

【讨论】:

【参考方案3】:

我知道我来晚了,但我问了同样的问题,我想我得到了一些答案。所以,如果我可以投入我的两分钱。

java:comp/env/jdbc/myDataSource

java: 就像来自连接字符串的jdbc:。充当协议。 comp 是所有 JNDI 上下文的根。 env 是所有相关资源的子上下文。用户还有另一个。签出this。 jdbc 是 jdbc 资源的子上下文。有种类。检查上一个项目符号中的链接。 myDataSource 是您的 jdbc 资源的名称。

【讨论】:

这应该是公认的答案 - 解释清楚。 @joker:您从 Sun Java System Application Server 共享的链接对于理解 JNDI 中的术语非常有用。我在设置它时几乎无法在 tomcat 文档中找到它,因为它在那里从未解释过太多。我在 Sun 链接中也找到了管理指南,它清除了整个画面。谢谢。

以上是关于什么是 java:comp/env? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 java:comp/env 中设置属性?

JNDI中 java:comp/env 的理解

服务器找不到 java:comp/env/jdbc/my_db 数据源...在上下文“java:”中找不到名称 comp/env/jdbc

JavaWeb_JDBC连接池

详解JNDI的lookup资源引用 java:/comp/env

在 Wildfly 中显示 ENC (java:comp/env/) 下的所有 JNDI 名称