Jruby:如何使用第三方java库?

时间:2015-06-09 07:33:16

标签: ruby-on-rails-3 jruby

我想使用java第三方qr代码库https://github.com/kenglxn/QRGen库来生成qr代码。

请指导我,因为我不知道如何在jruby中集成java库。

1 个答案:

答案 0 :(得分:1)

在这种情况下,诀窍是找到如何正确导入第三方库

  • 请使用任何依赖系统下载所需的罐子(我使用常春藤的蚂蚁)。
  • 这将根据您提到的qr代码库下载5个jar:core-2.0.jar core-3.1.0.jar javase-2.0.jar javase-3.1.0.jar jfreesvg-2.1.jar
对于ant:

build.xml

<project xmlns:ivy="antlib:org.apache.ivy.ant" name="" default="retrieve">
  <!--setproxy proxyhost="" proxyport="" proxyuser="" proxypassword=""/-->
  <target name="retrieve">
    <ivy:retrieve/>
  </target>
</project>
常春藤的

ivy.xml

<ivy-module version="2.0" >
  <info organisation="" module=""/>
  <dependencies defaultconf="default">
    <dependency org="net.glxn.qrgen" name="javase" rev="2.0"/>
  </dependencies>
</ivy-module>

现在输入ant retrieve将在lib子文件夹中下载并存储5个罐子。

如果您没有依赖关系管理器,以下是您需要手动下载的5个jars网址,您需要转到名为lib的子文件夹:

强烈建议您使用java依赖关系管理器,如果您希望有一天升级此代码段中使用的java库的修订版。

下一步是在同一文件夹中使用以下ruby snip.rb 代码。 :

require 'java'
%w[
  lib/core-2.0.jar
  lib/core-3.1.0.jar
  lib/javase-2.0.jar
  lib/javase-3.1.0.jar
  lib/jfreesvg-2.1.jar
].map &method(:require)

# this is the CRITICAL line to get it to work...
include_class 'net.glxn.qrgen.javase.QRCode' 

# get QR file from text using defaults
# this will write a file (example: QRCode7247556396487679822.png) in java.io.tmpdir as defined in your JVM
file = QRCode.from("Hello World").file()
p file.name

# get QR stream from text using defaults
# if we redirect the stream as a byte array, we can have a better file control
include_class 'java.io.FileOutputStream'
stream = QRCode.from("Hello World").stream()
fos = FileOutputStream.new("QRCode.png")
fos.write(stream.toByteArray())
fos.close()

# fun with VCards
include_class 'net.glxn.qrgen.core.vcard.VCard' 
johnDoe = VCard.new("John Doe")
johnDoe.setEmail("john.doe@example.org")
johnDoe.setAddress("John Doe Street 1, 5678 Doestown")
johnDoe.setTitle("Mister")
johnDoe.setCompany("John Doe Inc.")
johnDoe.setPhoneNumber("1234")
johnDoe.setWebsite("www.example.org")
stream = QRCode.from(johnDoe).stream()
fos = FileOutputStream.new("VCard.png")
fos.write(stream.toByteArray())
fos.close()

# all generated PNG can be decoded online using http://zxing.org/w/decode.jspx

请注意: jruby和java.io.tmpdir在这个特殊的jar案例中不能很好地协同工作,因为使用#file()创建QRcode的任何调用都会将文件存储在java.io中.tmpdir,无论它位于何处。你几乎无法控制文件位置。

所以我修改了原始代码答案,改为使用流,并创建更精细控制的文件。

您可以验证使用此有用网址生成的所有文件:http://zxing.org/w/decode.jspx