我有一个看起来像这样的简单Maven项目:
- $ proj/src/main/java/to to 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未加载。我在这里做错了什么?
classpath文件名不应以 /
开头。应该只是:
container.runScriptlet(PathType.CLASSPATH, "installer.rb");
这是Java的ClassLoader API的一个古怪的无证方面(当然,这当然是由ScriptingContainer在封面下使用的,用于从ClassPath加载文件)。
这是最终使它起作用的代码:
container.setArgv(args);
InputStream is = this.getClass().getResourceAsStream("/installer.rb");
container.runScriptlet(is, "installer.rb");