加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 08:54:01 所属栏目:安全 来源:网络整理
导读:我正在使用 Scala模板引擎( Scalate)在OSGi环境中运行时编译模板(Scala 2.9.1).模板无法预编译,因为它们是动态构建的. 为了使其工作,Scala编译器需要在OSGi环境中运行.但是,由于Scala编译器无法将类加载器作为输入,因此这不是开箱即用的. 根据我的研究,似乎
我正在使用 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)在bundle上下文之上创建一个虚拟文件系统,然后由Scala编译器使用.显然,Apache sling家伙successfully在旧版本的Scala上使用了这种方法.

有没有人让Scalate,Scala 2.9.1和OSGi一起动态编译模板?

解决方法

我的团队现在在OSGi中为Scalate提供Scala编译和执行.

通常,应为ScalaCompiler设置提供一组与相关OSGi包对应的AbstractFile对象.这由@michid引用的Guggla支持.但是虽然Guggla确实提供了AbstractFile层,但它还没有提供任何关于如何在OSGi环境中创建AbstractFile实例的示例或代码.可以在Sling项目(Guggla本身的起源)以及Scalate项目中找到执行后者的示例代码(请参阅ScalaCompiler,但请注意我们对其进行的更改).

我们从ServiceMix项目中选择了OSGi-ified scala包(compiler和library).请参阅scala-compiler软件包上的issue SMX-1048 (with patch).

我们最初的意图是让它在Scalate中工作,所以这个答案的其余部分是针对该项目的.

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

1)没有正确启用ScalaCompiler类的OsgiCompiler重写,因此bundle没有被检测为编译器的类路径输入,并且

2)模板执行(运行时)类加载器被设置为scalate-core bundle的类加载器,在运行时产生CNFE.

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读