从(例如)JRuby irb中的jar文件中定义的访问类?

时间:2017-08-18 13:25:22

标签: java jruby

(Crossposting note:我在一周前在JRuby邮件列表中问过这个问题,但还没有得到任何答案)。

我有一个由其他人提供的jar文件,无法访问源代码。 jar文件位于lib / other / appl.jar中,该类名为Appl,包为com.abc.xyz

我想从JRuby irb,jirb_swing_ex实例化一个Appl对象。

(当然我的问题不仅适用于jirb,而且适用于一般运行JRuby程序,但我现在以我现在使用它的方式解释它,以防万一Jirb有一些特殊需要特殊待遇)。

这就是它的工作方式

(1)通过以下方式调用jirb:

java -jar jr/jruby-complete-1.7.27 jb/jirb_swing_ex

(2)将带有jar文件的目录放入加载路径:

$: << 'lib/other'

(3)加载jar文件

require 'appl.jar'

(4)导入课程

java_import com.abc.xyz.Appl

(5)创建对象

x = Appl.new

正如我所说,这是有效的,如果有必要,我可以忍受它,但我更喜欢更简单的方法:

现在我的问题:我认为可以让Java已经包含jar文件,而不是摆弄加载路径并为Jar文件执行require。这就是我的尝试:

java -cp lib/other/appl.jar -jar jr/jruby-complete-1.7.27 jb/jirb_swing_ex

问题是:我怎样才能找到我的对象?如果我只使用类名 com.abc.xyz.Appl ,则JRuby会抱怨找不到类( NameError:缺少类名)。

顺便说一下,我也试过正斜杠(因为我在Windows上),即

java -cp lib\other\appl.jar -jar jr\jruby-complete-1.7.27 jb\jirb_swing_ex

但效果相同。我原本以为,在我的课程路径中使用appl.jar会以某种方式使课程可用,但我似乎错过了一些东西。

1 个答案:

答案 0 :(得分:1)

使用自定义类路径

运行jirbjirb_swing

jirbjirb_swing将使用JRUBY_CP环境变量(如果存在)的值来扩展给予Java命令行的类路径。

使用从我的本地maven存储库获取的commons-lang3库的示例,在Linux或macOS上使用bash:

$ export JRUBY_CP=${HOME}/.m2/repository/org/apache/commons/commons-lang3/3.4/commons-lang3-3.4.jar

$ jirb
irb(main):001:0> org.apache.commons.lang3.mutable.MutableBoolean.new
=> #<Java::OrgApacheCommonsLang3Mutable::MutableBoolean:0x7c24b813>

使用自定义类路径运行JRuby程序

要运行使用第三方java库的JRuby程序,这将不起作用:

java -cp lib/other/appl.jar -jar jr/jruby-complete-1.7.27 ...

您必须使用either -jar or -cp, you can't combine the two 来自java手册页:

  

当您使用此选项[-jar]时,JAR文件是所有用户类的源,并忽略其他用户类路径设置。

此外,您需要传递主要的Java类,即org.jruby.Main,并且该类需要参数:要么是Ruby脚本的路径,要么是其他命令行参数,例如-e 'puts 2+2'

所以命令行结构如下:

# Run script file:
java -cp path/to/jruby.jar:other/custom.jar org.jruby.Main path/to/script
# Run simple one-line Ruby program
java -cp path/to/jruby.jar:other/custom.jar org.jruby.Main -e 'some ruby here'

(在Windows上,请使用;代替:作为分隔符)

具有相同commons-lang3库和&amp;的实际示例OS:

$ alias myjruby="java -cp ${JRUBY_HOME}/lib/jruby.jar:${HOME}/.m2/repository/org/apache/commons/commons-lang3/3.4/commons-lang3-3.4.jar org.jruby.Main"

# Verifying base jruby code works with that:
$ myjruby -e 'puts 2+2'
4

# Now verifying it can use my 3rd-party lib:
$ myjruby -e 'puts org.apache.commons.lang3.mutable.MutableBoolean.new'
false