把
Properties props=System.getProperties();
改为
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
props.put(Context.PROVIDER_URL,"localhost:1099");需要把jboss的client加上
Properties props=System.getProperties();
改为
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
props.put(Context.PROVIDER_URL,"localhost:1099");需要把jboss的client加上
Properties props=System.getProperties();
改为
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
props.put(Context.PROVIDER_URL,"localhost:1099");然后出现如下问题:Exception in thread "main" javax.naming.NoInitialContextException: Cannot instantiate class: org.jnp.interfaces.NamingContextFactory [Root exception is java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory]
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:657)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:247)
at javax.naming.InitialContext.init(InitialContext.java:223)
at javax.naming.InitialContext.<init>(InitialContext.java:197)
at com.ejb.HelloClient.main(HelloClient.java:22)
Caused by: java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:242)
at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:42)
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:654)
... 4 more
这又是什么错误呢
JNDI 可能需要如下参数:(都在 javax.naming.Context 中用常量表示的,忘记了名字可以看一下)
java.naming.factory.initial // 初始化 InitialContext 用的,
java.naming.factory.url.pkgs // 有时候需要这个,它是冒号分隔的,
比如进行 ctx.lookup("java:comp/env"); 时就需要它,
JNDI 会依次搜索 java.naming.factory.url.pkgs 中提到每一个包前缀,按照 包前缀 + url 协议 作为包名 , url协议+ContextFactory 作为类名 用这个类名尝试 初始化, 比如 java.naming.factory.url.pkgs=org.apache.naming:org.jnp.interfaces , 使用 java: 协议的话,就是 org.apache.naming.java.javaURLContextFactory 如果这个类没有找到,再找 org.jnp.interfaces.java.javaURLContextFactory ,依次进行查找 SPI 。
只要看看 tomcat 的 naming-factory.jar 中 类名和包结构就是这种惯例。2:进行参数配置:
如下是 com.sun.naming.internal.ResourceManager 代码中的常量定义,
private static final String PROVIDER_RESOURCE_FILE_NAME =
"jndiprovider.properties"; /*
* Name of application resource files.
*/
private static final String APP_RESOURCE_FILE_NAME = "jndi.properties"; /*
* Name of properties file in <java.home>/lib.
*/
private static final String JRELIB_PROPERTY_FILE_NAME = "jndi.properties"它是 jndi 初始化 InitialContext 用到的, 也就是说你的 jndi 配置可以以 $AppClassPath/jndi.properties , ${java.home}/lib/jndi.properties , 或者 $AppClassPath/jndiprovider.properties 文件形式提供,把他们放到正确的位置的话, new InitialContext() 时 API 知道自动查找,也会尝试 从 -Djava.naming.factory.initial 这些 System.getProperty(); 中查找。里面就是 类似如下内容(我的这个配置是用来连接 OpenLDAP 服务器的,看看 JBOSS Naming 使用哪个?): java.naming.factory.initial = com.sun.jndi.ldap.LdapCtxFactory
java.naming.factory.url.pkgs = com.sun.jndi.url:org.apache.naming
java.naming.provider.url = ldap://atreides.vicp.net:389/o=ncu.edu.cn
java.naming.security.authentication = simple
java.naming.security.principal = cn=nonadmin,o=ncu.edu.cn
java.naming.security.credentials = nopassword