代码在远程机器上列出jndi中的所有条目

任何人都可以告诉我或者指示我编码来列出远程机器上的所有jndi条目

可以列出InitialContext的所有条目。 你可以使用这个片段:

InitialContext ctx = new InitialContext(); NamingEnumeration<NameClassPair> list = ctx.list(""); while (list.hasMore()) { System.out.println(list.next().getName()); } 

如果您正在使用应用程序服务器,则通常可以select浏览JNDI树。

我知道,从最后一个答案有很多时间,但我需要列出上下文(tomee上下文)中可用的所有jdbc数据源。

就我而言,我需要的不仅仅是list("") (不幸的是,这对我来说并不起作用)来实现我的目标。 我在这里find了一个命名环境列表:

J2EE应用程序组件的命名环境

有了这个,我使用下一个代码片段获得了所有可用的jdbc资源

 InitialContext ctx = new InitialContext(); NamingEnumeration<NameClassPair> list = ctx.list("java:comp/env/jdbc"); while (list.hasMore()) { System.out.println(list.next().getName()); } 

就这样。

我希望这可以帮助别人,帮助我。

以前的答案并没有给我“完整的图片”(在Tomcat7上),所以我把下面的合并,它将JNDI值转换为树图(带有toString值):

 import javax.naming.*; ... public static Map toMap(Context ctx) throws NamingException { String namespace = ctx instanceof InitialContext ? ctx.getNameInNamespace() : ""; HashMap<String, Object> map = new HashMap<String, Object>(); log.info("> Listing namespace: " + namespace); NamingEnumeration<NameClassPair> list = ctx.list(namespace); while (list.hasMoreElements()) { NameClassPair next = list.next(); String name = next.getName(); String jndiPath = namespace + name; Object lookup; try { log.info("> Looking up name: " + jndiPath); Object tmp = ctx.lookup(jndiPath); if (tmp instanceof Context) { lookup = toMap((Context) tmp); } else { lookup = tmp.toString(); } } catch (Throwable t) { lookup = t.getMessage(); } map.put(name, lookup); } return map; } 

用法:

 toMap(new InitialContext()); 

在Tomcat7中提供以下输出:

 { "comp": { "env": { "myCustomVar": "foobar" }, "UserTransaction": "Cannot create resource instance", "Resources": { "index.html": "org.apache.naming.resources.FileDirContext$FileResource@32edeea8", "WEB-INF": { "ibm-web-ext.xml": "org.apache.naming.resources.FileDirContext$FileResource@6132b73b", "ibm-web-bnd.xml": "org.apache.naming.resources.FileDirContext$FileResource@22cf71b7" } } } }