首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GroovyClassLoader层次结构与CompilerConfiguration

GroovyClassLoader层次结构与CompilerConfiguration
EN

Stack Overflow用户
提问于 2014-07-24 08:23:58
回答 1查看 147关注 0票数 0

问题:

  • 使用显式设置GroovyClassLoader创建CompilerConfiguration
  • 使用不同的GroovyClassLoader创建另一个CompilerConfiguration,设置BaseScriptClass并使用GCLA作为父级

-> --在GCLB中加载的脚本将不能正确设置BaseScriptClass (但是使用BaseScriptClass的潜在设置基标)

长篇小说:

我的应用程序使用四个Groovy脚本来允许对某些操作进行定制。每个脚本都提供了一个小的DSL,每个脚本的DSL是不同的。当该操作在应用程序中超出时,将调用相应的脚本。此外,一些通用的groovy脚本可以在应用程序启动时加载,用于存储公共数据或定义助手函数。

在应用程序开始时,脚本被大量地打印出来。

我的第一种方法是有一个GroovyClassLoader,它首先加载通用的groovy脚本,然后为每个脚本执行一个loadClass。DSL是通过在运行脚本之前将相应的元素添加到每个脚本的绑定中创建的。GroovyClassLoader使用带有typecheck扩展的CompilerConfiguration来检查脚本。

这很好,但有两个严重的限制:

  • 必须根据脚本的名称执行打字机(因为每个脚本的DSL是不同的)。
  • 由于必须处理所有四个DSL,所以打字机脚本变得相当复杂。

为了消除命名的限制,我尝试对每个脚本(即每个DSL)使用不同的GroovyClassLoader (以实际的ClassLoader作为父脚本),并设置相应的ScriptBaseClass,该ScriptBaseClass为DSL提供功能。这很好:排版代码大大减少了,我可以为每个DSL提供不同的打字脚本,我也不必弄乱脚本的名称。

,但是--我不能让它与普通的groovy脚本一起工作。一旦我尝试使用普通脚本的GroovyClassLoader作为DSL脚本的GroovyClassLoader的父级,DSL就不再获得正确的BaseScriptClass,尽管它是在CompilerConfiguration中明确设置的。子GroovyClassLoader似乎使用父GroovyClassLoaderBaseScriptClass

有什么办法让这件事起作用吗?

在我最初的文章中,更新了,我没有提到我正在使用scala。实际上,我尝试了以下代码片段:

代码语言:javascript
复制
val rootConfig = {
  val cf = new CompilerConfiguration(CompilerConfiguration.DEFAULT)
  cf.setSourceEncoding("UTF-8")
  cf.addCompilationCustomizers(new ASTTransformationCustomizer(classOf[CompileStatic]))
  cf
}

val childConfig = {
  val cfg = new CompilerConfiguration(CompilerConfiguration.DEFAULT)
  cfg.setSourceEncoding("UTF-8")
  cfg.setScriptBaseClass("NonExisting")
  cfg.addCompilationCustomizers(new ASTTransformationCustomizer(classOf[CompileStatic]))
  cfg
}

val rootGCL = new GroovyClassLoader(getClass.getClassLoader, rootConfig, false)
val childGCL = new GroovyClassLoader(rootGCL, childConfig, false)

这不起作用,子ClassLoader似乎完全忽略了CompilerConfiguration:它不会抱怨没有退出的BaseScriptClass,如果我关闭了rootConfig中的静态编译,它甚至不会执行静态检查。

--如果我将ClassLoader创建移动到ClassLoader文件中,一切都按预期的方式工作

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-24 09:53:20

GroovyClassLoader有几个构造函数。例如,一个用于ClassLoader,另一个用于GroovyClassLoader。GroovyClassLoader版本将采用它的配置。但是,如果您这样做,例如new GroovyClassLoader((ClassLoader) parent)或去给自己的配置。为此,将null作为配置甚至就足够了。构造函数逻辑将采用CompilerConfiguration.DEFAULT来配置GroovyClassLoader:new GroovyClassLoader(parent,null),如果您非常希望确保没有向GroovyClassLoader添加奇怪的路径,则使用带有布尔new GroovyClassLoader(parent,null,false)的变量

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24928580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档