Jakarta ee 作为Eclipse插件运行独立的Glassfish v3客户端
我正在开发一个独立的客户端,它在GlassFishV3上调用一些EJB方法。在我将客户机集成到Eclipse插件中以在我们的RCP应用程序中运行之前,这一切都很好。在这个设置中,初始化命名上下文时似乎有一个类加载器问题,下面列出了一个异常。(客户端在其类路径上有gf-client.jar及其所有依赖项。) 它在上失败了Jakarta ee 作为Eclipse插件运行独立的Glassfish v3客户端,jakarta-ee,glassfish,client,glassfish-3,Jakarta Ee,Glassfish,Client,Glassfish 3,我正在开发一个独立的客户端,它在GlassFishV3上调用一些EJB方法。在我将客户机集成到Eclipse插件中以在我们的RCP应用程序中运行之前,这一切都很好。在这个设置中,初始化命名上下文时似乎有一个类加载器问题,下面列出了一个异常。(客户端在其类路径上有gf-client.jar及其所有依赖项。) 它在上失败了 m_ctx = new InitialContext(); 例外 java.lang.NoSuchMethodException: org.eclipse.osgi.inter
m_ctx = new InitialContext();
例外
java.lang.NoSuchMethodException: org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findResources(java.lang.String)
at java.lang.Class.getMethod(Class.java:1605)
at com.sun.enterprise.module.single.ManifestProxy.<init>(ManifestProxy.java:34)
at com.sun.enterprise.module.single.ProxyModuleDefinition.<init>(ProxyModuleDefinition.java:78)
at com.sun.enterprise.module.single.ProxyModuleDefinition.<init>(ProxyModuleDefinition.java:73)
at com.sun.enterprise.module.single.SingleModulesRegistry.<init>(SingleModulesRegistry.java:42)
at com.sun.enterprise.module.single.SingleModulesRegistry.<init>(SingleModulesRegistry.java:30)
at com.sun.enterprise.module.single.StaticModulesRegistry.<init>(StaticModulesRegistry.java:60)
at org.glassfish.internal.api.Globals.getStaticHabitat(Globals.java:67)
at com.sun.enterprise.naming.impl.SerialContext.<init>(SerialContext.java:183)
at com.sun.enterprise.naming.impl.SerialContext.<init>(SerialContext.java:253)
at com.sun.enterprise.naming.impl.SerialInitContextFactory.createInitialContext(SerialInitContextFactory.java:121)
at com.sun.enterprise.naming.impl.SerialInitContextFactory.getInitialContext(SerialInitContextFactory.java:116)
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:667)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
at javax.naming.InitialContext.init(InitialContext.java:223)
at javax.naming.InitialContext.<init>(InitialContext.java:175)
java.lang.NoSuchMethodException:org.eclipse.osgi.internal.baseAdapter.DefaultClassLoader.findResources(java.lang.String)
位于java.lang.Class.getMethod(Class.java:1605)
位于com.sun.enterprise.module.single.ManifestProxy.(ManifestProxy.java:34)
位于com.sun.enterprise.module.single.ProxyModuleDefinition.(ProxyModuleDefinition.java:78)
位于com.sun.enterprise.module.single.ProxyModuleDefinition。(ProxyModuleDefinition.java:73)
位于com.sun.enterprise.module.single.SingleModulesRegistry。(SingleModulesRegistry.java:42)
位于com.sun.enterprise.module.single.SingleModulesRegistry。(SingleModulesRegistry.java:30)
位于com.sun.enterprise.module.single.StaticModulesRegistry。(StaticModulesRegistry.java:60)
位于org.glassfish.internal.api.Globals.getStaticHabitation(Globals.java:67)
位于com.sun.enterprise.naming.impl.SerialContext.(SerialContext.java:183)
位于com.sun.enterprise.naming.impl.SerialContext.(SerialContext.java:253)
位于com.sun.enterprise.naming.impl.SerialInitContextFactory.createInitialContext(SerialInitContextFactory.java:121)
位于com.sun.enterprise.naming.impl.SerialInitContextFactory.getInitialContext(SerialInitContextFactory.java:116)
位于javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:667)
位于javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
位于javax.naming.InitialContext.init(InitialContext.java:223)
位于javax.naming.InitialContext。(InitialContext.java:175)
有人知道如何解决这个问题吗?我假设您使用了正确的上下文设置
1. Properties props=new Properties();
2. props.setProperty("java.naming.factory.initial","com.sun.enterprise.naming.SerialInitContextFactory");
3. props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
4. props.setProperty("org.omg.CORBA.ORBInitialPort","3700");
对该问题的进一步调查表明,Glassfishv3依赖于
java.lang.Classloader
的公共方法findResources(java.lang.String)
package com.sun.enterprise.module.single;
[...]
public class ManifestProxy extends Manifest {
[...]
public ManifestProxy(ClassLoader cl, List<SeparatorMappings> mappings) throws IOException {
try {
[...]
Method met = cl.getClass().getMethod("findResources", String.class);
Enumeration<URL> urls=null;
try {
met.setAccessible(true);
urls = (Enumeration<URL>) met.invoke(cl, JarFile.MANIFEST_NAME);
package com.sun.enterprise.module.single;
[...]
公共类ManifestProxy扩展了Manifest{
[...]
公共ManifestProxy(ClassLoader cl,列表映射)引发IOException{
试一试{
[...]
Method met=cl.getClass().getMethod(“findResources”,String.class);
枚举URL=null;
试一试{
met.setAccessible(true);
URL=(枚举)met.invoke(cl,JarFile.MANIFEST\u NAME);
但是此方法在Classloader类本身中受到保护。当作为独立java应用程序运行客户端时,将使用派生的Classloadersun.misc.Launcher$AppClassLoader
,它将覆盖此方法并将其声明为公共。
但是,当作为Eclipse插件运行时,classloaderorg.Eclipse.osgi.internal.baseadapter.DefaultClassLoader
不会覆盖findResource
-方法,该方法使它受到保护,并且不能被ManifestProxy类访问
解决这个问题的最佳方法是什么?如何为eclipse插件/osgi包设置特定的类加载器
谢谢!是的,属性设置正确。我的客户端在作为独立java应用程序运行时工作正常。就在eclipse插件上下文中发生了类加载器问题。我在JUnit中尝试初始化嵌入式Glassfish容器(通过Ant和NetBeans)时遇到了相同的错误。