2012-01-24 3 views
4

저는 스프링 OSGI와 청사진에 익숙해졌지만 많은 뉴비와 같이 "classpath"어려움을 겪고 있습니다.번들을 사용하여 스프링 OSGI 서비스 참조 인터페이스를 명시 적으로 가져와야합니까?

두 개의 OSGI 번들이 있습니다. 하나는 여러 가지 빈을 정의하고 (문제가 아닌 청사진을 사용하여) 서비스로 내 보냅니다. (Spring OSGI를 사용하여) 서비스 빈을 참조하는 다른 번들을 아파치 Camel의 몇몇 경로에 연결한다.

<service id="camelTsvDataFormat" 
    interface="org.apache.camel.spi.DataFormat"> 
    <bean class="org.apache.camel.component.flatpack.FlatpackDataFormat"/> 
</service> 

서비스 소비자 번들의 Spring 컨텍스트 이런 식으로 뭔가 같습니다 :

<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> 

을 ...하지만 배포에, 봄은 "찾을 수 없습니다

서비스 제공자 번들의 청사진이 같이 보입니다 class [org.apache.camel.spi.DataFormat] ". 내 Bnd 지침의 Import-Package 섹션에 인터페이스를 추가 할 수 있지만 별도의 위치에 클래스를 두 번 수동으로 나열해야하는 것은 과장된 것처럼 보입니다.

대체 방법은 내 프로젝트에서 인터페이스를 확장하여 Bnd가 자동으로 가져 오도록 설정하는 것입니다. 그러나 이것은 대략 큰 문제입니다.

실제로 인터페이스 클래스를 해결할 필요없이 인터페이스 이름으로 서비스를 조회하기 위해 Spring을 기대하고 있습니다. 이 번호가 ï 인 건가요? 아니면 Bnd가 appContext의 서비스 참조에 인터페이스를 자동으로 가져 오도록하는 방법이 있습니까? Bnd가이를 수행 할 수 있다면 (예 : 플러그인 사용) Baven 플러그인을 Maven 용 Apache Felix 번들 플러그인과 함께 사용하는 표준 방법이 있습니까?

+0

이 내가 찾을 수있는 가장 가까운 설명은 다음과 같습니다 http://forum.springsource.org/archive/index.php/t-52913.html – RubyTuesdayDONO

+0

다른 생각 -이없는 등 큰 문제는 IF이다 서비스 공급자 인터페이스는 Apache Camel과 마찬가지로 "spi"패키지에 잘 정리되어 있습니까? – RubyTuesdayDONO

+0

일반적으로 bnd는 바이트 코드에서 참조되는 모든 패키지에 대해 가져 오기를 추가합니다. tsvDataFormat 필드는 어떤 클래스입니까? –

답변

3

홀리 (Holly)가 제안한 것처럼 bnd는 일반적으로이 패키지를 호출하는 번들 내의 모든 바이트 코드에서 참조되는이 패키지를 찾습니다. 또한 Spring-DM XML 파일이 올바른 위치에 있으면이를 검사해야합니다. 그러나 동일한 묶음 위치에 있지 않기 때문에 동일한 방법으로 Blueprint XML 파일을 아직 지원하는지 여부는 알 수 없습니다. 따라서 bnd 버전을 업그레이드하거나 Blueprint를 지원하는 플러그인을 사용해야 할 수도 있습니다.

그러나 나는이 모든 것을 의심합니다. 인터페이스에 대한 바이트 코드 참조가 없다면 서비스 참조를 사용하지 않는 것 같습니다. 이 경우 그냥 제거하지 않으시겠습니까?

+0

'tsvDataFormat' 빈은 Blueprint를 사용하여 다른 별도의 번들에서 OSGI 서비스로 내보내 지므로 바이트 코드가 직접 참조되지 않습니다. Spring-OSGI를 사용하여 참조를 가져 오는이 번들의 모든 프로젝트 클래스. 처음에 이것을 명확하게하지 않은 것에 대해 사과드립니다. 그러나 Spring이 아파치 Camel 라우트에 빈을 연결하는 데 필요한 경우를 제외하고 나는 인터페이스에 직접 관심이 없다. OSGI가 자동적으로/동적으로 참조 된 서비스의 인터페이스 클래스를 가져 오지 않는가? – RubyTuesdayDONO

+0

@RubyTuesdayDONO 서비스의 구현을위한 바이트 코드에 대해 말하는 것이 아닙니다. 다른 번들에 있으며 가져올 수 없습니다. 나는 번들의 모든 클래스에서 참조 할 수있는 * 인터페이스 *에 대해 설명합니다. 어디서든 서비스를 참조하지 않는다면 실제로 서비스를 호출하는 코드가 없다는 것을 의미하므로 참조가 필요한 이유가 아직 명확하지 않습니다. –

+0

@RubyTuesdayDONO 다른 질문에 대해 : 아니오, OSGi는 자동으로 아무것도 가져 오지 않습니다. (한 가지 예외가 있습니다. JRE의 'java. *'패키지가 항상 표시됨). 서비스 인터페이스를 포함하여 가시성을 갖기를 원하는 모든 패키지를 가져와야합니다. 일반적으로 가져 오기는 코드에서 해당 인터페이스에 대한 참조를 볼 수 있기 때문에 bnd에 의해 자동으로 추가됩니다. –

1

@Neil Bartlett이 지적한대로 Bnd는 번들 (META-INF/springOSGI-INF/blueprint) 내의 표준 위치에서 Spring 및 청사진 파일을 조사해야합니다. 내 POM에서 META-INF/spring/*.xmlOSGI-INF/blueprint/*.xml으로 수동으로 재정의했습니다. 내 OSGI 플랫폼의 Spring 및 Blueprint Extender가 헤더를 허용하고 각각의 컨테이너를 부트 스트래핑 한 이후로 이것이 괜찮다고 생각했습니다. 그러나 Bnd는 덩어리가없는 간단한 머리글을 기대합니다 (SpringXMLType.java 참조). 나는 그것이 놀라운 도구이기 때문에 잘못을 정하지는 않겠지 만,이 하나가 나를 경솔하게 잡았습니다.

어쨌든 내 봄 및 청사진 마크 업이 이미 표준 위치에 있으므로 POM에서 중복 Bnd 명령어를 제거하고 모든 스프링 DM 서비스 참조 인터페이스가 자동으로 선택되었고 Import-Package이 내 번들에 포함되었습니다.

<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> 
관련 문제