2011-04-19 3 views
4

JRuby에서 Lucene의 Analyzer을 확장하려고하고 Java에서 사용하려고합니다. jrubyc -c /home/camilo/trunk/utils/target/dependency/lucene-core-3.0.2.jar --javac MyAnalyzer.rb을하고 항아리로 패키지 : JRuby에서 Java 클래스를 생성하고 Java 클래스를 사용할 수 있습니까?

class MyAnalyzer < Java::OrgApacheLuceneAnalysis::Analyzer 
    def TokenStream (file_name, reader) 
    result = StandardTokenizer.new(Version::LUCENE_CURRENT, reader) 
    result = LowerCaseFilter.new(result) 
    result = LengthFilter.new(result, 3, 50) 
    result = StopFilter.new(result, StandardAnalyzer.STOP_WORDS_SET) 
    result = PorterStemFilter.new(result) 
    result 
    end 
end 

가 그럼 난 컴파일 : 같은 간단한 분석기는 보일 것이다.

이제 MyAnalyzer을 java로 사용하려고 시도하면 MyAnalyzerorg.jruby.RubyObject의 자손이며 org.apache.lucene.analysis.Analyzer이 아닙니다.

Java를 MyAnalyzer으로 처리하는 방법은 RubyObject 대신 Analyzer으로 처리 할 수 ​​있습니까? 아니면 JRuby가 현재 할 수있는 범위 밖입니까?

JRuby를 버전 : jruby 1.6.0 (ruby 1.8.7 patchlevel 330) 나는 당신이, 당신이 (스크립트 엔진) 자바 클래스를 확장하는 JRuby에서 클래스를 만들려고 같은데요하려고 노력하고 있습니다에서 이해하는 것과

답변

4

, 손으로 다시 그 클래스를 자바로 옮긴다.

당신의 루비 클래스는 아마도 다음과 같습니다

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 
다음과 같이

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 

그런 다음 자바에서이 클래스를 사용할 수 있습니다

여기서 핵심은 JRuby가 프록시 클래스를 생성하고이 클래스를 Analyzer으로 캐스팅 할 수 있다는 것입니다 , Java 수퍼 클래스

관련 문제