Java脚本引擎在哪些地方被使用?

10

如何有效地在Java中使用“Scripting Engine”?

什么情况下使用脚本引擎是正确的选择?

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

一件事情让人想到是,支持“闭包,函数式编程”,但这更多是技术上的用途,而不是“应用需求”。

可配置的插件可以使用。但是,许多高级模式(访问者、装饰器)仍然可以完成同样的任务。

我不太了解需求... 在Java EE模式中如何有效地使用它... 它可以与现有的模式相辅相成的领域。

此外,我想看到更多涉及业务场景的答案。例如,在促销期间基于会员或位置找到产品的复杂折扣;找到复杂算法的排名。尤其是为什么不在某些情况下使用Java?(或.NET世界中的C#)

4个回答

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 and y > 5 and z > 10 ?)。
  3. 你可以通过直接在配置文件中编写脚本来在Ant等工具中实现更复杂的逻辑
  4. 你可以使用更适合该领域的语言(例如,通过Clojure使用lambda),但保持对JVM的依赖。
实现包括Rhino(Javascript的Java实现)、Jython(Java Python)和许多其他选项。

3
注意:不能保证任何引擎将捆绑在JVM中,因此作为应用程序的一部分,您需要自行携带引擎。 - Thorbjørn Ravn Andersen

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。 我正在开发一个部署自动化应用程序,涉及不同角色的利益相关者,如开发人员、系统管理员和发布工程师。整个应用程序(工作流和用户界面)是一个Java应用程序,但在各个位置它调用各种脚本(例如Ruby、bash),例如用于推送包、验证配置、安装包、烟雾测试等。这部分是因为脚本更好/更经济地表达目录创建、复制、移动、wget等,部分原因是拥有该特定部分的人知道如何使用脚本语言而不是Java。因此,我们使用Java的脚本API来调用这里的脚本。诚然,在这种情况下,我们可以在Java之外执行脚本,但请参见#3。

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


1
“使用脚本引擎的所有正确用例是什么?”这是一个相当模糊的问题。有许多用例。以下是我能够立即想到的一些:
  1. 插件/扩展系统
  2. 集成开发环境(IDE)
  3. 带有实时演示的编程教程
我假设您特别指的是JSR 223。如果是这样,您应该查看scripting.dev.java.net

1

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接