【问题标题】:Importing .jar file in Ruby: how to use the class在 Ruby 中导入 .jar 文件:如何使用该类
【发布时间】:2015-09-06 12:12:24
【问题描述】:

以下是我的名为test.rb的jruby文件

require 'java'
require 'jruby.jar'

java_import 'jruby.Jruby'

puts "This is coming from Ruby."

这是我的 Java 代码:

package jruby;
import javax.swing.JOptionPane;
public class Jruby {
    public static void main(String[] args) {
        String s = "This is coming from Java!";
        JOptionPane.showMessageDialog(null, s);
    }   
}

当我使用命令运行 jruby 时

jruby test.rb

我得到的唯一结果是

this is coming from Ruby.

如何从 Java 类启动以执行 Jar 文件中的代码?当我尝试添加以下内容时:

var = new Jruby()

它给了我一个错误:

NoMethodError: undefined method `Jruby' for main:Object

编辑

试过了,还是不行。包名是foo,类名是Foo

    require 'java'
    require 'foo.jar'

    java_import 'foo.Foo'
    puts "This is coming from Ruby."
    foo.Foo.main()

这给出了以下错误:

NameError: undefined local variable or method 'foo' for main:Object (root) at test.rb

在 Meier 的帮助下工作的最终文件

require 'java'
require 'foo.jar'

java_import 'javax.swing.JOptionPane'
puts "This is coming from Ruby."

import 'foo.Foo'
Java::foo::Foo.hello()

hello() 是包含 Java 代码的类。

【问题讨论】:

  • 你需要确保不要在ruby文件中写java语法,比如new Jruby()

标签: java ruby jar import jruby


【解决方案1】:

在jruby中,你可以通过包名和类名来访问java类。 见https://github.com/jruby/jruby/wiki/CallingJavaFromJRuby

你的java main 方法是静态的,所以不需要new。所以这应该可行。

jruby.Jruby.main()

但我建议重命名您的 java 类和包。您可能会遇到名称冲突,因为 jruby 内部的某些东西很可能也称为 jruby。 名字也不对,因为它是java类而不是jruby类。

编辑:

查阅文档后,以上内容仅适用于标准 java 包。有几种方法可以访问一个 java 类:

  1. 使用 Ruby 模块语法:

    Java::Foo::Foo.main()

  2. 点语法,我先试过了。

"第二种方式:对于顶级Java包java、javax、javafx、org、 和 com 你可以输入一个完全限定的类名,基本上就像 Java,例如 java.lang.System 或 org.abc.def.className ..."

你要么需要把你的java类放在包com.foo中,要么写一个额外的方法来访问包:

def edu
  Java::Edu
end

"然后你可以使用通常的 Java 包名,比如 edu.abc.def.ClassName"

  1. 在 java_import 之后,导入的类“将在全局名称空间中可用”

    java_import 'foo.Foo'

    Foo.main()

在所有情况下,您都需要确保 jruby 可以看到您的 jar 文件。

" 通过 $LOAD_PATH 搜索加载 jar 文件 它们,就像普通的 ruby​​ 文件一样。”

【讨论】:

  • 这给了我错误“NameError: undefined local variable or method 'jruby' for main:Object。我会继续按照你的建议更改名称,但我认为这不是导致问题。你怎么看?谢谢。
  • 使用新名称创建新类后,我仍然遇到同样的错误。那么,问题可能是什么?请看一下我的新 test.rb 文件(添加到问题中)
猜你喜欢
  • 2017-10-04
  • 2020-03-30
  • 2017-05-22
  • 2017-10-07
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
相关资源
最近更新 更多