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..."
即执行成功