gpt4 book ai didi

scala - 让 scala 编译器在 OSGi 运行时中工作

转载 作者:行者123 更新时间:2023-12-04 08:45:41 25 4
gpt4 key购买 nike

我正在使用 Scala 模板引擎 (Scalate) 在 OSGi 环境 (Scala 2.9.1) 中运行时编译模板。模板无法预编译,因为它们是动态构建的。

为了使其工作,Scala 编译器需要在 OSGi 环境中运行。但是,由于 Scala 编译器不能将类加载器作为输入,所以这不是开箱即用的。

根据我的研究,似乎有两种通用的解决方法:

1) 一个 Scala 编译器插件(there is one started here,但自 2009 年以来就没有被触及,messages on the scala list in 2009 表示它还没有准备好用于生产用途。

2) 在捆绑上下文之上创建一个虚拟文件系统,然后可以由 Scala 编译器使用。显然 Apache 吊索家伙有 successfully在旧版本的 Scala 上使用了这种方法。

有没有人让 Scalate、Scala 2.9.1 和 OSGi 一起工作来动态编译模板?

最佳答案

我的团队现在可以在 OSGi 中为 Scalate 进行 Scala 编译和执行。

一般来说,ScalaCompiler 设置应该提供一组 AbstractFile 对象,这些对象对应于相关的 OSGi 包。 Guggla 支持此功能正如@michid 所引用的。但是,虽然 Guggla 确实提供了 AbstractFile 层,但它还没有提供任何示例或代码来说明如何在 OSGi 环境中创建 AbstractFile 实例。后者的示例代码可以在 Sling 项目(Guggla 本身的起源)以及 Scalate 中找到。项目(见 ScalaCompiler 但请注意我们在下面对其所做的更改)。

我们从 ServiceMix 项目中选择了 OSGi 化的 scala 包(compilerlibrary)。见 issue SMX-1048 (with patch)在 scala 编译器包上。

我们最初的意图是让这个在 Scalate 中工作,所以这个答案的其余部分是特定于那个项目的。

Scalate 代码已经具备在 OSGi 环境中工作所需的大部分逻辑,包括虚拟 AbstractFile 层以及设置编译器类路径。然而,我们需要修补 Scalate ( https://github.com/scalate/scalate/pull/16 ) 以使其正常工作:

1) ScalaCompiler 类的 OsgiCompiler 覆盖未正确启用,因此未将捆绑包检测为编译器的类路径输入,并且

2) 模板执行(运行时)类加载器被设置为 scalate-core 包的类加载器,导致运行时出现 CNFE。

上面的拉取请求将 OSGi 环境中的 Scalate 配置为在运行时默认为线程上下文类加载器。这似乎是获得对调用者类加载器的引用的最简单方法,而调用者不必显式注入(inject)它(例如,导出模板服务的 Spring-DM osgi:service 声明可以使用 context-class-loader="service-provider" 属性自动设置它. 这也使得 Scalate OSGi 的运行时行为与已经使用 TCCL 的现有编译时行为相对应。

因此,Scalate 的调用者应该将 TCCL 设置为它自己的类加载器,或者将所需的类加载器显式注入(inject)模板引擎,例如templateEngine.classLoader = ...在执行模板之前。

2012 年 8 月 31 日更新:Scalate master 现在包含本文中提到的所有补丁。

2013 年 4 月 10 日更新:Scalate 1.6.1,通过 Scala 编译器进行运行时模板编译,与 OSGi 兼容。此外,Scala 2.10 及更高版本是已发布的有效 OSGi 捆绑包。

关于scala - 让 scala 编译器在 OSGi 运行时中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8935796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com