2

我有一个简单的 Maven 项目,如下所示:

  • $PROJ/src/main/java/path-to-classes/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 回答