java调用ruby代码

问题:

最近在做一个应用的时候碰到了一个问题。客户端需要调用服务器端传回的脚本信息,然后执行。其中脚本类型包括ruby。而java中调用ruby的代码大致如下:

1 String jrubyCode="puts 'hello world'";
2 ScriptEngineManager manager = new ScriptEngineManager();
3 ScriptEngine engine = manager.getEngineByName("jruby");
4 engine.eval(jrubyCode);

却发现最后getEngineByName("jruby")老是返回null。网上搜了很多解决办法都没有解决。

原因:

目前jdk里面内嵌的好像只有支持最基本的js调用的引擎,对于其他的脚本语言调用,需要用到对应的脚本引擎jar包。

解决办法:

百度了很多都无果,最终google出了解决办法。

1. 去jruby官网下载最新的jruby工具包:http://jruby.org/download。(Linux直接下载最新的tar.gz包,windows根据系统分别下载64位或者32位包)

2. 安装或者解压对应的jruby到特定的目录,并且模仿java_home设置jruby_home和path。

3. 引入解压或者安装之后程序lib目录下的jruby,jar包到工程中。

PS: jdk1.7或以上。

知其然还要知其所以然,接下来我们来解析为什么需要上面三个步骤。

其实可以发现此jruby.jar包中有一个org.jruby.embed.jsr223目录,该目录结构大致如下图所示:

我们可以看到JRubyEngineFactory的实现,注意其getScriptEngine方法,里面有用到ScriptContainer,这表示一个脚本容器。查看该类对应的构造方法:

可以看到其构造方法调用了initRubyInstanceConfig方法,该方法根据JRUBY_HOME对应的路径去找对应的jruby实例。这就完美的说明了前面三个步骤的原因。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏彭湖湾的编程世界

【webpack】流行的前端模块化工具webpack初探

有一天我突然意识到一个问题,在使用react框架搭建应用时,我使用到了sass/less,JSX模版以及ES6的语法在编辑器下进行开发,使用这些写法是可以提高开...

904
来自专栏从零开始学自动化测试

python+requests接口自动化项目完整框架设计

前言 有很多小伙伴吵着要完整的项目源码,完整的项目属于公司内部的代码,这个是没法分享的,违法职业道德了,就算别人分享了,也只适用于本公司内部的业务。 所以用例的...

3075
来自专栏青玉伏案

Swift3.0服务端开发(二) 静态文件添加、路由配置以及表单提交

今天博客中就来聊一下Perfect框架的静态文件的添加与访问,路由的配置以及表单的提交。虽然官网上有聊静态文件的访问的部分,但是在使用Perfect框架来访问静...

1907
来自专栏野路子程序员

从已有安装包(vendor)恢复 composer.json

2465
来自专栏deepfakes

fakeapp,faceswap等deepfakes换脸软件对比

目前用于深度换脸的程序基本都是用python编程语言基于tensorflow进行计算。以下列出几款常用的换脸程序优缺点浅析,用户可以根据自己的爱好和水平来选择,...

75512
来自专栏烂笔头

Python Webdriver 重新使用已经打开的浏览器实例

目录[-] 因为Webdriver每次实例化都会新开一个全新的浏览器会话,在有些情况下需要复用之前打开未关闭的会话。比如爬虫,希望结束脚本时,让浏览器处于空...

5906
来自专栏彭湖湾的编程世界

【webpack】流行的前端模块化工具webpack初探

从开发文件到生产文件 有一天我突然意识到一个问题,在使用react框架搭建应用时,我使用到了sass/less,JSX模版以及ES6的语法在编辑器下进行开发,使...

2066
来自专栏LIN_ZONE

laravel + vue +element + vux 初使用遇见的问题

之前,参加一个项目,中用的是 laravel5.4+vue+element+vux 刚开始用的时候,有点懵,记录下来与大家共勉

601
来自专栏weixuqin 的专栏

scrapy 调试功能

1362
来自专栏smy

prompt() 方法,弹框带输入框

prompt()  有alert的风格,却带着输入框,这是怎么实现的呢? 语法 prompt(text,defaultText) 参数 描述 t...

3605

扫码关注云+社区