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加上

解决方案 »

  1.   

    记得要把客户端的包全部放入,然后再按照qiyadeng(qiyadeng) 说的做,你的报错表示初始属性文件不对
      

  2.   

    我按qiyadeng(qiyadeng) 说的,把
     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
    这又是什么错误呢
      

  3.   

    1:
    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
      

  4.   

    把jboss/client/下的jar包都导到classpath下应该可以了。