rubygems - 如何将 gems-in-a-jar 与嵌入式 JRuby 一起使用?

标签 rubygems jruby javax.script gems-in-a-jar

我想使用优秀的Sass作为我构建过程的一部分。我的构建过程由 Gradle 管理。这意味着编写一个插件来运行 Sass。 Sass 是 Ruby,Gradle 是 Groovy,但由于 Groovy 在 JVM 上运行,我可以使用 JRuby使用 Java scripting API 来运行它。 Gradle脚本以jar文件的形式获取依赖项;我可以从 Maven Central 获取 JRuby ,但我需要自己将 Sass 打包为 jar。

我尝试关注Nick Sieger's gems-in-a-jar procedure这样做,但没有成功。无论我做什么,我就是无法让 JRuby 拾取 Sass gem。

为了隔离问题,我编写了一个最小的 Java(不是 Gradle)程序,它尝试通过 JRuby 使用 Sass - 我创造性地将其称为 JSass:

有两三个有趣的地方。第一个是脚本generate-gem-jar.sh ,它构建了 gem jar:

gem install -i build/gems sass --no-rdoc --no-ri
jar cf lib/gemsass.jar -C build/gems .

第二个是so.demo.JSass类,运行 JRuby:

ScriptEngine rubyEngine = new ScriptEngineManager().getEngineByName("jruby");
ScriptContext context = rubyEngine.getContext();
context.setAttribute("inputFile", inputFile, ScriptContext.ENGINE_SCOPE);
String script = IOUtils.toString(JSass.class.getResourceAsStream("sassdriver.rb"));
rubyEngine.eval(script, context);

第三个是主类尝试用来操作Sass的Ruby脚本:

require 'sass'
template = File.load(inputFile)
sass_engine = Sass::Engine.new(template)
output = sass_engine.render
puts output

程序能够加载 JRuby 引擎并执行脚本,但在 require 'sass' 时失败,并显示:

LoadError: no such file to load -- sass
  require at org/jruby/RubyKernel.java:1033
   (root) at <script>:1
org.jruby.embed.EvalFailedException: (LoadError) no such file to load -- sass
    at org.jruby.embed.internal.EmbedEvalUnitImpl.run(EmbedEvalUnitImpl.java:132)
    at org.jruby.embed.jsr223.JRubyEngine.eval(JRubyEngine.java:90)
    at so.demo.JSass.main(JSass.java:24)
Caused by: org.jruby.exceptions.RaiseException: (LoadError) no such file to load -- sass
Exception in thread "main" javax.script.ScriptException: org.jruby.exceptions.RaiseException: (LoadError) no such file to load -- sass
    at org.jruby.embed.jsr223.JRubyEngine.wrapException(JRubyEngine.java:115)
    at org.jruby.embed.jsr223.JRubyEngine.eval(JRubyEngine.java:93)
    at so.demo.JSass.main(JSass.java:24)
Caused by: org.jruby.exceptions.RaiseException: (LoadError) no such file to load -- sass

我做错了什么?

最佳答案

在我看来,只有当它作为java -jar -rgems.jar 执行时它才会起作用 你可以做到这一点,你不需要将其打包在 .jar 中,只需获取 sass-x.x.x 目录(gem install sass 的结果)并将其存储在一个已知的位置并将其 lib 目录添加到 $LOAD_PATH ...因为您已经构建了 jar,所以我假设它位于当前工作目录中:

rubyEngine.eval("$LOAD_PATH << 'file://gemsass.jar!/gems/sass-3.1.15/lib'", context);

这需要在最后一行之前发生 rubyEngine.eval(script, context);

如果它不在 jar 中,它应该是相同的,只需指定路径,例如

rubyEngine.eval("$LOAD_PATH << 'file:/home/42/gems/sass-3.1.15/lib'", context);

请注意,只有当 sass gems 不依赖于其他 gems 时,这才有效!

关于rubygems - 如何将 gems-in-a-jar 与嵌入式 JRuby 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9844668/

相关文章:

mysql - Ruby on Rails : Error on rake db:migrate

ruby-on-rails - 获取时网络错误

ruby-on-rails - 单元测试运行三次

ruby-on-rails - 将 JRuby 与 Rails 3.2 结合使用

ruby - 在 Ruby 哈希中并行创建键值对的问题

java - 如何使用 javax.script 创建和使用字节数组

ruby - Travis 现在失败了 Rails 4 已经发布

java - RoutingError(无法加载 Java 类 hello.MyFirstJavaProgram)

java - 将 Javascript 数组转换为 Java 数组

java - JSR-223 上下文中编译脚本的本质是什么