I'm currently trying to convince my boss to let me do a new web app in
Ruby on Rails.
However, it needs to use at least one fairly big and complex class that
is currently written in Java.
I could:
- run rails on JRuby:
no problem to call the Java class, but how well does Rails run on
JRuby? The JRuby site says something like "it probably works, but we're
not sure". Has anybody tried Rails on JRuby for a real application?
- write a command-line interface for the java class, and call it as a
shell command from ruby.
- wrap the java class in a servlet and call it via http (I only need it
to do some complex processing on some strings)
- re-implement the class in Ruby (a lot of work, and twice the
maintenance in the future)
Any thoughts on what would be the best option?
I'd be particularly interested in hearing from anybody who tried or is
running rails on JRuby.
2 or 3 would be nice. 2, if the traffic isn’t that heavy. I tried out Jruby, simple Rails app seem to work. A lot of plugins (backgroundrb, e.g.) fail.
Well, JRuby is certainly one way. So too is YAJB. I'll show you how to
do it both ways below. Suppose I have a Java class called des with a
method called encrypt:
require 'yajb/jbridge'
include JavaBridge
class ApplicationController < ActionController::Base
def index
render_text desencrypt("Hello There
World!","somelengthypassword")+ "<br>" + "Hello There World!"
end
def desencrypt(s,password)
#render_text JBRIDGE_OPTIONS[:classpath]
jimport "javax.swing.*"
des = jnew :DES, password
s = des.encrypt(s)
#use the folowing if using jruby
# #DES must be on the System's CLASSPATH
# require 'java'
# include_class 'DES'
# des = DES.new(password)
# s = des.encrypt(s)
end
def desenc()
render_text desencrypt(params[:newitem],"somelengthypassword")
end
- run rails on JRuby:
no problem to call the Java class, but how well does Rails run on
JRuby? The JRuby site says something like "it probably works, but we're
not sure". Has anybody tried Rails on JRuby for a real application?
I think it's a little more positive than that these days. We've been
making a serious effort to get Rails working better, and it's paying
huge dividends so far. ActionPack, ActiveSupport, and ActionMailer are
almost 100% now, and ActiveRecord is probably around 75%. Most apps
work pretty well now, and there are folks starting to run JRuby on
Rails apps for small production applications.
As someone else mentioned, there are certainly things that don't work.
Specifically, things that depends on marshalling heavily (DRb-based
stuff) or obviously anything that uses a C extension. But it's not
quite so grim as "it may work, we don't know"...we're just being
cautious about saying it's "officially supported" until we're closer to
100% on all of Rails' own tests.
Feel free to join the JRuby lists if you have questions or need some
help getting going.
However, it needs to use at least one fairly big and complex class that
is currently written in Java.
...
- wrap the java class in a servlet and call it via http (I only need it
to do some complex processing on some strings)
- re-implement the class in Ruby (a lot of work, and twice the
maintenance in the future)
Elmar,
If the big and complex class is typical Java (and if it's doing text processing, it surely is), this is a possibility:
* Re-implement the class in Ruby, in 25% or so of the code
* Port your unit tests - to rspec - so you can show it functions identically
* Expose it as a web service (really trivial with REST support) and have the Java app call it
This way you just *reduced* your maintenance
Of course, maybe something about the code I don't know about would prohibit it, but it's a thought
Documentation for both is kind of spotty, but for my kind of purpose
(just needing to occasionally use a small number of java classes in
ruby) it's perfect.
Nice to hear that JRuby is coming along, too, that will probably be the
preferred way in the future.
Yes, I looked at RJB, but it seemed a little more arcane to use than
YAJB (even though the latter's doc's are transcriped from Japanese).
However, JRuby certainly has the support and enthusiasm out there for
it, so that may be the ultimate winner and I would not integrate Java
classes into my app without considering, at each "touch point" in the
code, how that would be done. You may want to do it both ways actually.
-Ralph