2

次のような単純なmavenプロジェクトがあります。

  • $PROJ/src/main/java/クラスへのパス/InstallerLoader.java
  • $PROJ/src/main/resources/installer.rb

InstallerLoader.java は次のようになります。

package com.mycompany;

import org.jruby.embed.ScriptingContainer;
import org.jruby.embed.PathType;

public class InstallerLoader {
    public static void main(String[] args) {
        System.out.println("Running..");
        ScriptingContainer container = new ScriptingContainer();
        container.runScriptlet(PathType.CLASSPATH, "/installer.rb");
    }
}

これが、installer.rb の外観です。

require 'optparse'

options = { :verbose => false}
optparse = OptionParser.new do |opts|
    opts.on('-v', '--verbose', 'Verbose output') do
        options[:verbose] = true
    end
end

optparse.parse!

puts options[:verbose]

これを実行しようとすると、installer.rb が読み込まれないようです。スタック トレースなど、installer.rb が読み込まれていないことを示すものはありません。ここで何が間違っていますか?

4

2 に答える 2

1

クラスパスのファイル名は . で始まらないでください/。次のようにする必要があります。

container.runScriptlet(PathType.CLASSPATH, "installer.rb");

これは、 Java の ClassLoader API の風変わりな文書化されていない側面です (もちろん、クラスパスからファイルをロードするために ScriptingContainer によって裏で使用されています)。

于 2012-10-19T17:00:07.333 に答える
0

これが最終的に機能するようになったコードです。

container.setArgv(args);
InputStream is = this.getClass().getResourceAsStream("/installer.rb");
container.runScriptlet(is, "installer.rb");
于 2012-10-22T10:59:21.043 に答える