2

OSGi에서 제대로 작동하는 프레임 워크 모듈을 가지고 있습니다. 모든 서비스와 구성 요소는 서로를 찾고 잘 작동합니다.OSGi의 동적 클래스 로딩

그러나 클래스와 관련하여 동적 인 작업을 수행하는 프레임 워크가 하나 있습니다. 기본적으로 어떤 점에서 클래스 이름을 지정하면 Class.forName()을 수행하고 반사 마법이 발생합니다.

이것은 표준 jvm에서 실행하고 SPI를 사용하여 프레임 워크를 연결하는 데 유용하지만 프레임 워크를 통해 접근하려는 무작위 클래스 "test.MyTest"가 보이지 않기 때문에 OSGi에서 실패합니다 고 말했다.

그것은 "java.lang.ClassNotFoundException가 : test.MyTest 프레임 워크에 의해 찾을 수 없습니다"가 발생합니다

그래서 내 질문 : 어떻게 모두 볼 필요가있는 프레임 워크에 대한 가시성의 부족을 해결할 수 있습니까? Import-Package: *?

UPDATE

은은 OSGi이 전면에 2010 년 이후 많이 변경되지 않았습니다 가정하면, 기사 http://njbartlett.name/2010/08/30/osgi-readiness-loading-classes.html매우 흥미 롭다. 나는 현재 OSGi를 통해 주입되는 클래스와 도메인 팩토리를 적극적으로 등록하는 지원을 추가했다.

그 외에도 기본 해결은 어쨌든 컨텍스트 클래스 로더를 사용하므로 다른 모든 것이 실패하면 클래스를로드하고로드하는 데 사용됩니다.

UPDATE는

나는 작은 프로젝트에 쉽게뿐만 아니라 제안 DynamicImport-Package에 대한 지원을 추가했습니다.

+0

어떤 프레임 워크에 대해 말하고 있습니까? 코드를 제어 할 수 있습니까? –

+0

네, 그건 내 자신의 프레임 워크입니다. – nablex

+0

그렇다면 꼭 Class.forName()을 피하십시오. 내 업데이트 된 대답을 참조하십시오 –

답변

3

DynamicImport-Package:*을 사용할 수 있습니다. 그러면 번들이 모든 클래스를 볼 수 있습니다. 문제는 정확하게 노출 된 것을 실제로 제어 할 수 없다는 것입니다. 따라서 이것은 보통 최후의 수단이지 권장되는 방법은 아닙니다.

먼저 Thread.currentThread(). setContextClassLoader()를 사용하여 프레임 워크에 제공하는 클래스의 클래스 로더를 설정해야합니다. 때로는 프레임 워크가이 클래스 로더를 참조하기도합니다.

더 나은 방법은 사용자 클래스 로더를 제공 할 수있는 프레임 워크의 메소드를 찾는 것입니다.

코드를 제어 할 수 있으면 Class.forname()을 피하십시오. 대신 사용자가 클래스 이름 대신 클래스 객체를 제공하도록하거나 사용자가 클래스 이름과 사용할 클래스 로더의 조합을 제공하도록 할 수 있습니다. 두 가지 방법 모두 OSGi 내부와 외부에서 완벽하게 작동합니다.

+0

불행히도 프레임 워크는 실제로 더 높은 수준의 프레임 워크 구현이며 ** 클래스를 식별하기 위해 문자열 ID를 사용해야합니다. – nablex

+0

흠, DynamicImport-Package를 사용할 수 없습니다. 내가해야 할 특별한 일이나 매니페스트에 넣기 만하면 되나요? – nablex

+0

프레임 워크의 목록에 방금 설정했습니다. 액세스하려는 패키지가 내보내 졌는지 확인해야합니다. –