JRuby as scripting language inside Java application?

Hello everyone,

I’m currently developing a Java application and I know a bit of Ruby.
I’ve stumbled across JRuby when I was looking for a lightweight
scripting language.

In my application, the end-user should be able to attach small scripts
at certain points in the application. On the Java side, the script
should be stored as a simple string (containing valid Ruby syntax) and
then be executed at runtime.

Now I do have some questions here…

  1. Is the above scenario possible with JRuby or am I using the wrong
    tool?
  2. How does JRuby inter-operate with Java, i.e. is it capable of calling
    Java methods, access the current Java call stack (i.e. local variables,
    static fields), work with Java data structures / classes…? Will this
    work at all?

I’ve never integrated a scripting language in any of my applications so
far, sorry if the questions sound a little “noobish”. I’m not even sure
if JRuby is the right tool for this job. I’ve read most of the contents
of the JRuby homepage, but I couldn’t find an answer to those questions.

I’d be grateful for any advice!

Alan

Alan -

You can certainly call JRuby from Java. The Using JRuby book has a
chapter on how to do this (Search).
If you’ll be do any significant amount of work with JRuby, I recommend
this book.

Basically, you create a scripting container, set it up with context
(variables, load paths, etc.), then tell it to run your script. The
Ruby code calls Java methods pretty seamlessly, except for some obscure
exceptions, such as specifying a method signature where the Java method
is overloaded.

I think that other than the context you explicitly pass to the scripting
container, your Ruby code will have no knowledge of what the Java app is
doing.

  • Keith

Keith R. Bennett

Hi Keith,

thank you for your response and the link in the book, I’m going to take
a look at it! JRuby does indeed sound very promising.

Thanks!

Alan

But if i remember correctly
there is something called redbridge [1]
which gives you way more control.

[1] - RedBridge · jruby/jruby Wiki · GitHub

I will take a look at it, thanks :slight_smile:

ps. is it possible you can share what for will you use it?
i’m asking because after i switched one of my apps
from in-memory database (prevayler) into relational database
the need for this scripting engine was gone for good,
so it would be quite interesting what other bussines need can be
acomplished by this solution.

Well, I guess it’s not strictly “business”. What I want to do is to take
libGDX, a rendering engine for Java built on top of LWJGL, and build a
level editor for it. In order to allow users to define events that
should happen in-game, a lightweight scripting language seems apropriate
to me. At least in cases which are too small or too simple to create a
full-fledged Java extension.

[1] - RedBridge · jruby/jruby Wiki · GitHub
I will take a look at it, thanks :slight_smile:

As you can see there, RedBridge is simply org.jruby.embed these days,
which
embedded itself too:) into Jruby.

AFAIK there is nothing extra to be installed for running Ruby inside a
java
App - is there?
BTW, I used to use JSR223, but realised it wasn’t worth the hassle for
me.
The core embed API is simpler, cleaner and more powerful - unless you
need
to support other languages so you are ready to take other kinds of
compromises.

Hi all,
just as a follow up to the Keith answear,
i’m using this scenario in my apps for years now,
it’s based on jsr-223 and scripting engine.
But if i remember correctly
there is something called redbridge [1]
which gives you way more control.

[1] - RedBridge · jruby/jruby Wiki · GitHub

Best greetings,
Paweł Wielgus.

ps. is it possible you can share what for will you use it?
i’m asking because after i switched one of my apps
from in-memory database (prevayler) into relational database
the need for this scripting engine was gone for good,
so it would be quite interesting what other bussines need can be
acomplished by this solution.

2014-05-11 23:39 GMT+02:00 Alan DW [email protected]: