`
s8186255
  • 浏览: 85704 次
  • 性别: Icon_minigender_1
  • 来自: 新疆乌鲁木齐
社区版块
存档分类
最新评论

ruby通过RJB调用jar包

阅读更多

java从小做大的过程中留下诸多可以重复使用jar包,尤其在企业应用中。各个公司提供的开发包都是以dll或者jar包。要想使得ruby开发走入企业,走入高端,必须有兼容性。jruby调用jar包就像java调用jar一样,但是jruby的特点,这里不再赘述。我们还是看看原始的cruby如何调用jar。

实际上ibm网站上有一篇文章,似乎也是唯一的一篇,说到这个。我这里实际上就是基于这篇文章进行实际操作,并处理诸多问题后的一个学习笔记。

 

jar包是java的一个工具jar打成的一个zip包,除了打包,还可以部署软件。
jar包就是将class打成一个包。

整体思路:
1.安装RJB:gem install rjb。在ruby代码中,require 'rjb',可以在irb环境中做简单测试。以下也是可以这样做。

2.然后配置jar环境,同时需要配置java环境,通过 java -version,可以检测是否正常
Rjb::load(CLASSPATH = '.:/home/saq/app/down/javatar-2.5/jars/tar.jar', jvmargs=[])
注意这里的CLASSPATH是大写,也就是与系统中定义的classpath是一致的。(按照ibm的一篇文章,在这里遇到麻烦。)

3.可以使用这个jar包。
实际上jar包就是一个有目录结构的zip包。如何使用,打开jar包就可以看到。
比如这个javatar-2.5
class-com-ice-tar-*
这里面有许多class。
我们选中一个:TarArchive,使用下面语句
tararchive = Rjb::import('com.ice.tar.TarArchive')
看到如下结果:
=> #<Rjb::Com_ice_tar_TarArchive:0x2aaaae884108>
呵呵,对象创建成功,与前面使用string创建对象类似。

 

完整的案例解释
# 将rjb模块注入,有时候需要同时注入rubygems
require 'rubygems'
require 'rjb'

 

# 注入 jar包,同时配置虚拟机环境,一般缺省,注意这里的classpath,与/etc/profile中的环境变量classpath相同。一般配置为大写CLASSPATH,表示为常量。最好在现有环境测试echo $CLASSPATH,如果有值,则是正确的。下面的写法的自己的理解:.点代表当前的值,:表示并集,与后面的jar包一并是classpath中的内容。所有这个jar包的目录结构务必准确。
Rjb::load(CLASSPATH = '.:/home/saq/app/down/javatar-2.5/jars/tar.jar', jvmargs=[])

 

#使用jar包中的某个类,创建ruby类。参照前面的描述。
tararchive = Rjb::import('com.ice.tar.TarArchive')

#使用java的非jar包,也就是java的原始包中的类,创建对象。文件流类,ruby类。
fileinputstream = Rjb::import('java.io.FileInputStream')

#创建file类,ruby类
file = Rjb::import('java.io.File')

 

#利用三个ruby类创建带有参数的实例

file_instance = file.new_with_sig('Ljava.lang.String;','.')

fileinputstream_instance = fileinputstream.new_with_sig('Ljava.lang.String;','test.tar')#这里将绝对路径写准确,就不会出错。

tararchive_instance = tararchive.new_with_sig('Ljava.io.InputStream;',fileinputstream_instance)

 

p 'Extracting file.....'

 

#调用java类定义的方法。通过_invoke,或者直接调用。
tararchive_instance.extractContents(file_instance)

p 'Done...'

 

假设将上述文件命名为tar.rb
运行:ruby tar.rb,看到
"Extracting file....."
"Done..."
即执行成功

0
0
分享到:
评论
2 楼 trace12 2010-12-18  
这个东东有人实际应用过吗?效率如何阿?
1 楼 vwangzhen 2010-08-10  
    Rjb::load(classpath = ".:#{RAILS_ROOT}/lib/empp.jar", jvmargs=[])
    emppAnswer = Rjb::import('com.wondertek.esmp.esms.empp.EMPPAnswer')
NoClassDefFoundError: com/wondertek/esmp/esms/empp/EMPPAnswer
        from (irb):12:in `import'
        from (irb):12


为什么我每次导改的时候报错
是不是环境配置有错

相关推荐

Global site tag (gtag.js) - Google Analytics