InitialContext的OSGi和ClassNotFoundException

时间:2014-05-05 03:42:28

标签: java java-ee glassfish ejb osgi

OSGi客户端尝试连接到GF4。在maven中我添加了gf-client-module 4.我看到已经安装了bundle glassfish-naming-4.0.jar。

所以在Activator中我有。

ClassLoader thatLoader = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
try {
       Properties jndiProps = new Properties();
       jndiProps.put("java.naming.factory.initial", "com.sun.enterprise.naming.impl.SerialInitContextFactory");
       jndiProps.put("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");
       jndiProps.put("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
       jndiProps.setProperty("org.omg.CORBA.ORBInitialHost", "x.x.x.x");
       jndiProps.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
       InitialContext ctx = new InitialContext(jndiProps);
} finally {
Thread.currentThread().setContextClassLoader(thatLoader);
}

这就是我得到的

  

javax.naming.NoInitialContextException:无法实例化类:   com.sun.enterprise.naming.SerialInitContextFactory [根异常是   抛出java.lang.ClassNotFoundException:   com.sun.enterprise.naming.SerialInitContextFactory] ​​

如何修复? Bundle glassfish-naming-4.0.jar里面有Activator。我应该开始这个捆绑吗?我试过但得到了未解决的约束异常。

解决方案SerialInitContextFactory not found in glassfish naming没有帮助。

2 个答案:

答案 0 :(得分:2)

我找到了解决方案。据我所知,glassfish命名,gf-client-module和其他osgi包都是属于glassfish的包!如果我想使用gf-client,我必须这样做:

  

1)将as-install / lib / gf-client.jar文件复制到客户端计算机并   将它包含在客户端的类路径中。

     

gf-client.jar文件引用了GlassFish Server JAR文件   MANIFEST.MF文件。如果没有安装GlassFish Server   客户端计算机, 2)您还必须将as-install / modules目录复制到   客户端机器并维护其相对于的目录结构   as-install / lib / gf-client.jar文件。或者你可以使用   package-appclient脚本;请参阅使用package-appclient脚本。

这是http://docs.oracle.com/cd/E18930_01/html/821-2418/gkusn.html

答案 1 :(得分:0)

您需要使com.sun.enterprise.naming.SerialInitContextFactory可用于捆绑类加载器。确保在捆绑包的清单中有一个Import-Package:com.sun.enterprise.naming。

如果你使用maven bundle插件,它会自动找出大多数导入。在这种情况下,虽然该类仅作为String给出,因此它不会看到它。另一种方法是使用class.getName而不是String,如下所示:com.sun.enterprise.naming.impl.SerialInitContextFactory.class.getName()

顺便说一下。这同样适用于com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl