Из того, что я понимаю, вы пытаетесь сделать, я предполагаю, что вы пытаетесь создать класс JRuby, который расширяет класс Java (с механизмом сценариев), и возвращать этот класс Java.
Ваш класс Ruby, вероятно, выглядит следующим образом:
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)
# ...
end
end
Затем вы можете использовать этот класс в Java следующим образом:
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);
// Instantiate the JRuby class, and cast the result of eval.
Analyzer analyzer = (Analyzer) engine.eval("MyAnalyzer.new");
// You can then use this analyzer like a Lucene Analyzer
}
}
Затем вы скомпилируете и выполните:
$ javac -cp .:lucene-core.jar:$JRUBY_HOME/lib/jruby.jar RunMyAnalyzer.java
$ java -cp .:lucene-core.jar:$JRUBY_HOME/lib/jruby.jar RunMyAnalyzer
Ключевым моментом здесь является то, что JRuby создает прокси-класс, который затем может быть преобразован в Analyzer
, суперкласс Java.