JRuby——Java和Ruby的强强联合
什么是JRuby
JRuby是一个纯Java实现的Ruby解释器。通过JRuby,你可以在JVM上直接运行Ruby程序,调用Java的类库。很多Java编写的Ruby IDE都是使用JRuby来解释语法的。
JRuby,JVM下的一个开源Ruby解释器,能够在Java里面使用Ruby类库。就像标准的Ruby解释器一样,除开使用Ruby调用本地方法(C代码)或者Java类库以外,Ruby代码都能够在JRuby里面正确执行。
为什么JRuby
除了适合用来开发面向Internet 的Web 应用之外,还有很多公司将JRuby 看作是使Rails 进入企业应用的关键技术,例如ThoughtWorks。JRuby 允许Rails 应用部署在流行的Java 应用服务器中,很多企业早已建立了这样的运行环境,但因为某些原因无法为运行Rails 应用建立一个全新的运行环境。任何技术的流行,深究起来,其背后都有经济上的原因。Rails 能够达到5 倍于SSH 的开发效率,使它成为了一个几乎无法被抗拒的选择。Rails 进入企业应用,只是一个时间问题,它的前景十分光明。
下载和安装JRuby
到JRuby的官方网站: http://jruby.org/
图:JRuby官方网站截图
下载最新版本的JRuby。这里边有windows版本和linux还有macos版本的,你可以根据你自己的环境下载相应的版本。
下载完成之后解压缩,然后到解压后的目录,我们下文中提到的目录<JRUBY_HOME>就是默认的解压根目录。
在<JRUBY_HOME>下执行binjruby -v
如果出现如下提示则表示成功运行:
图:验证JRuby是否成功运行
运行第一个JRuby程序
在<JRUBY_HOME>下的samples目录下新建文件random.rb,加入如下程序:
1 require 'java'
2 include_class 'java.util.Random'
3 r = Random.new(123)
4 puts "Some random number #{r.nextInt % 10}"
5 r.seed = 456
6 puts "Another random number #{r.nextInt % 10}"
然后执行如下命令:
图:运行JRuby random.rb
就会得到对应的结果。
其中Java调用JRuby和JRuby调用Java的例子可以在下面的链接中看到,写的很详细:
https://github.com/jruby/jruby/wiki/JRubyAndJavaCodeExamples
在JRuby运行Swing
在上面的例子运行成功后,我们接下来运行swing的例子,在sample目录下新建文件swing2.rb,输入如下内容:
1 # Import Java packages
2 include Java
3
4 import javax.swing.JFrame
5
6 frame = JFrame.new("Hello Swing")
7 button = javax.swing.JButton.new("Klick Me!")
8 button.add_action_listener do |evt|
9 javax.swing.JOptionPane.showMessageDialog(nil, <<EOS)
10 <html>Hello from <b><u>JRuby</u></b>.<br>
11 Button '#{evt.getActionCommand()}' clicked.
12 EOS
13 end
14
15 # Add the button to the frame
16 frame.get_content_pane.add(button)
17
18 # Show frame
19 frame.set_default_close_operation(JFrame::EXIT_ON_CLOSE)
20 frame.pack
21 frame.visible = true
然后执行binjruby samplesswing2.rb
我们可以看到调用的Swing程序:
图:JRuby调用Swing程序
使用netbeans开发JRuby
到netbeans官方网站上下载
netbeans,因为最新版本安装这个插件有问题,所以这里下载的是netbeans7.1.1。
安装完成后到netbeans选择菜单“工具->插件”,将出现如下界面:
图:netbeans安装Ruby插件的界面
然后按照这篇文章中的描述,下载对应的文件,选择安装:
http://blog.enebo.com/2012/01/workaround-for-ruby-support-on-netbeans.html。
然后点击“工具->Ruby平台”,配置Ruby环境,因为我们选用的是JRuby,所以这里配置解析器为JRuby。
图:JRuby平台的环境配置
新建一个ruby应用
图:新建Ruby应用
然后选择工作空间和编译环境:
图:选择工程空间和编译环境
点击完成,然后在生成的main.rb文件中输入:
1 class ADuck
2 def quack()
3 puts "quack A";
4 end
5 end
6
7 class BDuck
8 def quack()
9 puts "quack B";
10 end
11 end
12
13 # quack_it doesn't care about the type of the argument duck, as long
14 # as it has a method called quack. Classes A and B have no
15 # inheritance relationship.
16 def quack_it(duck)
17 duck.quack
18 end
19
20 a = ADuck.new
21 b = BDuck.new
22 quack_it(a)
23 quack_it(b)
点击运行或者按F6,就可以看到运行的结果。
- 介绍一种非常好用汇总数据的方式GROUPING SETS
- 史上最大的CPU Bug(幽灵和熔断的OS&SQLServer补丁)
- 数据库副本的自动种子设定(自增长)
- Git 项目推荐 | 基于go+protobuff 实现的分布式
- ReflectASM-invoke,高效率java反射机制原理
- Web应用渗透测试-本地文件包含
- shiro权限控制(二):分布式架构中shiro的实现
- Groovy实现原理分析——准备工作
- HBCTF第一场2个pwn题的简单分析
- ACM竞赛之输入输出(以C与C++为例)
- 能让程序做的事情坚决不用人来做——批量修复markdownlint MD034警告
- swift demo1 tableview
- Swift Alamofire
- 给Ocelot做一个Docker 镜像
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 用Python网络爬虫来看看最近电影院都有哪些上映的电影
- 使用 Azure Blob Stoage 实现一个静态文件服务器
- java学习--反射详解
- Redis中的管道Pipeline操作
- 查看YARN任务日志的几种方式
- 简易数字频率计(verilog HDL设计)(2020维护版本)
- C++核心准则CP.111:如果真的需要好双重检查锁,使用惯用模式
- C++核心准则CP.200:使用volatile只能表明该变量是非C++内存
- C++核心准则E.2:通过抛出异常来表明函数无法执行指定的任务
- C++核心准则E.3:异常应该只用于错误处理
- [Go] GO语言实战-gin框架项目实现中英文切换
- [Go] Go语言实战-基于websocket浏览器通知的实现
- 快10年的老前端了,我还分不清 slice 和 splice,这到底是谁的锅
- 第4章 Jenkins系统用户认证配置管理
- 回答公众号留言的2个关于相关性分析的问题