2014-11-19 2 views
0

OSGi 플러그인과 함께 작업 중이며 비 직렬화에 문제가 있습니다.OSGi의 비 직렬화 문제

두 개의 플러그인 A와 B가 있다고 가정 해보십시오. 플러그인 A는 일반 용도이며 많은 응용 프로그램에서 사용되지만 플러그인 B는 한 응용 프로그램에만 사용됩니다. 플러그인 A는 기본적으로 모든 애플리케이션을위한 프레임 워크입니다. 플러그인 B는 플러그인 A의 API를 사용하여 상태 정보를 유지합니다. 따라서 플러그인 B는 A에 의존하지만 A는 B에 의존하지 않습니다.

간단하게하기 위해 플러그인 A의 HashMap에 정보를 저장한다고 가정합니다. Serializable을 구현하는 Class X는 Plugin B 안에 존재한다. Plugin A는 그것을 직렬화하고 저장한다. 직렬화 복원 프로세스 동안 플러그인 A는 클래스 X를 찾을 수 없으며 실패합니다. 플러그 인 A는 일반적이고 A에서 의미가 없으므로 클래스 X를 플러그인 A에 추가 할 수 없습니다.

클래스 X는 런타임 중에 사용할 수 있습니다. 이 문제를 해결하기위한 적절하고 깨끗한 방법은 무엇입니까?

미리 감사드립니다.

답변

1

플러그인 A와 같은 소리는 캐시입니다. 플러그인 A는 초기화하는 동안 (또는 각 요청 중에) classLoader가 전달 될 수있는 방식으로 설계되어야합니다. 이런 방식으로 설계되지 않았다면 OSGi와 친숙하지 않으며 OSGi 환경에서 사용해서는 안됩니다.

예 : EHCache, Infinispan 및 기타 캐시 엔진을 사용하면 캐시 초기화 중에 Classloader 인스턴스를 전달할 수 있습니다.

당신은 클래스 X가 번들 A의 Fragment Bundle를 만들 수 있습니다
+0

그것은 번들 B에 대한 인식 클래스 로더되지 않은 API를 얻기 위해 비 사소한,하지만 서비스 공장으로 캐시를 구현하는 것이 가능 될 수 있다고 생각 그런 다음 캐시를 요청하는 각 번들 * X *에 대한 새 서비스 인스턴스를 만듭니다. 서비스 팩토리는 서비스를 요청하는 각 Bundle에 대한 참조를 얻습니다. 그러면 Bundle의 'loadClass'를 자신의 ClassLoader impl으로 래핑 한 다음 EHCache에 전달할 수 있습니다. – JBert