봄 OSGI 서비스를 참조 인터페이스이어야 합 명시적으로 수입하는 소모니까?
문제
나는 익숙해지고 봄 OSGI 과 청사진이지만,이는"클래스 경로"어려움에(같은 많은 초보자).
나는 두 OSGI 번들는 정의하는 다양한 콩(를 사용하여 청사진이다)및 수출로 서비스와 다른 번들을 참조하는 서비스 콩(를 사용하여 봄 OSGI)및 플러그로 그들을 어떤 아파치는 낙타의 노선이 있습니다.
서비스 공급자는 번들의 청사진을 다음과 같이 나타납니다.
<service id="camelTsvDataFormat"
interface="org.apache.camel.spi.DataFormat">
<bean class="org.apache.camel.component.flatpack.FlatpackDataFormat"/>
</service>
서비스-소비자는 번들의 봄 컨텍스트는 다음과 같습니다:
<osgi:reference id="tsvDataFormat"
interface="org.apache.camel.spi.DataFormat" />
<camel:camelContext>
<route>
<from uri="vm:in">
<setBody>
<constant>SELECT * FROM myTable</constant>
</setBody>
<to uri="jdbc:myDataSource" />
<marshal ref="tsvDataFormat" />
<to uri="file:/path/to/my/files/?fileName=out.tsv" />
</route>
</camel:camelContext>
...그러나 배포,"봄을 찾을 수 없는 클래[org.apache.낙.spi.DataFormat]".를 추가할 수 있습니다 인터페이스를 가져오기 패키지 섹션의 내 Bnd 지침이지만,그것은 보인다 중복하여 수동으로 목록을 두 번 클래스에는 별도의 위치입니다.
다른 선택을 확장하는 것이 인터페이스 내에서 자신의 프로젝트 Bnd 것이 자동으로 그것을 선택하지만,이것은 대략 많은 문제입니다.
난 기대하는 봄을 조회 서비스에 의해 인터페이스 이름없이 실제로 해결 인터페이스 클래스입니다.는 이 순진한 사람인가요?또는 방법이 있을 Bnd 자동으로 가져오 인터페이스에서 내 appContext 의 서비스를 참조?는 경우 Bnd 작업을 수행 할 수 있습니다(예:플러그인을 사용하여),가 표준을 사용하는 방법 Bnd 플러그인으로 아파치 Felix 번들은 플러그인에 대한 Maven?
해결책
홀리를 제안 할 때 BND는 일반적 으로이 패키지를 호출하는 번들 안의 모든 바이트 코드에서 참조됩니다.또한 오른쪽 위치에있는 경우 Introspect Spring-DM XML 파일도 있어야합니다.그러나 동일한 번들 위치에 있지 않으므로 Blueprint XML 파일을 동일한 방식으로 지원하는지 여부를 알지 못합니다.따라서 BND 버전을 업그레이드하거나 청사진을 지원하는 플러그인을 사용해야 할 수도 있습니다.
그러나 나는이 모든 것을 의심스럽게 생각합니다.인터페이스에 대한 바이트 코드 참조가 없으면 서비스 참조를 사용하지 않아도됩니다.이 경우뿐만 아니라 삭제하지 않으시겠습니까?
다른 팁
로@닐스 바시,Bnd 해야 성찰의 봄과 청사진 파일에 기준치 이내에 번들(META-INF/spring
고 OSGI-INF/blueprint
).나는 수동으로 재정의 이로 META-INF/spring/*.xml
고 OSGI-INF/blueprint/*.xml
내 POM.나는 생각이 있었기 때문에 잘 봄과 청사진을 연장 내 OSGI 플랫폼을 받아 헤더와 bootstraped 해당 컨테이너입니다.Bnd,그러나 나타납니다 기대하는 간단하 헤더없이 많(참조하십시오 SpringXMLType.java
).나는것을 의미하지 않는 할당을 잘못 때문에 그것은 놀라운 도구이지만 이 잡은 나 off guard.
어쨌든 때문에,내년 봄과 청사진을 마크업은 이미 기준에 위치,내가 그냥 제거 중복 Bnd 지침에서 내 POM,그리고 모든 봄 DM 서비스를 참조 인터페이스가 자동적으로 집어 Import-Package
'd 로 묶:
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.3.6</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-Version>${project.version}.${buildNumber}</Bundle-Version>
<Bundle-Activator>com.example.BundleActivator</Bundle-Activator>
<!--
<Spring-Context>META-INF/spring/*.xml</Spring-Context>
<Bundle-Blueprint>OSGI-INF/blueprint*.xml</Bundle-Blueprint>
-->
</instructions>
</configuration>
</plugin>