2013-09-23 4 views
0

OSGi 컨테이너에 OSGi 번들을 설치하려고합니다. 내 폴더 중 하나에 jar 파일이 있습니다. 그 jar 파일을 ByteArray으로 읽은 다음이 ByteArray을 사용하여 Framework 번들을 OSGi 컨테이너에 설치합니다. 아래는 내가 항상ByteArray를 사용하여 OSGi 번들 설치

가 가
org.osgi.framework.BundleException: Bundle symbolic name and version are not unique: Framework:1.0.0 

사람이 내가 뭐하는 거지 무슨 말해 줄 수 GET-, 아래

FrameworkFactory frameworkFactory = ServiceLoader.load(FrameworkFactory.class).iterator().next(); 

framework = frameworkFactory.newFramework(new HashMap<String, String>()); 
framework.start(); 

final String basePath = "C:\\LocalStorage"; 
final BundleContext bundleContext = framework.getBundleContext(); 
final List<Bundle> installedBundles = new LinkedList<Bundle>(); 

String filename = "Framework" + "-" + "1.0.0" + ".jar"; 
String localFilename = basePath+ File.separatorChar + filename; 

File file = new File(localFilename); 
byte [] fileData = new byte[(int)file.length()]; 
DataInputStream dis = new DataInputStream((new FileInputStream(file))); 
dis.readFully(fileData); 
dis.close(); 

// But below line gives me exception always- 
installedBundles.add(bundleContext.installBundle(filename, new ByteArrayInputStream(fileData))); 

for (Bundle bundle : installedBundles) { 
    bundle.start(); 
} 

예외입니다 .. 코드입니다? 그리고 ..

업데이트를 나는 다른 클래스에 내 코드의 일부, 나는이 ByteArray 사용하고 있기 때문이 ByteArray를 사용해야합니다, 그래서 나는 그 방법 파일 항아리의이 ByteArray를 전달해야합니다 : -

하지만 이런 식으로 설치하는 경우 제대로 작동합니다. 나는이 ByteArray를 통해 설치하고 있다면 그것은 .. 작동하지 않습니다

final String basePath = "C:\\LocalStorage"; 
final BundleContext bundleContext = framework.getBundleContext(); 
final List<Bundle> installedBundles = new LinkedList<Bundle>(); 

String filename = "Framework" + "-" + "1.0.0" + ".jar"; 
String localFilename = Constants.FILE_PROTOCOL + basePath+ File.separatorChar + filename; 

installedBundles.add(bundleContext.installBundle(localFilename)); 

for (Bundle bundle : installedBundles) { 
    bundle.start(); 
} 

내가이 ByteArray 일이 뭔가 잘못을하고있는 중이 가능성이 될 수 있을까요? 어떤 생각?

답변

0

설치하려는 병의 MANIFEST.MF에 일부 OSGi 헤더가없는 것처럼 들립니다. 이 같은 일부 메타 데이터 항목을 추가하십시오 :

Bundle-SymbolicName: your.name.Class

Bundle-Version: 1.0.0

체크 아웃 이미 FrameworkFactory에 의해 초기화 프레임 워크의 시스템 번들에 수동으로 추가 OSGi 프레임 워크의 번들을 설치하려고했던 wikipedia entry

+0

이미 내'MANIFEST.MF의 file'에 이러한 항목이 - '번들-ManifestVersion : 2 번들-이름 : 프레임 워크 를 번들 - SymbolicName : 프레임 워크 번들 - 버전 : 혼란에 대한 1.0.0' – AKIWEB

0

(이것은 동일한 번들/파일입니다). 이것은 귀하의 예외 (자세한 내용은 here을 읽으십시오)의 원인입니다.

+0

죄송합니다. 실제로 프레임 워크는 실제 이름이 아닙니다. 매우 긴 이름 이었으므로 여기에 게시하기 전에 이름을 줄여야합니다. – AKIWEB

1

이 오류는 사용자가 이미 동일한 기호 이름 및 버전을 가진 번들을 가지고 있음을 나타냅니다. 이 둘은 함께 각 번들의 "기본 키"와 같습니다. 동일한 번들의 두 가지 버전을 사용할 수 있지만 동일한 이름이 인 두 번들을 가질 수는 없습니다.

아직 바이트 배열을 전달해야하는 이유를 모르겠다 ... 이미 FileInputStream을 전달한 이유는 무엇입니까?

어쨌든 동일한 번들을 두 번로드하는 이유를 해결할 수 있도록 남겨 두겠습니다. 주의 : 파일 이름은 중요하지 않으며, MANIFEST.MF에 Bundle-SymbolicNameBundle-Version 항목 만 있습니다.

+0

감사합니다 닐, 그럼 내 질문에, 내 질문에 명시된대로 내 두 번째 접근 방식으로 작동합니까? 'BundleContext.installBundle (문자열 위치)'. 모든 것은 동일하며 접근 방식 만 다릅니다. – AKIWEB

+0

코드 샘플은 번들이 아닌 번들의 설치 만 보여줍니다. 동일한 번들을 두 번 설치하려고하면 오류가 발생할 수 있습니다. 디버거를 사용해보십시오. –

+0

코드를 두 번 이상 실행했지만 프레임 워크를 초기화하지 않았을 수 있습니다. 번들이 설치되면 업데이트해야합니다. –