2012-01-16 3 views
1

다른 번들 종속성 번들 내보내기 :내가이 OSGI 구성이

/configurations 
    config.ini 
    somebundle.properties 
/plugins 
    bundleA 
    bundleB 
osgi-3.4.2-R34x_v2008826-1230.jar 
org.eclipse.equinox.common_3.4.0.v20080421-2006.jar 
org.eclipse.update.configurator_3.2.201.R34x_v20080819.jar 
com.test.arquitectura.osgi.ConfiguratorModule_1.0.0.jar 

내 config.ini 파일은 다음과 같이이다 : 나는

java -Xms256M -Xmx1280M -jar osgi-3.4.2-R34x_v20080826-1230.jar 
을 실행할 때, AFAIK, 그래서

[email protected]:start, \ 
    [email protected]:start, \ 
    [email protected]:start 
osgi.clean = true 
eclipse.ignoreApp=true 
osgi.parentClassLoader=app 

equinox.common 및 update.configurator와 함께 config.ini를 읽으면/plugins 폴더에 배포 된 모든 번들을 "감지"합니다. 그 후 ConfiguratorModule (사용자 정의 번들)은 컨텍스트에서 모든 번들을 읽고 각 메서드의 start 메소드 (bundleA 및 bundleB)를 실행합니다. 나는 bundleA 및 bundleB에서 정의 된 일부 clases를 사용하는 Eclipse 프로젝트 (bundleC)를 가지고, 그래서 MANIFEST.MF는 다음과 같습니다

Manifest-Version: 1.0 
Bundle-ManifestVersion: 2 
Bundle-Name: BundleC Plug-in 
Bundle-SymbolicName: com.test.bundlec 
Bundle-Version: 1.0.0 
Bundle-Activator: com.test.bundlec.Activator 
Import-Package: javax.naming,javax.sql,org.osgi.framework;version="1.3 
.0",org.osgi.util.tracker;version="1.3.1" 
Bundle-ClassPath: . 
Require-Bundle: com.test.BundleA;bundle-version="1.0.0", 
com.test.BundleB;bundle-version="1.0.0" 

그래서, 나는 플러그인 (항아리)에 bundleC 프로젝트 파일을 생성합니다. "Require-bundle"옵션에 두 개의 번들이 있으므로이 프로젝트 (BundleA와 BundleB)는 bundleC 클래스 경로에 있어야합니다. 그렇습니까? 따라서이 경우, 번들 ("플러그인 개발"로 내보내기)을 생성하고 새 번들을 플러그인 폴더에 배치합니다. 내가 빠진 것이 있습니까?

내가 옳다고 말한 모든 것이 맞다면 여기에 내 문제가있다. 나는 BundleA와 BundleB를위한 플러그인 jar 파일을 가지고있다. 그러나 그것들의 소스 코드를 가지고 있지 않다. BundleC를 jar 플러그인으로 내보낼 때 에러가 발생한다. 왜냐하면 명백한 것처럼, 필요한 클래스를 찾을 수 없기 때문이다. BundleA 및 BundleB에서 사용합니다. classpath에 required-bundles없이 플러그인을 생성 할 수있는 방법이 있습니까?

나는 그들을 "디 컴파일"한 다음 프로젝트를 만들고 BundleC 클래스 패스에 추가하려고했습니다. 플러그인을 생성 한 다음 플러그인 폴더에 넣을 수 있지만 osgi 환경을 실행하면 bundleC가 발견되지 않습니다. 내가 뭘 잘못하고 있니? 답 BundleA 및 BundleB에서 뭔가를 사용하려면

+0

정확한 오류나 스택 추적 등을 게시하십시오. – katsharp

답변

0

에 대한

덕분에, 그들은 그것을 수출하는 (예를 들어 그들은 다른 번들에 의해 사용을 위해 클래스를 내보낼 수 있습니다)가 필요합니다. 그런 다음 BundleC에서 BundleA와 BundleB가로드 될 때까지 기다려야합니다 (예 : BundleListener 구현의 경우, 일반적으로 서비스와 ServiceTracker로 이루어짐).