Java脚本引擎在哪里使用?

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

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

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

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

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

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

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

在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编写filter(例如,x <2和y> 5,z> 10?)。
  3. 您可以通过直接在配置文件中编写脚本来在Ant等工具中实现更复杂的逻辑
  4. 您可以使用更适合该域的语言实现解决方案(例如,通过Clojure使用lambdas),但要保持对JVM的依赖。

实现包括Rhino(Javascript的Java实现),Jython(Java Python)等等。

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

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),例如推送包,validation配置,安装包,冒烟测试等。这部分是因为脚本表达目录创建,复制,移动,wgetting等更好/更经济,部分原因是拥有该特定部分的人知道如何使用脚本语言而不是Java。 所以我们使用Java的Scripting API在这里调用脚本。 不可否认,在这种情况下,我们可以只在Java之外执行脚本,但请参阅下面的#3。

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

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

  1. 插件/扩展系统
  2. IDE
  3. 带有现场演示的编程教程

我假设你特别指的是JSR 223 。 如果是这样,你应该看看scripting.dev.java.net

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

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