Java脚本引擎在哪里使用?

时间:2009-06-19 02:39:48

标签: java scripting

如何在Java中有效使用“脚本引擎”?

使用脚本引擎的所有正确用例是什么?

是否有使用“脚本引擎”的开源项目?

有一点可以想到“关闭,功能编程”支持是可能的,但它比“应用程序需求”更多地是技术用途。

可配置的插件没问题。但是仍然有很多模式(访问者,装饰者)在高层次上可以做同样的事情。

我不太了解这个要求......它如何有效地用于Java EE模式......它可以与现有模式相辅相成。

此外,我希望看到一些商业用例的更多答案。也许就像在销售期间根据会员资格或位置找到产品的复杂折扣。查找复杂算法的排名。特别是在某些情况下为什么不是Java? (或.NET世界中的C#)

4 个答案:

答案 0 :(得分:13)

在Java 6中,内置了脚本引擎支持。例如,

    // Create a script engine manager
    ScriptEngineManager factory = new ScriptEngineManager();

    // Create a JavaScript engine
    ScriptEngine engine = factory.getEngineByName("JavaScript");

    // Evaluate JavaScript code from String
    engine.eval("print('Hello, World')");

你为什么要用一个?一些原因:

  1. 你有一个脚本语言库,你想在Java中使用(例如你可以通过Jython运行的Python库)
  2. 您希望为客户提供可配置的编程机制,以便他们可以提供简短的代码段。例如,我过去曾这样做过,允许客户使用JavaScript编写过滤器(例如x< 2&y> 5&z> 10?)。
  3. 您可以通过直接在配置文件中编写脚本来在Ant等工具中实现更复杂的逻辑
  4. 您可以使用更适合该域的语言实现解决方案(例如,通过Clojure使用lambdas),但要保持对JVM的依赖。
  5. 实现包括Rhino(Javascript的Java实现),Jython(Java Python)等等。

答案 1 :(得分:12)

以下是我使用过它的一些情况。

1)Java想要调用脚本语言,例如1。我有一个Java应用程序,它通过WMD JavaScript小部件接受用户注释。 (实际上是StackOverflow使用的相同小部件。)用户以Markdown格式输入注释,并且名为Showdown的JavaScript库在两个位置将其转换为HTML:(1)在客户端上,以支持实时预览; (2)在服务器上,因为我希望客户端将纯Markdown发送到服务器并将其存储在那里,以便用户可以稍后编辑Markdown(而不是以某种方式将HTML反转为Markdown)。在服务器上存储注释时,我也会在那里运行转换,并将HTML存储在Markdown旁边,这样我就不必在显示注释列表时动态转换Markdown。为了确保服务器上的HTML与客户端上的HTML匹配,我想使用完全相同的Showdown库。所以我在Rhino JavaScript引擎中运行Showdown服务器端。

2)Java希望调用脚本语言,例如2. 我正在开发一个涉及不同角色的利益相关者的部署自动化应用程序,例如开发人员,系统管理员和发布工程师。整个应用程序(工作流和UI)是一个Java应用程序,但在不同的位置它调用各种脚本(例如Ruby,bash),例如推送包,验证配置,安装包,冒烟测试等。这部分是因为脚本表达目录创建,复制,移动,wgetting等更好/更经济,部分原因是拥有该特定部分的人知道如何使用脚本语言而不是Java。所以我们使用Java的Scripting API在这里调用脚本。不可否认,在这种情况下,我们可以只在Java之外执行脚本,但请参阅下面的#3。

3)脚本语言想要调用Java。在上述部署应用程序中,我们有基于Web的部署日志,我们付出了很多努力使部署日志易于阅读和尽可能理解,因为大型开发人员/ SQA /发布工程师人员会消耗日志,并不是每个人都了解部署的具体细节。漂亮的打印和颜色编码是该方法的一部分。我们在Java中实现了一个漂亮的打印部署日志API,但我们希望能够让脚本调用它。因此,例如当Ruby推送脚本运行时,我们希望它将其进度记录到漂亮的打印机。在JRuby中运行Ruby允许Ruby脚本看到Java漂亮的打印机API。

答案 2 :(得分:1)

“使用脚本引擎的所有正确用例是什么?”这是一个非常模糊的问题。有很多用例。以下是我能想到的一些内容:

  1. 插件/扩展系统
  2. IDE
  3. 带有现场演示的编程教程
  4. 我假设您特指JSR 223。如果是这样,您应该查看scripting.dev.java.net

答案 3 :(得分:1)

我没有专门使用过JavaScript,但我已将Groovy集成到我的应用程序框架中以提供特定于域的语言(DSL)。我创建了挂钩到我的应用程序中的函数和类。

允许用户编写应用程序(宏)中的常见操作脚本以及实现轻量级处理,以避免使用更重的代码编译器jar部署解决方案。如果用户想知道我的处理框架的插件,他们可以通过Groovy实时原型,并在有时间(或需要速度时)回到Java(甚至可能是本机)。请记住,脚本通常比Java / C#/ C / C ++慢几个数量级