2010-01-22 5 views
2

GlassFish v3에서 일부 EJB 메소드를 호출하는 독립 실행 형 클라이언트를 개발 중입니다. 이것은 RCP 애플리케이션에서 실행하기 위해 클라이언트를 Eclipse 플러그인에 통합 할 때까지 잘 작동합니다. 이 설정에서는 명명 컨텍스트를 초기화 할 때 클래스 로더 문제가있는 것으로 보이며 아래에 예외가 생깁니다. (클라이언트는. GF-client.jar가 그 클래스 경로에 모든 종속성이)독립 실행 형 Glassfish v3 클라이언트를 Eclipse 플러그인으로 실행

은 제외

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) 

는이 문제를 해결하는 방법을 생각을 사람을 가지고 문제?

+0

Ant 및 NetBeans를 통해 JUnit에 포함 된 Glassfish 컨테이너를 초기화 할 때 동일한 오류가 발생합니다. –

답변

0

적절한 컨텍스트 설정을 사용하고 있다고 가정합니까? 문제

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"); 
+1

예, 속성이 올바르게 설정되었습니다. 내 클라이언트는 독립형 Java 응용 프로그램으로 실행할 때 완벽하게 작동합니다. 이클립스 플러그인 컨텍스트에서 클래스 로더 문제가 발생합니다. – dmt

2

추가 조사는 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); 

그러나이 메서드는 Classloader 클래스 자체에서 보호됩니다. 클라이언트를 독립 실행 형 Java 응용 프로그램으로 실행하면이 메서드를 재정 의하여 public으로 선언 한 파생 클래스 로더 sun.misc.Launcher$AppClassLoader이 사용됩니다. 그러나 이클립스 플러그인으로 실행하면 클래스 로더 org.eclipse.osgi.internal.baseadaptor.DefaultClassLoaderfindResource - ManifestProxy 클래스로 보호되고 액세스 할 수없는 메소드를 덮어 쓰지 않습니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까? Eclipse 플러그인/osgi 번들에 대해 특정 클래스 로더를 어떻게 설정할 수 있습니까?

감사합니다.

관련 문제