From what I understand what you are trying to do, I assume that you are trying to create a JRuby class that extends the Java class (using a scripting mechanism) and returns this class in Java.
Your Ruby class probably looks like this:
require 'java' require 'lucene-core.jar' java_import 'org.apache.lucene.analysis.Analyzer' java_import 'org.apache.lucene.analysis.standard.StandardTokenizer' java_import 'org.apache.lucene.util.Version' java_import 'org.apache.lucene.analysis.TokenStream' java_import 'java.io.Reader' class MyAnalyzer < Analyzer def tokenStream(file_name, reader) result = StandardTokenizer.new(Version::LUCENE_CURRENT, reader)
Then you can use this class in Java as follows:
import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; import java.io.FileReader; import java.io.FileNotFoundException; import java.io.Reader; import org.apache.lucene.analysis.Analyzer; public class RunMyAnalyzer { public static void main(String[] args) throws ScriptException, FileNotFoundException { String filename = "my-analyzer.rb"; ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("jruby"); Reader reader = new FileReader(filename); engine.eval(reader);
Then you compile and run with:
$ javac -cp .:lucene-core.jar:$JRUBY_HOME/lib/jruby.jar RunMyAnalyzer.java $ java -cp .:lucene-core.jar:$JRUBY_HOME/lib/jruby.jar RunMyAnalyzer
The key point here is that JRuby creates a proxy class that can then be added to Analyzer , the Java superclass.
source share