标签: jruby-java-interop

在JRuby中投射对象

有没有办法可以从JRuby显式地将一个Java对象转换为另一个Java类?

有时我希望能够调用SomeJavaClass#aMethod(MySuperClass)而不是SomeJavaClass#aMethod(MyClass)从JRuby 调用.

从Java开始,我会这样做:

someJavaObject.aMethod( (MySuperClass) myObj );
Run Code Online (Sandbox Code Playgroud)

但我没有看到一个#castruby方法或类似的东西来做JRuby中的等效方法.

请注意,从JRuby转换Java对象的问题缺乏对一般情况的答案,这就是我重新提出问题的原因.

java casting jruby jruby-java-interop

11
推荐指数
1
解决办法
3136
查看次数

我可以将Java类文件导入JRuby吗?

文档似乎表明,为了让我将Java类导入JRuby,它们必须位于JAR文件中:

"为了在JRuby的jar文件中使用资源,jar文件必须在类路径上,或者你可以使用require方法使它"(http://wiki.jruby.org/wiki/Calling_Java_from_JRuby#Require_a_jar_file_to_make_resources_in_the_jar_discoverable_within_JRuby)

是否可以直接导入.class文件?

谢谢!

jruby jruby-java-interop

7
推荐指数
2
解决办法
7115
查看次数

ScriptingContainer,Ruby Runtime和Variable Map

(Crossposting note:这个问题也已于12月20日在JRuby邮件列表(jruby@ruby-lang.org)和1月2日的JRuby论坛上发布,但尚未得到任何回复.

这个问题是关于在存在多线程的情况下理解LocalContextScope参数的影响.

我们可以在JRuby Wiki上找到 一个有助于为LocalContextScope参数选择最佳值的配方.该页面解释了,此参数控制是否在线程之间共享ScriptingContainer和/或Ruby Runtime和/或Variable Map.但是,我希望对这个问题有一个更深入的了解,特别是"系统"的哪一部分实现在这三个组件中的哪一个中.

作为一个具体的例子:当我在Ruby中创建全局变量,或者在顶级上下文中创建新类或函数和变量时,它们是属于ScriptingContainer,运行时还是变量映射?除非知道这一点,否则我不知道我必须使用哪个LocalContextScope.

jruby jruby-java-interop

7
推荐指数
0
解决办法
110
查看次数

当你在嵌入式JRuby中执行Ruby脚本时,你能使用gems吗?

碰巧我需要对这个Ruby脚本进行单元测试.这是一个基于Sinatra的Web应用程序,它使用了几个宝石.

我在Java方面比在Ruby方面有更多的经验,时间非常重要(优雅不是),所以我想我可能会更快,如果我在JUnit类中执行该脚本并模拟它所依赖的所有子系统(Web服务器) ,数据库).这样我就可以使用我的Java技能来测试Ruby系统.它看起来像你可以在Java程序中嵌入的Ruby.

问题:我可以在嵌入式Ruby中使用gem,即创建一个可以在任何机器(Windows,Linux,Mac)上执行测试的Java程序,并且不需要我手动在其上安装几个宝石吗?如果有,怎么样?

注意:它们需要是真正的宝石,嘲笑都很好.

更新1(25.01.2017 13:14):一个明显的解决方案是将该脚本的逻辑提取到一个没有依赖项的单独的Ruby文件中.这可能是代码的80%.然后,即使没有宝石,我也可以测试该逻辑文件.

ruby java jruby jruby-java-interop

7
推荐指数
1
解决办法
312
查看次数

JRuby和Java对象

请告诉我是否可以执行以下操作:

  • 在Java中创建特定类的实例
  • 把它传递给JRuby用它做点什么
  • 继续使用Java中的"修改"版本

你能提供一个小例子吗?

编辑:事实证明,嵌入是实现这一目标的最简单方法.有关嵌入JRuby的更多信息.

java scripting jruby jruby-java-interop

6
推荐指数
1
解决办法
789
查看次数

有关 Java 与 jRuby 互操作的参考信息的最佳来源

您发现什么是 jRuby 与 Java 互操作语法的最佳来源?昨天我花了很长时间才找到有关添加到类路径的内容,而 jruby.org 站点并没有太大帮助。好奇其他人使用的参考资料。谢谢。

ruby java jruby jruby-java-interop

5
推荐指数
1
解决办法
832
查看次数

如何在 JRuby on Rails 项目中正确添加到 CLASSPATH?

我通过在以下内容中添加了一些外部 jars 到我的 CLASSPATH 中config/application.rb

require 'java'
$CLASSPATH << "#{File.dirname(__FILE__)}/../backend/src/"
Dir["#{File.dirname(__FILE__)}/../backend/lib/*.jar"].each do |jar|
   require jar
end
Run Code Online (Sandbox Code Playgroud)

这在使用rails server. 加载来自 CLASSPATH 的 jar。但是,运行时rake未设置类路径。我该如何设置?特别是,我需要在加载我的 gem 之前设置它,因为我使用 JRClj gem,它依赖于我的 CLASSPATH 中已经有 clojure.jar。

(哦,我也尝试将代码放在 environment.rb 中;没有帮助)

“不工作”,我的意思是:

$ rake rspec --trace
rake aborted!
No such file to load -- /MY_CURRENT_WORKING_DIRECTORY/clojure.lang.RT
org/jruby/RubyKernel.java:1063:in `load'
/Users/pbiggar/.rvm/gems/jruby-1.6.5@jruby-clojure-combination/gems/activesupport-3.1.1/lib/active_support/dependencies.rb:234:in `load'
/Users/pbiggar/.rvm/gems/jruby-1.6.5@jruby-clojure-combination/gems/activesupport-3.1.1/lib/active_support/dependencies.rb:223:in `load_dependency'
/Users/pbiggar/.rvm/gems/jruby-1.6.5@jruby-clojure-combination/gems/activesupport-3.1.1/lib/active_support/dependencies.rb:640:in `new_constants_in'
/Users/pbiggar/.rvm/gems/jruby-1.6.5@jruby-clojure-combination/gems/activesupport-3.1.1/lib/active_support/dependencies.rb:639:in `new_constants_in'
/Users/pbiggar/.rvm/gems/jruby-1.6.5@jruby-clojure-combination/gems/activesupport-3.1.1/lib/active_support/dependencies.rb:223:in `load_dependency'
/Users/pbiggar/.rvm/gems/jruby-1.6.5@jruby-clojure-combination/gems/activesupport-3.1.1/lib/active_support/dependencies.rb:234:in `load'
/Users/pbiggar/.rvm/gems/jruby-1.6.5@jruby-clojure-combination/gems/rake-0.9.2.2/lib/rake/rake_module.rb:25:in `load_rakefile'
/Users/pbiggar/.rvm/gems/jruby-1.6.5@jruby-clojure-combination/gems/rake-0.9.2.2/lib/rake/default_loader.rb:6:in `load'
/Users/pbiggar/.rvm/gems/jruby-1.6.5@jruby-clojure-combination/gems/rake-0.9.2.2/lib/rake/application.rb:569:in `load_imports'
/Users/pbiggar/.rvm/gems/jruby-1.6.5@jruby-clojure-combination/gems/rake-0.9.2.2/lib/rake/application.rb:508:in `raw_load_rakefile'
/Users/pbiggar/.rvm/gems/jruby-1.6.5@jruby-clojure-combination/gems/rake-0.9.2.2/lib/rake/application.rb:82:in `load_rakefile'
/Users/pbiggar/.rvm/gems/jruby-1.6.5@jruby-clojure-combination/gems/rake-0.9.2.2/lib/rake/application.rb:133:in `standard_exception_handling'
/Users/pbiggar/.rvm/gems/jruby-1.6.5@jruby-clojure-combination/gems/rake-0.9.2.2/lib/rake/application.rb:81:in `load_rakefile' …
Run Code Online (Sandbox Code Playgroud)

jruby jrubyonrails jruby-java-interop

5
推荐指数
1
解决办法
3528
查看次数

在Jruby中使用自定义Java类文件

我试图通过最新版本的Jruby(1.5.1),Ruby 1.8.7和Java 1.6.0_06来执行一些自定义Java代码.我已经尝试了类文件并将其放在jar方法中.当我尝试

require 'java'  
require 'path_to_class/myClass
Run Code Online (Sandbox Code Playgroud)

要么

require 'java'  
require 'path_to_jar/a_jar.jar  
Run Code Online (Sandbox Code Playgroud)

尝试这两种方法,我无法访问myClass或jar文件中的任何其他文件.网上导入java类的其他变体导致以下错误:

`NameError: cannot load Java class com.package.myClass from C:/jruby-1.5.1/lib/ruby/site_ruby/shared/builtin/javasupport/java.rb:51:in method_missing`
Run Code Online (Sandbox Code Playgroud)

我还检查了StackOverFlow上的解决方案,我仍然得到了相同的结果.我想知道这可能是一个更深层次的问题.

jruby jruby-java-interop

2
推荐指数
1
解决办法
6760
查看次数

Java到JRuby到Resque

我有一个混合Web应用程序,它在同一个Tomcat中运行Java WAR文件和JRuby WAR文件.

我们决定使用(JRuby)Resque作为我们的工作队列.对入队作业的调用如下所示:

Resque.enqueue(FooWorker, 111)
Run Code Online (Sandbox Code Playgroud)

其中FooWorker是JRuby端定义并使用的工作类(并包含在JRuby WAR文件中),当JRuby Resque rake任务处理队列中的作业时,它将被调用.

我想让Java代码能够将要由JRuby FooWorker类处理的Resque队列上的任务排队.

我在https://github.com/tc/call-jruby-from-java-example上查看了Tommy Cheng的代码.java文件

//JavaInterfaceExample.java
interface JavaInterfaceExample{
  int add(int a, int b);
}
Run Code Online (Sandbox Code Playgroud)

和ruby文件

#JrubyAdderImpl.rb
require 'java'

class JrubyAdderImpl
    include Java::JavaInterfaceExample

    java_signature 'int add(int, int)'
    def add(a, b)
        a+b
    end
end
Run Code Online (Sandbox Code Playgroud)

我怀疑我的代码看起来像:java文件

//ResqueInterfaceExample.java
interface ResqueInterfaceExample{
  int resque_enqueue_foojob(int a);
}
Run Code Online (Sandbox Code Playgroud)

红宝石文件

#JrubyResqueImpl.rb
require 'java'
require 'resque'

class JrubyResqueImpl
    include Java::ResqueInterfaceExample

    java_signature 'int resque_enqueue_foojob(int)'
    def resque_enqueue_foojob(a)
    Resque.enqueue(FooWorker, a) 
    end
end
Run Code Online (Sandbox Code Playgroud)

我的FooWorker是一个类,它位于rails app的爆炸war文件目录中,文件是app/workers/foo_worker.rb

我需要做些什么来确保jruby编译器可以访问FooWorker和Resque JRuby类来正确编译代码?

jrubyonrails resque jruby-java-interop

1
推荐指数
1
解决办法
545
查看次数