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

Java 从(例如)JRuby irb中访问jar文件中定义的类?,java,jruby,Java,Jruby,(交叉发帖:我一周前在JRuby邮件列表上问过这个问题,但还没有得到任何答案) 我有一个别人提供的jar文件,无法访问源代码。jar文件位于lib/other/appl.jar中,类名为appl,包名为com.abc.xyz 我想从JRuby irb中实例化一个Appl对象,jirb_swing_ex (当然,我的问题不仅适用于jirb,而且也适用于运行一般的JRuby程序,但我以我现在使用它的方式解释了它,以防jirb中有一些需要特殊处理的特性) 这就是它的工作方式: (1) 通过以下方式调用

(交叉发帖:我一周前在JRuby邮件列表上问过这个问题,但还没有得到任何答案)

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

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

(当然,我的问题不仅适用于jirb,而且也适用于运行一般的JRuby程序,但我以我现在使用它的方式解释了它,以防jirb中有一些需要特殊处理的特性)

这就是它的工作方式

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

java -jar jr/jruby-complete-1.7.27 jb/jirb_swing_ex
(2) 将包含jar文件的目录放入加载路径:

$: << 'lib/other'
(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上),即

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

使用自定义类路径运行
jirb
jirb\u swing
jirb
jirb\u swing
将使用
JRUBY\u CP
环境变量(如果存在)的值来扩展给定给Java命令行的类路径

commons-lang3库示例取自我的本地maven存储库,在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
手册页:

使用此选项[-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库和操作系统的实际示例:

$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”
#验证基本jruby代码是否适用于以下情况:
$myjruby-e“2+2”
4.
#现在验证它是否可以使用我的第三方库:
$myjruby-e'puts org.apache.commons.lang3.mutable.MutableBoolean.new'
假的
使用自定义类路径运行
jirb
jirb\u swing
jirb
jirb\u swing
将使用
JRUBY\u CP
环境变量(如果存在)的值来扩展给定给Java命令行的类路径

commons-lang3库示例取自我的本地maven存储库,在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
手册页:

使用此选项[-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库和操作系统的实际示例:

$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”
#验证基本jruby代码是否适用于以下情况:
$myjruby-e“2+2”
4.
#现在验证它是否可以使用我的第三方库:
$myjruby-e'puts org.apache.commons.lang3.mutable.MutableBoolean.new'
假的

你是对的,我的jirb_swing_ex是一款经过修改的jirb_swing。不幸的是,如果我使用
java-cp jr\jruby-complete-1.7.27:lib\other\appl.jar jb\jirb\u swing\u ex
,java就再也找不到我的主类(在jirb\u swing\u ex中)。错误消息是:Fehler:Hauptklasse C:.cygwin64.home.fisrona.gitwrk.vp5.bin.jirb_swing_ex konnte nicht gefunden order geladen werdenTo start
jirb_swing_ex
对于扩展类路径,您也许应该使用我答案的第一个方法,我认为这更容易一些。在Windows上,它将是
%JRUBY\u CP%
。第二种方法执行JRuby主类,该类以任意Ruby程序为参数,但您的尝试至少存在两个问题:1)在Windows上,类路径的分隔符为
not
--2)您省略了JRuby主类——因此您需要使用
java-cp jr\JRuby-complete-1.7.27:lib\other\appl.jar org.JRuby.main jb\jirb_swing_ex
(请注意这两个更改)您是对的,我的jirb_swing_ex是一个修改过的jirb_swing。不幸的是,如果我使用
java-cp jr\jruby-complete-1.7.27:lib\other\appl.jar jb\jirb\u swing\u ex
,java就再也找不到我的主类(在jirb\u swing\u ex中)。错误消息是:Fehler:Hauptklasse C:.cygwin64.home.fisrona.gitwrk.vp5.bin.jirb_swing_ex konnte nicht gefunden order geladen werdenTo start
jirb_swing_ex
对于扩展类路径,您也许应该使用我答案的第一个方法,我认为这更容易一些。在Windows上,它将是
%JRUBY\u CP%
。第二种方法执行JRuby主类,该类将任意Ruby程序作为参数,但至少有2个pr
# 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'