2012-11-28 3 views
1

OSGi 환경 (Equinox)에서 Restlet 2.1을 번들 (즉, 번들 내의 라이브러리가 아닌)으로 실행합니다. 문제는 Restlet 엔진이 Restlet 확장 프로그램에서 제공하는 변환기와 같은 헬퍼를 감지하지 못한다는 것입니다. 특히 EngineClassLoader#getResources() 호출은 결과를 반환하지 않습니다. 또한 확장은 대상 플랫폼에서 OSGi 번들로 배포됩니다.OSGI 환경에서 Restlet 변환기 등록

OSGi 환경에서 자동 변환기 등록이 실제로 작동할까요?

답변

1

사실, Restlet은 전용 활성화 도구 덕분에 이러한 기능을 지원합니다 (org.restlet.engine.internal 패키지의 Activator 클래스 참조).

등록 된 서버에 등록 된 클라이언트에
  • 컨버터
  • 에게 등록 된 고객에 해당
  • 인증 자에 해당
  • 서버를 해당
    • 서버 :

      이 활성은 다음 사항을 알아 번들을 내부적으로 점검

      이 기능을 사용하려면 다음을 사용해야합니다. Activator 클래스가 지정된 org.restlet 번들의 MANIFEST 파일 만있는 Restart의 OSGi 에디션. 그렇지 않으면 번들 로딩 순서에 신경 쓸 필요가 없습니다.

      희망이 있습니다. 티에리

  • +0

    지적 해 주셔서 고맙습니다. 내가 restlet의 OSGi 버전을 사용하지만, 자동 등록 어쨌든 작동하지 않았다. 액티베이터가 호출되는지, 어떻게 작동하는지 확인하겠습니다. – Yves

    +0

    그것이 밝혀 짐에 따라 org.restlet 번들은 전혀 시작되지 않았습니다 (클래스가로드 된 경우 자동으로 활성화 될 것이라고 가정했으나 그렇지 않습니다). 어쩌면 나는이 점을 restlet 문서에서 놓쳤을 것이다. 내 문제를 해결할 때이 대답을 받아 들일 것입니다. – Yves

    +0

    보통, 춘분 컨테이너를 시작할 때 org.restlet 번들을 시작해야합니다. "start "을 사용하여 수동으로 시작하려고하면 오류가 있습니까? 또한 컨테이너에있는 번들 목록을 제공 할 수 있습니까 (ss 명령 사용)? 감사! –

    0

    Restlet이 클래스 공간을 분리했기 때문에 Restlet이 명시 적으로 확장을 포함하는 패키지를 가져 오지 않는다면 (그리고 그렇지 않아도 안된다), 패키지를로드 할 수 없습니다.

    가능한 해결책은 Restlet-bundle에 첨부 된 fragments이라는 확장자를 제공하는 것입니다. 따라서 번들 클래스 로더 (the documentation에 의하면 setting the Engines classloader으로 수행 할 수 있다고 말함)를 사용하게하면 해당 프래그먼트에서 클래스를로드 할 수 있습니다.

    0

    OSGi는 전체 클래스 공간을 볼 수있는 기능에 의존하기 때문에 실제로 작동하지 않습니다.

    OSGi에서 이것을 수행하는 방법은 확장을 위해 서비스 레지스트리를 사용하는 것이지만 OSGi 인식 라이브러리에서만 작동합니다.

    방법에 일부 도움이 있습니다 : 최근 OSGi 5 (Service Loader Mediator) 발표에서은 OSGi 서비스로 (으로 Restlet는하지만, 그 사용하는 경우 나도 몰라) '다리'META-INF/서비스에 대한 지원이되므로, '레거시 (Legacy)'라이브러리는 OSGi 내에서 잘 작동해야합니다.

    Spi-Fly이라는 Apache Aries의 구현이 있습니다. 나는 그것을 잠시 뒤돌아 보았다. 그것은 당신을 위해 속임수를 할 수도, 그렇지 않을 수도 있습니다.

    +0

    답장을 보내 주셔서 감사합니다. 나는 그것이 현재 나의 문제를 해결하기 때문에, 받아 들여진 대답을 티에리의 것으로 바꿨다. 그러나 앞서 언급 한 Service Loader Mediator는 어쨌든 미래에 도움이됩니다. – Yves

    +0

    확실한 것, 그게 전부인 것입니다. 그것이 도움이된다면 그것을 upvote 수 있습니다. –

    관련 문제