问题标签 [jruby-java-interop]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
681 浏览

java - JRuby 和 Java 之间的调试

我有一个使用一些 Ruby 脚本的大型 Java 项目(主要是因为 Ruby 支持“yield”)。Ruby 代码调用 Java 代码,Java 代码调用更多的 Ruby 代码。它是非常交错的,但一切都是从 Java 驱动的。

我正在使用嵌入式 jruby-standalone 并构建一个带有依赖项的 jar(通过 maven)。我正在使用一个 maven 插件来运行 jrubyc 并生成 .java 文件,这些文件是 maven 为我编译的。

当我运行 jar-with-dependencies 时,我可以毫无问题地将调试器附加到 Java 进程,但我真的很想能够调试 Ruby 代码。有解决方案吗?

我没有启动任何可以附加参数的 jruby 可执行文件。它嵌入在 jar 中并通过 java -jar 调用。

0 投票
2 回答
1041 浏览

java - 如何使用 JRuby 和 Java?

是否仍然支持该功能?我似乎找不到 2008 年左右的任何文档。这是来自 Oracle 网站的插入...

在运行时,JSR 223 脚本 API 必须为您要使用的脚本语言找到适当的脚本引擎。脚本引擎解释并执行脚本。您可以通过下载 jsr223-engines.tar.gz 或 jsr223-engines 文件并将其扩展至系统的某个位置(例如,在 scriptengines 中)从 java.net 上的 Scripting Project 获取当前的 JSR 223 第三方脚本引擎目录。

但它是在 2007 年编写的,所有这些链接的链接都不再使用。所以我无法获得任何 JRuby 引擎......任何东西。

甲骨文文档:http ://www.oracle.com/technetwork/articles/dsl/jruby-141877.html

如果有人可以为我提供当前的教程或文档,我可以在 Java 中使用 JRuby。我目前已成功运行 JRuby,但不知道如何在 Java 中设置 Scriptengines。

非常感谢。

0 投票
2 回答
125 浏览

java - byte[] 到 RubyString 用于 JRuby Java 扩展中的字符串异或

我正在尝试为 JRuby 实现一个 Java 扩展来执行字符串异或。我只是不确定如何将字节数组类型转换为RubyString

此外,如何就地执行相同的操作(即x更新 s 值)?

0 投票
1 回答
164 浏览

java - JRuby proc 作为 Java 接口实现

我的问题与闭包转换有关。我想测试一个从 jruby 代码实现功能接口的 proc。

我有一个简单的过程

实现一个java功能接口,如

由于客户端对象是一个 Java 对象,它是

它工作正常,因为 jruby 设法将 proc 转换为 java 功能接口。所以,这部分没问题。

我的问题是测试这段代码,从 jruby 调用它。我不知道如何告诉 jruby 将该 proc 视为MyInterface能够调用实际方法doStuff而不是 ruby​​ 规范的实现call

所以,问题是如何告诉 jruby 将 proc 视为给定的 java 接口。

0 投票
1 回答
893 浏览

java - 从 Jruby 中的 Jar 文件访问枚举

我正在尝试访问以下静态枚举

但我不断收到错误

当我尝试以下操作时:

但后来我尝试了以下方法:

它给了我以下错误:

有没有一种不同的方法可以从 jar 文件中获取这个静态枚举并将其包含在 Jruby 中而不会得到那个 errpr?

谢谢。

0 投票
1 回答
271 浏览

java - 从 jar 文件执行时 JRuby 文件未运行(原为:System.out.println 无法从 jar 文件中运行)

(交叉张贴在JRuby 论坛,但因为我还没有得到任何答案而再次发布在这里)。

平台:jruby 9.0.4.0 (2.2.2) 2015-11-12 b9fb7aa Java HotSpot(TM) 64-Bit Server VM 24.79-b02 on 1.7.0_79-b15 +jit [Windows 7-amd64]

Java中的主程序,通过RedBridge Core调用JRuby代码。Java 类位于 Jar 文件中。

只要我不坚持 Ruby 代码也从 Jar-File 中执行,而不是在文件系统中搜索,这种设置就可以工作。如果我从 Jar 文件运行代码,JRuby 标准输出似乎已经消失了。

首先,这是工作案例:

我看到了所有 println 语句的结果,并创建了 out.txt 文件。

现在对于非工作案例:

在整个设置中,我只更改了一行:bridge.rb 的调用变为

也就是说,我将 RELATIVE 替换为 CLASSPATH,并删除“rbsrc/”。当我运行它时,我没有收到任何错误消息,我得到了所有 println 语句的输出,但是我没有看到“puts”语句的输出,也没有创建文件 out.txt!

请注意,bridge.rb 似乎已正确加载(如果我将 bridge.rb 更改为其他名称,则会出现异常),但它似乎没有被执行。

怎么会?

更新:我的问题描述是错误的!stdout 没有问题,但是好像我的 JRuby 代码bridge.rb没有执行!runScriptlet返回null,当我在 Ruby 程序中创建文件时,之后就没有文件了。

我究竟做错了什么?我将所有 JRuby 文件放在一个目录中。我将它们放入我的 Jar 文件中。我使用jar -cp JARFILE MAINCLASS. 还缺少什么?

顺便说一句,整个示例应用程序可以在这里找到。有一个readme.txt包含。

0 投票
0 回答
138 浏览

jruby - ScriptingContainer、Ruby 运行时和变量映射

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

这个问题是关于了解 LocalContextScope 参数在存在多线程时的影响。

我们可以在JRuby Wiki上找到 一个有助于为 LocalContextScope 参数选择最佳值的方法。本页解释说,该参数控制 ScriptingContainer 和/或 Ruby 运行时和/或变量映射是否在线程之间共享。但是,我想对这个问题有更深入的了解,特别是“系统”的哪一部分是在这三个组件中的哪一个组件中实现的。

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

0 投票
2 回答
78 浏览

jruby - 在 JRuby 中使用带有 c 扩展的 gem,或者将它们移植到 Java?

我正在输入字符串和一些以前输入的字符串之间进行模糊匹配测试。测试是在打字时实时进行的。

我已经有了一个准确得惊人的算法,叫做StrikeAMatch,它已被翻译成多种语言。我发现最快的 Ruby 实现是amatch。但是,它与我的 JRuby 环境不兼容,因为它在需要 C Ruby 解释器 (MRI)的 C 扩展中处理数据。虽然它非常快:

我希望我可以避免设置替代环境。另一种方法是尝试移植JRuby Wiki 中建议的原始 Java 代码。不知道该怎么做。

关于如何解决这个问题的任何想法?

0 投票
1 回答
337 浏览

java - 当您在嵌入式 JRuby 中执行 Ruby 脚本时,您可以使用 gems 吗?

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

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

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

注意:它们需要是真正的宝石,模拟就可以了。

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

0 投票
1 回答
292 浏览

java - Java 反射:确定 JRuby 中 java.util.regex.Pattern 的类

在 Java 11 下运行的旧版 JRuby 应用程序 (1.6.8) 上工作时,我在测试用例中发现了一个特殊错误:"require 'java'; puts java::util::regex::Pattern.class"errors ArgumentError: wrong number of arguments (0 for 1)。对于其他内置 JRE 类,这似乎工作正常(见下文)。

这会导致 JRuby 本身有时会失败,在https://github.com/jruby/jruby/blob/1.6.8/lib/ruby/site_ruby/shared/builtin/javasupport/core_ext/object.rb#L10中的这一行:

为了让应用程序正常工作,我必须在 JRuby 源代码中注释掉该行。

我对造成这种情况的原因或如何适当地解决它感到困惑。谷歌展示了几个人们在尝试加载特定应用程序时遇到该错误的实例,但没有人弄清楚原因(所有解决方案都说“尝试不同版本的应用程序)。

为什么 JRuby 不能执行.class?它期待什么论据

完整的跟踪如下:


Java 行为

Java本身似乎没有问题:


部分解决方案?

我可以通过注释掉if上面引用的语句来修复 JRuby 中的这个错误。但是,在这个遗留应用程序中,JRuby 位于已编译的 jar 中,因此我无法编辑其源代码。有没有办法在不更改二进制 jar 的情况下向 JRuby 添加猴子补丁来修复失败的if语句?

获取 JRuby

JRuby 1.6.8 可在http://central.maven.org/maven2/org/jruby/jruby-dist/1.6.8/ 获得