(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会以某种方式使课程可用,但我似乎错过了一些东西。
答案 0 :(得分:1)
jirb
或jirb_swing
jirb
和jirb_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>
要运行使用第三方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