Как я могу использовать Gems-in-a-jar со встроенным JRuby?

Я хотел бы использовать превосходный Sass как часть моего процесса сборки. Мой процесс сборки управляется Gradle. Это означает написание плагина для запуска Sass. Sass - это Ruby, а Gradle - в Groovy, но поскольку Groovy работает на JVM, я могу использовать JRuby для его запуска, используя API сценариев Java. Gradle-скрипты получают зависимости в виде jar-файлов; Я могу получить JRuby из Maven Central, но мне нужно будет самому упаковать Sass в качестве баночки.

Я пытался следовать процедуре Ника Джигера "драгоценные камни в банке", но безуспешно. Неважно, что я делаю, я просто не могу заставить JRuby забрать камень Sass.

Чтобы изолировать проблему, я написал минимальную Java (не Gradle) программу, которая пытается использовать Sass через JRuby - я изобретательно называю это 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);

Третий - это скрипт Ruby, который основной класс пытается использовать для работы с Sass:

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

Что я делаю неправильно?

1 ответ

Мне кажется, что это будет работать только до тех пор, пока java -jar -rgems.jarВы можете сделать это, вам не нужно упаковывать его в.jar, просто возьмите каталог sass-xxx (результат 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);

если он не находится в банке, он должен быть таким же, просто укажите путь, например

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

Обратите внимание, что это будет работать только в том случае, если sass самоцветы не зависят от других самоцветов!

Другие вопросы по тегам