2012-03-23 14 views
5

優れたSassをビルドプロセスの一部として使用したいと考えています。私のビルドプロセスはGradleで管理されています。これは、Sassを実行するためのプラグインを作成することを意味します。 SassはRuby、GradleはGroovyですが、GroovyはJVM上で動作しているので、JRubyを使用してJava scripting APIを使用して実行できます。 Gradleスクリプトはjarファイルの形式で依存関係を取得します。私はMaven CentralからJRubyを得ることができますが、私は自分自身で瓶をパッケージ化する必要があります。埋め込みJRubyでgems-in-a-jarを使用するにはどうすればよいですか?

私はこのためにNick Sieger's gems-in-a-jar procedureに従ってみましたが、成功しませんでした。私が何をしてもJRubyにSassの宝石を手に入れることはできません。

問題を特定するために、私はJRubyの経由サスを使用しようとする最小限のJava(ないのGradle)プログラムを書かれている - 私は本発明によりJSassそれを呼び出す:

二つがあります。 3つの興味深いビット。

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スクリプトである:

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

秒のJRubyを実行so.demo.JSassクラスがある:第一には、宝石ジャーをビルドスクリプトgenerate-gem-jar.sh、あります言って、

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 

何が間違っていますか?

+0

これはKaresの回答か別の解決策でこれまでに作業しましたか? – nopuck4you

+0

@ nopuck4you:いいえKaresのアプローチでは、(a)私はできないrgems runnable jarを使ってプログラムを起動します。(b)gemはアンパックされたディレクトリです。私は悲しいことに、この質問を投稿して以来、本当に自分自身で問題を攻撃する時間がなかった。 –

+3

私は同じようなアプローチを使用して私のコードでうまく動作しています。私は3日間私を困惑させたまったく同じエラーに遭遇した。それは私がサスランを再包装していたことが判明しました。JARへのgemはJARが無効になるようにgemファイルを削除していました。私はJARに宝石を再パッケージするための作業プロジェクトを持っています:https://github.com/dmitrye/sass-gems。ここに私がそれをどのように消費しているかの例があります:https://github.com/dmitrye/wro4j/blob/1.4.x/wro4j-extensions/src/main/java/ro/isdc/wro/extensions/processor /support/sass/RubySassEngine.java。これが役に立ったら教えてください。 – nopuck4you

答えて

0

は、あなたがこの作品を作ることができjava -jar -rgems.jar 、あなただけのSASS-XXXディレクトリを取る.jarでそれをパッケージ化する必要がないとして、それが唯一の(限り、それが実行されるように動作するように私には思えますgem install sassの結果)と、既知の場所に保管し、あなたはすでにjarファイルを構築してきたので、私はそれが現在の作業ディレクトリにあると仮定します... $LOAD_PATHには、libディレクトリです追加:

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); 

これは、宝石が他の宝石に依存していない場合にのみ有効です。