2011-09-19 4 views
5

Eclipse에서 번들을 만들고 "개요"탭에 "프레임 워크 시작"링크를 사용했습니다. 내 번들에서 인터페이스 (TestService)를 만들고 헬퍼에서 프록시를 생성해야하는 코드를 작성했습니다. 나는 번들의 액티베이터에서이 코드를 호출하고 얻을 :OSGi 번들 내부에서 Javassist ClassPool을 어떻게 만들고 초기화합니까?

Caused by: javassist.NotFoundException: com.test.services.TestService 
at javassist.ClassPool.get(ClassPool.java:436) 
at com.test.services.Helper.get(Helper.java:46) 

그것은 첫째 ClassPool.get()에서 잘 던졌습니다 :

ClassPool pool = ClassPool.getDefault(); 
CtClass result = pool.get(TestService.class.getName()); 
... 

TestService가 공개와 같은 패키지에, 그리고 Exception을 생성하는 Helper로 번들합니다. 분명히 "ClassPool.getDefault()"를 수행하는 것만으로는 충분하지 않습니다. ClassPool이 번들 내부의 클래스를 볼 수 있도록하려면 어떻게해야합니까? 내 패키지를 가져와야합니까?

+0

javassist 번들 자체가로드를 요청한 클래스의 가시성을 필요로한다고 가정합니다. 불행히도 나는 javassist가 클래스를 찾는 방법을 모른다. 어떤 클래스 로더를 사용할 지 알려줄 수 있습니까? 아니면 그냥 임의로 추측 할 수 있습니까? 실제'Class' 객체로 구성 될 수 있습니까, 아니면 Strings로 제공된 클래스 이름을 고집합니까? –

+0

저는 Javassist로 시작 했으므로 확신 할 수는 없지만 오늘 저녁에 확인하고 대답 해 보겠습니다. 하지만, 이미 그 문제를 지적한 것 같습니다. OSGi는 Bundle에서 볼 수있는 패키지를 제한하므로 Javassist Bundle의 "import package"에 내 패키지를 추가하는 것으로 충분할 수 있습니다. –

답변

2

일부 OSGi 번들에서는 javassist를 사용하여 Java 클래스를 즉시 수정/생성합니다. here을 볼 수 있습니다. 희망이 당신을 돕는다.

+0

순환 종속성 때문에 자체 Bundle에서 Javassit을 사용할 수 없지만 Javassit jar를 Bundle에 내 코드와 함께 포함시키는 방법을 얻지 못합니다. 필자는 Maven을 사용하지 않고 수동으로 임베딩을 수행하는 방법에 대한 유용한 지침을 찾을 때까지 작동한다는 것을 "가정"해야합니다. –

+0

OSGi 번들 빌드에 사용하는 도구는 무엇입니까? 개미? http://www.aqute.biz/Bnd/Bnd 도구를 직접 사용하여 jar를 내장하고 번들을 생성 할 수 있습니다. –

+0

나는 Bnd를 사용하고 있지만 막 시작했습니다. 나는 "OSGi in Practice"를 읽고 있으며 저자는 Bnd를 사용합니다. 하지만 막 2 장을 마쳤으므로 퍼가기에 대해 읽지 않았습니다. 어쨌든, 나는 이것이 나에게 잘못된 접근이라고 생각한다. 내가 컴파일 할 때 정확히 "생성해야"하는 것을 알고 있기 때문에 컴파일 타임에 Javassist를 사용하는 것이 더 합리적 일 것입니다. 그것은 클래스 패스 문제를 동시에 해결하면서 하나의 런타임 의존성을 줄입니다. –

10

"소스는"이 같은 ClassPool에, 당신은 "클래스 경로"에 대응 할 수있는 OSGi 번들 클래스 로더에 의해로드 된 객체 (또는 클래스 로더) 인 경우 :

pool.insertClassPath(new ClassClassPath(source.getClass())); 

또는 귀하의 경우는 단순히

pool.insertClassPath(new ClassClassPath(TestService.class)); 

희망이 있습니다.

관련 문제