jboss或其它javaee服务器的jndi名称空间分为几大类:  
1.全局(本机或其它机器都可通过网络访问这个名称空间里面的东东,对命名没有要求);  
2.本jvm能访问的(以java:/开头,只能在同一个jvm内访问);  
3.java:/cmp(只能在本组件内部访问,比如发布此jndi资源的本web程序内部) 上述分类是我google了很多资源后对常用服务器的jndi分类的一个理解。(不知是否正确),为了验证我的理解,我在jboss里面同时部署了2个web应用a.war,b.war,在这2个web应用里面使用同样的代码列出jndi树,代码如下:  
Enumeration i1 = new InitialContext().listBindings(""); // Global namespace Enumeration i2 =new InitialContext().listBindings("java:/"); // java namespace (same VM only)  
Enumeration i3 =new InitialContext().listBindings("java:/comp"); // Component names  
Enumeration i4 =new InitialContext().listBindings("java:/comp/env"); // ENC  logger.info("global context ");  
for (; i1.hasMoreElements();)  
logger.info(i1.nextElement());  logger.info("context java:/");  
for (; i2.hasMoreElements();)  
logger.info(i2.nextElement());  logger.info("context java:/comp/");  
for (; i3.hasMoreElements();)  
logger.info(i3.nextElement());  logger.info("context java:/comp/env/");  
for (; i4.hasMoreElements();)  
logger.info(i4.nextElement());  
通过比较a.war和b.war 打印出的日志,我发现二者打印出的全局名称空间包含的内容是一致的,Java:/这个名称空间的内容是一致的。a.war的java:/comp内容如下:  
UserTransaction: javax.naming.LinkRef:Reference Class Name: javax.naming.LinkRef  
Type: LinkAddress  
Content: UserTransaction 2007-09-28 15:50:53,440 INFO [attachweb] env: org.jnp.interfaces.NamingContext:org.jnp.interfaces.NamingContext@7e942f b.war的java:/comp内容如下:  
UserTransaction: javax.naming.LinkRef:Reference Class Name: javax.naming.LinkRef  
Type: LinkAddress  
Content: UserTransaction 2007-09-28 15:51:25,368 INFO [syn_cen] env: org.jnp.interfaces.NamingContext:org.jnp.interfaces.NamingContext@626028 发现分别从a.war,b.war中访问并列出java:/comp的内容是不同的。我发现的矛盾是:在整个jndi空间内,a.war,b.war的java:/comp是同一个吗?至少它们都属于java:/这个父亲空间,而同一个父亲空间(这里是java:/)怎么可能包括2个同名的java:/comp子空间呢?如果a.war,b.war的java:/comp是同一个,为何打印出来的内容又不一样? 在应用服务器的jndi空间里,java:/comp是组件(包括web,ejb)的私有空间,是为了起到隔离各组件名称空间的作用,只要是在各组件私有空间绑定的资源,即使名字和其它组件私有空间的名称相同也不会引起冲突。那么从a.war,b.war里面lookup ("java:/comp")的时候,jndi服务器怎样区分呢属于不同组件的java:/comp呢?jndi树到底是怎样组织的?