如何在Java中有效使用“脚本引擎”?
使用脚本引擎的所有正确用例是什么?
是否有使用“脚本引擎”的开源项目?
有一点可以想到“关闭,功能编程”支持是可能的,但它比“应用程序需求”更多地是技术用途。
可配置的插件没问题。但是仍然有很多模式(访问者,装饰者)在高层次上可以做同样的事情。
我不太了解这个要求......它如何有效地用于Java EE模式......它可以与现有模式相辅相成。
此外,我希望看到一些商业用例的更多答案。也许就像在销售期间根据会员资格或位置找到产品的复杂折扣。查找复杂算法的排名。特别是在某些情况下为什么不是Java? (或.NET世界中的C#)
答案 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')");
你为什么要用一个?一些原因:
实现包括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)
“使用脚本引擎的所有正确用例是什么?”这是一个非常模糊的问题。有很多用例。以下是我能想到的一些内容:
我假设您特指JSR 223。如果是这样,您应该查看scripting.dev.java.net
答案 3 :(得分:1)
我没有专门使用过JavaScript,但我已将Groovy集成到我的应用程序框架中以提供特定于域的语言(DSL)。我创建了挂钩到我的应用程序中的函数和类。
允许用户编写应用程序(宏)中的常见操作脚本以及实现轻量级处理,以避免使用更重的代码编译器jar部署解决方案。如果用户想知道我的处理框架的插件,他们可以通过Groovy实时原型,并在有时间(或需要速度时)回到Java(甚至可能是本机)。请记住,脚本通常比Java / C#/ C / C ++慢几个数量级