java - 是否可以从 JRuby 创建 Java 类并在 Java 中使用它们?

标签 java ruby lucene jruby

我正在尝试从 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 中使用 MyAnalyzer 时,MyAnalyzerorg.jruby.RubyObject 的后代,而不是 org.apache.lucene.analysis.Analyzer.

有没有办法让 Java 将 MyAnalyzer 视为 Analyzer 而不是 RubyObject?还是这种方式超出了 JRuby 现在可以做的范围?

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

最佳答案

根据我从您的尝试中了解到的情况,我猜您正在尝试创建一个 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 生成一个代理类,然后可以将其转换为 Java 父类(super class) Analyzer

关于java - 是否可以从 JRuby 创建 Java 类并在 Java 中使用它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5721134/

相关文章:

java - 使用 Apache POI 3.14 获取 Excel 中公式的计算值

ruby-on-rails - 从像 http ://localhost:3000/user/adem-balka with Rails 5 这样的友好 url 获取参数

php - 寻找实际有效的数据库抽象/替代

java - 如果我将通配符添加到值的末尾,为什么我的 Lucene 只匹配字段

java - Lucene针对经常变化的文档的索引策略

java - 使用 JIRA、Ivy 和 SVN 时报告版本更改

java - 在公共(public)抽象方法的所有子类中提取公共(public)实现的最佳方法

java - JTextField 大小随 JLabel 文本长度变化

ruby - 如何阻止来自 Ruby Mechanize Gem 的访问?

ruby - 我如何在 Ruby 中使用来自多个操作系统的命令?