如何有效地使用Java中的"脚本引擎"?
使用脚本引擎的所有正确用例是什么?
是否有使用"脚本引擎"的开源项目?
有一点我想到的是"关闭,功能编程"支持是可能的,但它比"应用程序需求"更多地是技术用途.
可配置的插件都可以.但是仍然有很多模式(访客,装饰师)在高层次上可以做同样的事情.
我不太了解这个要求......它如何有效地用于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')");
你为什么要用一个?一些原因:
你有一个脚本语言库,你想在Java中使用(例如,你可以通过Jython运行的Python库)
您希望为客户提供可配置的编程机制,以便他们可以提供简短的代码片段.例如,我在过去做过这个,允许客户使用JavaScript编写过滤器(例如x <2和y> 5,z> 10?).
您可以通过直接在配置文件中编写脚本来在Ant等工具中实现更复杂的逻辑
您可以使用更适合该域的语言实现解决方案(例如,通过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),例如推送包,验证配置,安装包,冒烟测试等.这部分是因为脚本表达目录创建,复制,移动,wgetting等更好/更经济,部分原因是拥有该特定部分的人知道如何使用脚本语言而不是Java.所以我们使用Java的Scripting API在这里调用脚本.不可否认,在这种情况下,我们可以只在Java之外执行脚本,但请参阅下面的#3.
3)脚本语言想要调用Java.在上述部署应用程序中,我们有基于Web的部署日志,我们花了很多精力使部署日志尽可能易于阅读和理解,因为大型开发人员/ SQA /发布工程师人员使用日志,并且并非所有人都了解部署的具体细节.漂亮的打印和颜色编码是该方法的一部分.我们在Java中实现了一个漂亮的打印部署日志API,但我们希望能够让脚本调用它.因此,例如当Ruby推送脚本运行时,我们希望它将其进度记录到漂亮的打印机.在JRuby中运行Ruby允许Ruby脚本查看Java漂亮的打印机API.