簡體   English   中英

是否可以從JRuby創建Java類並在Java中使用它們?

[英]Is it possible to create Java classes from JRuby and use them in Java?

我正在嘗試從JRuby擴展Lucene的Analyzer並從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

然后我編譯它: jrubyc -c /home/camilo/trunk/utils/target/dependency/lucene-core-3.0.2.jar --javac MyAnalyzer.rb並將其打包為jar。

現在,當嘗試在java中使用MyAnalyzerMyAnalyzerorg.jruby.RubyObject的后代,而不是org.apache.lucene.analysis.Analyzer的后代。

有沒有辦法讓Java將MyAnalyzer視為Analyzer而不是RubyObject 或者這是否超出了JRuby現在可以做的范圍?

JRuby版本: jruby 1.6.0 (ruby 1.8.7 patchlevel 330)

根據我的理解,我猜你正在嘗試創建一個擴展Java類(使用腳本引擎)的JRuby類,並將該類交還給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超類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM