2012-01-20 3 views
8

OSGi 환경 (Scala 2.9.1) 내에서 런타임에 템플릿을 컴파일하기 위해 Scala 템플릿 엔진 (Scalate)을 사용하고 있습니다. 동적으로 빌드되기 때문에 템플릿을 미리 컴파일 할 수 없습니다.OSGi 런타임 내에서 작동하도록 scala 컴파일러 얻기

이렇게하려면 Scala 컴파일러가 OSGi 환경 내에서 실행되어야합니다. 그러나 스칼라 컴파일러는 클래스 로더를 입력으로 사용할 수 없으므로이 기능은 기본적으로 작동하지 않습니다. 내 연구에서

은 일반적으로 두 가지 솔루션에 접근이있을 나타납니다.

1) 스칼라 컴파일러 플러그인 (there is one started here하지만 2009 접촉되지 않았으며, messages on the scala list in 2009가 생산 사용에 대한 준비가되어 있지 않았다 말했다

2) Scala 컴파일러에서 사용할 수있는 번들 컨텍스트 위에 가상 파일 시스템 만들기. 외관상으로는 Apache sling guys는 이전 버전의 스칼라에서 successfully을이 방법으로 사용했습니다.

동적으로 템플릿을 컴파일하기 위해 Scalate, Scala 2.9.1 및 OSGi를 함께 사용하는 사람이 있습니까?

+1

Apache Sling의 Scala 스크립팅 엔진이 https://github.com/guggla/guggla에서 자체 홈으로 이동했습니다. 현재 스칼라 2.9에 있지만 2.9.1에서 작동시키기가 너무 어렵지 않아야합니다. 자세한 내용은 내 세션 슬라이드 http://people.apache.org/~mduerig/scala4sling/ 및 http://people.apache.org/~mduerig/scala4scripting/ – michid

+0

@michid : 우수 링크 링크를 참조하십시오. 더 조사 할 것이다. – Raman

답변

3

이제 우리 팀은 OSGi 내에서 Scalate를 위해 Scala 컴파일 및 실행을 수행합니다.

일반적으로 ScalaCompiler 설정에는 관련 OSGi 번들에 해당하는 AbstractFile 객체 세트가 제공되어야합니다. 이것은 @michid에 의해 참조 된 Guggla에 의해 지원됩니다. 그러나 Guggla는 AbstractFile 레이어를 제공하지만 아직 OSGi 환경에서 AbstractFile 인스턴스를 만드는 방법에 대한 예제 나 코드는 제공하지 않습니다. 후자를 수행하는 예제 코드는 슬링 프로젝트 (Guggla 자체의 기원)와 Scalate 프로젝트 (ScalaCompiler 참조)에서 찾을 수 있습니다 (아래의 변경 사항을 참고하십시오).

ServiceMix 프로젝트에서 OSGi-ified scala bundles (compilerlibrary)를 선택했습니다. 스칼라 컴파일러 번들의 issue SMX-1048 (with patch)을 참조하십시오.

우리의 원래 의도는 Scalate에서이 작업을 수행하는 것이 었으므로 나머지는이 프로젝트에만 해당됩니다.

Scalate 코드에는 컴파일러 클래스 경로 설정뿐만 아니라 가상 AbstractFile 레이어를 포함하여 OSGi 환경에서 작동하는 데 필요한 대부분의 로직이 이미있었습니다. 을

1) ScalaCompiler 클래스의 OsgiCompiler 재정이 제대로 활성화되지되었고, 그래서이 컴파일러 클래스 경로 입력으로 감지되지 않는 한 번들 및

그러나 우리는 작업을 진행하게 ( https://github.com/scalate/scalate/pull/16) Scalate 패치 필요

2) 템플릿 실행 (런타임) 클래스 로더가 scalate-core 번들의 클래스 로더로 설정되어 런타임시 CNFE가 발생했습니다.

위의 끌어 오기 요청은 OSGi 환경에서 Scalate를 런타임에 스레드 컨텍스트 클래스 로더를 기본값으로 구성합니다. 이는 호출자가 명시 적으로 주입하지 않아도 호출자의 클래스 로더에 대한 참조를 얻는 가장 쉬운 방법 인 것 같습니다. 예를 들어 템플릿 서비스를 내보내는 Spring-DM osgi:service 선언은 context-class-loader="service-provider" 속성을 사용하여이를 자동으로 설정할 수 있습니다. Scalate OSGi의 런타임 동작은 이미 TCCL을 사용하는 기존의 컴파일 타임 동작과 일치합니다.

따라서 Scalate 호출자는 TCCL을 자체 클래스 로더로 설정하거나 명시 적으로 원하는 클래스 로더를 템플릿 엔진에 삽입해야합니다. templateEngine.classLoader = ... 템플릿을 실행하기 전에

업데이트 2012 년 7 월 31 일 : Scalate master에이 게시물에 언급 된 모든 패치가 포함되었습니다.

업데이트 : 2013 년 4 월 10 일 : Scala 컴파일러를 통해 런타임 템플릿을 컴파일 할 때 Scalate 1.6.1은 OSGi와 호환됩니다. 또한 Scala 2.10 이상은 출시 된 유효한 OSGi 번들입니다.

0

친구 정책을 설정해야한다고 생각합니다. 다음은 도움이 될 것입니다. 번들에서 http://help.eclipse.org/indigo/topic/org.eclipse.platform.doc.isv/reference/misc/bundle_manifest.html

http://www.eclipsezone.com/eclipse/forums/t90282.html

http://wiki.eclipse.org/index.php/Context_Class_Loader_Enhancements#Buddy_Policy

당신은 당신이 다른 번들과 동일한 클래스 로더를 사용하는 것이 필요하다고 할 수 있습니다.

+0

문제는 수업 가시성 중 하나가 아니므로이 답변이 적절하다고 생각하지 않습니다. – Raman

관련 문제