在 Ruby 中导入 .jar 文件:如何使用 class

Importing .jar file in Ruby: how to use the class

下面是我的jruby文件,名字叫test.rb

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 class 启动来执行Jar 文件中的代码?当我尝试添加以下内容时:

var = new Jruby()

它给我一个错误:

NoMethodError: undefined method `Jruby' for main:Object

编辑

试过了,还是不行。包名称是 foo,class 名称是 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 代码的 class。

在jruby中,可以通过包名和class名称访问javaclasses。 参见 https://github.com/jruby/jruby/wiki/CallingJavaFromJRuby

您的 java 主要方法是静态的,因此不需要 new。所以这应该有效。

jruby.Jruby.main()

但我建议重命名您的 java class 和包。您可能会遇到名称冲突,因为 jruby 中的某些东西可能也被称为 jruby。 另外这个名字是错误的,因为它是 java class 而不是 jruby class.

编辑:

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

  1. 使用Ruby 模块语法:

    Java::Foo::Foo.main()

  2. 我第一次尝试的点语法。

"Second way: for the top-level Java packages java, javax, javafx, org, and com you can type in a fully qualified class name basically as in Java, for example, java.lang.System or org.abc.def.className ..."

您要么需要将您的 java class 放入包 com.foo 中,要么编写一个额外的方法来访问该包:

def edu
  Java::Edu
end

"And then you can use use usual Java package names like edu.abc.def.ClassName"

  1. 在java_import之后,导入Class"will be available in the global name space"

    java_import 'foo.Foo'

    Foo.main()

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

" loading jar-files via require searches along the $LOAD_PATH for them, like it would for normal ruby files."