Forum: JRuby Problems running JRuby scriplets in Felix OSGi

Posted by Jordan Raine (Guest)
on 2012-10-13 00:27
(Received via mailing list)
Hi all,
I'm having trouble running JRuby scriplets inside a Felix OSGi 
container. In particular, I can't require stdlibs. I believe my load 
path is improperly setup.

ScriptingContainer jruby = new 
OSGiScriptingContainer(FrameworkUtil.getBundle(Renderer.class)); # 
Renderer.class is where this snippet is located
jruby.runScriptlet("puts 'foo'") # this works fine
jruby.runScriptlet("require 'erb'") # this raises LoadError no such file 
to load -- erb

When a inspect $:, I get something I wouldn't expect:
[".", 
"/var/folders/th/fw0t5921739f9pwr0nlgcqwc0000gn/T/lib/ruby/site_ruby", 
"/var/folders/th/fw0t5921739f9pwr0nlgcqwc0000gn/T/lib/ruby/shared", 
"/var/folders/th/fw0t5921739f9pwr0nlgcqwc0000gn/T/lib/ruby/1.9"]

When I run similar code outside of OSGi, I get back paths like: 
"file:/Users/jnraine/.m2/repository/org/jruby/jruby-complete/1.7.0.RC2/jruby-complete-1.7.0.RC2.jar!/META-INF/jruby.home/lib/ruby/site_ruby"

Is there something else I need to do while setting up the scripting 
container?

Thanks for your time!
Posted by Markus n/a (albundy)
on 2012-10-14 21:54
Are you sure that erb is the right module?
If you want the interactive ruby console you have to require 'irb'.

To test the library you can also try require 'java' or require 'jruby'.

Markus
Posted by Jordan Raine (Guest)
on 2012-10-15 04:19
(Received via mailing list)
Yep, ERB is the "embedded ruby" templating language.

Works at terminal:
→ irb
jruby-1.6.7.2 :001 > require 'erb'
 => true
jruby-1.6.7.2 :002 > ERB


 => ERB

Jordan
Posted by Rhett Sutphin (Guest)
on 2012-10-15 04:38
(Received via mailing list)
Hi Jordan,

On Oct 12, 2012, at 5:26 PM, Jordan Raine wrote:

> When I run similar code outside of OSGi, I get back paths like: 
"file:/Users/jnraine/.m2/repository/org/jruby/jruby-complete/1.7.0.RC2/jruby-complete-1.7.0.RC2.jar!/META-INF/jruby.home/lib/ruby/site_ruby"
>
> Is there something else I need to do while setting up the scripting container?

Those paths are based on the container's JRuby home. Is it possible 
there's something that's setting that incorrectly? It can be set from 
the jruby.home system property, the JRUBY_HOME environment variable, or 
with #setHomeDirectory on the ScriptingContainer.

"/var/folders/th/fw0t5921739f9pwr0nlgcqwc0000gn/T" looks like an OS X 
temporary directory for whatever that's worth.

I've had trouble running a Java app that embeds JRuby from an 
environment where I have JRUBY_HOME set. The problem there is that the 
embedded container uses the environment's JRuby instead of the embedded 
JRuby and so can't find gems, etc. It is different from your situation, 
but might point you in a direction to consider. This is how I've solved 
the problem there[1]:

        ScriptingContainer container = new 
OSGiScriptingContainer(bundle,
            LocalContextScope.SINGLETHREAD, 
LocalVariableBehavior.TRANSIENT);
        container.setHomeDirectory("classpath:/META-INF/jruby.home");

Rhett

[1]: 
https://github.com/NUBIC/suite_authorization_sourc...
Posted by Markus n/a (albundy)
on 2012-10-15 08:04
In our rcp-project we get the engine from 
http://jruby.org/apidocs/org/jruby/embed/jsr223/JR...)

Markus
Posted by Thomas E Enebo (Guest)
on 2012-10-15 17:16
(Received via mailing list)
Are you sure you are not pulling in jruby.jar instead of
jruby-complete.jar?  That could explain not getting a classpath-based
home.  It would not explain why it is a random tmp-based one
though....I think warbler/rack might do something like this for
supporting exploded war file deployment...stabs in the dark...

-Tom

On Sun, Oct 14, 2012 at 9:38 PM, Rhett Sutphin <rhett.sutphin@gmail.com> 
wrote:
>>
>
>>
>     http://xircles.codehaus.org/manage_email
>
>



--
blog: http://blog.enebo.com       twitter: tom_enebo
mail: tom.enebo@gmail.com
Posted by Jordan Raine (Guest)
on 2012-10-15 18:58
(Received via mailing list)
Rhett,
I tried your example at it began working. Many thanks!

My load path is now much more sane: 
["app/cq-quickstart-5.5.0-standalone.jar", 
"classpath:/META-INF/jruby.home/lib/ruby/site_ruby", 
"classpath:/META-INF/jruby.home/lib/ruby/shared", 
"classpath:/META-INF/jruby.home/lib/ruby/1.9"]

I'm still not sure exactly why the JRuby home needs to be set manually 
in my env but the OSGiFileLocator class seems to be doing unexpected 
things. Digging in further, OSGiFileLocator.getJRubyHomeFolder() 
(https://github.com/jruby/jruby/blob/master/src/org...) 
returns "/META-INF/jruby.home", which I suppose is the root of the 
problem. Is there an OSGi guru who can shed light on which file URL is 
the correct? Perhaps it depends on the OSGi container? I am using Felix, 
but I believe this OSGi code was originally developed for use with 
Equinox.

--
Jordan Raine
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.