2016-12-20 2 views
0

다른 버전하지만 서로 다른 버전의은 OSGi LinkageError가 동일한 패키지와 클래스,하지만이 라이브러리 플러그인, 같은 API를 같은 라이브러리의 각을 가지고

라이브러리 플러그인의

하나는있다을 제공하는 두 개의 라이브러리 플러그인 MANIFEST.MF에 다음

Export-Package: com.package1.packagename1;version=1.0.0, 
com.package2.packagename2;version=1.0.0 

두 번째 라이브러리 플러그인하여 MANIFEST.MF에 정의 된 다음했습니다 사용

Export-Package: com.package1.packagename1;version=1.1.0, 
com.package2.packagename2;version=1.1.0 

플러그인 의이 API는하여 MANIFEST.MF에 정의 된 다음했습니다

가져 오기 - 패키지를 사용하는 플러그인이 활성화
Import-Package: com.package1.packagename1;version="[1.0.0,1.1.0]", 
com.package2.packagename2;version="[1.0.0,1.1.0]" 

이 는 사용자가 원하는 라이브러리 의 버전을 확인하기 위해 기본 설정 값을 확인 사용. 활성제는 다음 가져 오기 - 패키지를 충족 할 수 단지 하나의 플러그인을 떠나, 원하지 않는 라이브러리 버전

bundle.stop() 
bundle.uninstall() 

를 사용합니다. 이 시점까지는 모든 기능이 예상대로 작동하고 올바른 버전의 라이브러리를 오류없이 사용할 수 있습니다.

버전을 변경할 때 문제가 발생합니다. 사용자가 라이브러리 환경 설정을 변경하면 현재 응용 프로그램이 종료되고 사용자에게 수동으로 다시 시작하라는 메시지가 표시됩니다. 이렇게하면 JVM과 플랫폼 이 다시 시작되므로 다른 버전의 플러그인을 프로그래밍 방식으로 중지하고 제거 할 수 있습니다.

java.lang.LinkageError: loader constraint violation: loader (instance of 
org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader) previously 
initiated loading for a different type with name "com/package1/packagename1/ClassName" 

이 비슷한 문제 here이 있었다, 그러나이 솔루션은 일부의 이름을 바꿀 것 같았다 그러나, 때 라이브러리 소비자 플러그인 라이브러리 플러그인의 나머지 설치된 버전을 호출하려고 시도 다음과 같은 예외가 발생합니다 패키지는 단지 문제를 피하기 위해. 전체적인 점은 완전히 동일한 API를 사용하고 기본 라이브러리 버전을 변경하기 때문에이 솔루션은 나를 위해 작동하지 않습니다.

환경 설정을 변경하지 않고 다시 시작하여 환경 설정을 변경하지 말고 라이브러리 버전을 변경하려면 사용자가 애플리케이션을 두 번 다시 시작하지 않아도되는 솔루션을 찾으십시오. 이 연결 오류를 피하기 위해이 문제를 해결할 다른 방법이 있습니까?

답변

0

다른 라이브러리를 사용하는 클래스 로더가 여전히 활성화 된 것처럼 들립니다.

라이브러리를 사용하는 번들이 객체 및 클래스에 대한 참조가 중지되어 있는지 확인해야합니다. 그런 다음에 만 번들 클래스 로더를 정리할 수 있습니다.

또한 라이브러리를 사용하여 모든 번들을 새로 고쳐야합니다. 그러면 새 라이브러리로 다시 연결됩니다.

+0

Eclipse에서 특정 번들을 프로그래밍 방식으로 새로 고치는 방법은 무엇입니까? 요약보기에는 bundle.refresh() 또는 Platform.refresh (bundleId) 메서드가 표시되지 않습니다. – seanr8

+0

FrameworkWiring.refreshBundles를 찾으십시오. 번들 0에 bundle.adapt를 사용하여 FrameworkWiring으로 전송합니다. –