2017-03-24 12 views
0

다음과 같은 상황이 있습니다. 나는 foo.jar라는 제 3 자 항아리에 의존합니다. 이 항아리에는 많은 osgi가 아닌 종속성이 있습니다. 새 프로젝트 "기존 JAR 아카이브에서 플러그인"을 만들고 foo.jars non-osgi 종속성을 모두 선택하여 foo.libs.jar이라는 "deployable plugin and fragment"로 내 보냈습니다.RCP4 프로젝트에 non-osgi jar 추가

내 RCP4 프로젝트는 기능 기반 제품입니다. 내 주요 RCP 프로젝트에서 대상 파일로 이동하여 컨텐츠 탭으로 이동하여 foo.jar 및 foo.libs.jar에 확인 표시를합니다. 그런 다음 프로젝트 파일로 이동하여 "validate"를 선택하고 "No problems were detected"라는 메시지가 나타납니다.

내가 잘못하고있는 일이나이 일을하기 위해해야 ​​할 일이 무엇인지 실마리가 있습니까? foo.libs.jar을 foo.jar의 종속물로 명시 적으로 설정해야합니까? 내 주요 프로젝트 manifest-> dependency tab 및 runConfigurations-> Plug-ins에서이 작업을 수행하고 foo.libs.jar을 feature.xml -> Included plug-in tab에 추가했으나 보이지 않았습니다. 일하다.

감사합니다.

=== 업데이트 ===은

나는 내 문제가 번들 조각 및 임베디드 의존성의 경우에 해당 할 수있다 생각합니다. 예를 들어 :

- I create foo.libs.jar. One of the jars inside it is activemq.jar 
    I need access to javax.jms.ExceptionListener 
- The manifest for foo.libs.jar contains activemq.jar in the 
    Bundle-ClassPath, and javax.jms in the Export-Package sections 
- foo.jar contains foo.libs.jar in its Class-Path. It contains 
    javax.jms in its Import-Package and Export-Package sections 
- I created a "Plug-in from existing JAR archives" project which has 
    foo.jar and foo.libs.jar in it. 
- The manifest for the project has foo.jar and foo.libs.jar in the 
    Bundle-Classpath section. The Import-Package section contains 
    javax.jms 
- If I export this bundle to my project, and run validate I get 
    errors saying javax.jms cannot be found. 
- If I omit the javax.jms from the bundles Import-Package there 
    are no validation errors but I will get a ClassNotFoundException 

이 포함 된 항아리와 번들 - 클래스 경로에 문제가있을 수 있습니다처럼 좀 기분이 ...

내 번들

Manifest-Version: 1.0 
Bundle-ManifestVersion: 2 
Bundle-Name: my.name 
Bundle-SymbolicName: my.name 
Bundle-Version: 1.0.0 
Bundle-ClassPath: foo.jar 
Export-Package: list_of_my_packages 
Bundle-RequiredExecutionEnvironment: JavaSE-1.8 

을 가지고 있으며, foo.jar에이

있다
Manifest-Version: 1.0 
Bnd-LastModified: 1489769501680 
Bundle-ManifestVersion: 2 
Bundle-Name: foo 
Bundle-SymbolicName: foo 
Bundle-Version: 1.0.0 
Class-Path: foo.libs.jar 
Created-By: 1.8.0_71 (Oracle Corporation) 
Export-Package: javax.jms (and other stuff, omitted) 
Import-Package: javax.jms;resolution:=optional (and other stuff, omitted) 
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.8))" 
Tool: Bnd-2.4.0.201411031536 

그리고 foo.libs.jar는

있다
Manifest-Version: 1.0 
Bundle-ManifestVersion: 2 
Bundle-Name: Foo libs 
Bundle-SymbolicName: foo.libs 
Bundle-Version: 1.1.0 
Bundle-ClassPath: activemq-all.jar, (and others which I ommitted) 
Export-Package: javax.jms, (and others which I ommitted) 
Bundle-RequiredExecutionEnvironment: JavaSE-1.8 

답변

1

질문에 세부 사항이 없지만 "클래스를 찾을 수 없음"문제는 OSGI에서 매우 일반적입니다.

두 번들의 MANIFEST.MF를 확인하십시오. foo.libs.jar은 'Export-Package'지시어에 "누락 된"클래스에 대한 패키지 선언이 있어야하며 foo.jar은 'Import-Package'에 동일한 패키지가 있어야합니다. 예외가 생길 때까지 도달 할 수 있었기 때문에 foo.jar의 'Import-Package'에 some.class.in.a.jar.in.foo.libs.jar에 대한 패키지 선언이 누락 된 것처럼 보입니다.

기본 규칙은 다음과 같습니다. 번들은 매니페스트를 통해 가져온 자체 클래스와 +1 클래스에 액세스 할 수 있습니다. 번들 프래그먼트와 임베드 된 의존성과 같은 예외가 있지만이 경우에는 생략 할 수 있다고 생각합니다.

일반적으로 번들 매니페스트에 '가져 오기 -'및 '내보내기 - 패키지'지시문을 올바르게 설정하면 문제가 해결됩니다. 보다 자세한 도움이 필요하면 foo.jar 및 foo.lib.jar을 만드는 방법에 대한 자세한 내용을 제공하십시오 (손으로, Maven 플러그인으로, gradle로 어떤 설정을 사용하는지 등)

+0

도와 주셔서 감사합니다. 이. 나는 모든 것을 패키지화하고 업데이트 된 게시물에 단계를 나열한 방법을 약간 변경했습니다. 추가 지침을 제공 할 수 있습니까? – ekjcfn3902039

+0

번들의 매니페스트를 여기에 게시해도 되겠습니까? – skapral

+0

나는 앞서 가서 원래 게시물에 매니페스트를 추가했습니다. 내가 아는 한 평범한 것만 빼고는 아무것도 안된다. – ekjcfn3902039