【问题标题】:What are the pros and cons of using GroovyClassLoader vs. GroovyShell使用 GroovyClassLoader 与 GroovyShell 的优缺点是什么
【发布时间】:2010-12-03 03:59:27
【问题描述】:

我需要从我的 Java 应用程序中运行一些外部代码,这些代码会经常更新并且与应用程序的其余部分正交。由于我不会为每次代码更改(以及其他原因)重新部署整个应用程序,因此我们选择为此代码使用 groovy,并将其存储在文件系统或数据库中。

From the documentation 我知道我有两种运行代码的方法 - 使用 GroovyShell 或 GroovyClassLoader(此处不适合 eval)

每种方法的优缺点是什么?

【问题讨论】:

    标签: java groovy groovyshell groovyclassloader


    【解决方案1】:

    GroovyShell 在下面使用 GroovyClassLoader。除非您需要仅由 GroovyClassLoader 提供的功能,否则请使用 GroovyShell。

    【讨论】:

    • 但是 GroovyShell 会缓存执行的脚本吗?
    • 我不是专家,我只是开始我自己的 groovyshell 嵌入,但编译器配置类包括 /** * 获取编写类的目标目录。 */ public File getTargetDirectory() { return this.targetDirectory; }
    【解决方案2】:

    GroovyShell 使用默认的类加载器,直到您在自定义类路径的脚本中加载某些内容,然后它会切换到自定义的 GroovyClassLoader,这可能会导致加载一些 jdbc 驱动程序或 jndi 项目等问题...所以,如果您的默认类加载器已经有了它需要的类路径,并且如果你可以避免在你的 Java 代码中实例化一个新的 GroovyClassLoader 对象,那么用一个简单的 GroovyShell 加载一个 shell 脚本将使用默认的类加载器,你会更好。

    希望我能理解你的问题。

    【讨论】:

    • 我有一个 Java 应用程序,它包装了一些逻辑,这些逻辑是用 groovy 中的自定义 DSL 编写的。 Java 应用程序的代码很少更改,groovy 代码(DSL)经常更改。我不会每次都解释 DSL 代码,而是编译为字节码以供以后执行。 GroovyShell 能做到吗?
    • 如果你的目的是编译成字节码,那为什么要使用 Groovy?此外,经常更改的部分似乎适合动态编译而不是预编译。就个人而言,对于 DSL,我会使用 XTend 而不是 Groovy。每个人都有自己的喜好。
    • 更改频繁意味着一个脚本可以每月更改一次,但一天总共有几十个更改(我们管理的脚本超过 2500 个)。所以我们有足够多的更改,我们不想重新部署,但是每个代码很少更改,所以我希望它被编译。关于 XTend - 它看起来不错,但问题是(a)我可以动态加载它吗? (b) 其背后的社区规模有多大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 2012-05-12
    相关资源
    最近更新 更多