在编译和JIT模式下使用JRuby中的`require`

时间:2012-04-11 00:34:25

标签: ruby jvm jruby

我有以下结构:

 lib/cf.jar
 lib/modules/basic_server.rb
 examples/server.rb

LIB /模块/ basic_server.rb:

require 'java'

require(File.join(File.dirname(__FILE__), '..', 'cf.jar'))

module Cf
  import 'ch.ethz.inf.vs.californium.coap'
  import 'ch.ethz.inf.vs.californium.endpoint'
  import 'ch.ethz.inf.vs.californium.examples.resources'
  import 'ch.ethz.inf.vs.californium.util'
end

实例/ server.rb:     require(File.join(File.dirname( FILE ),'..','lib','modules','basic_server'))

class ExampleServer
  def initialize
    # Create the logger
    Cf::Log.init();
    # Create the endpoints container
    @ep = Cf::LocalEndpoint.new
    # Add a few basic endpoints
    @ep.addResource(Cf::HelloWorldResource.new)
    @ep.addResource(Cf::ZurichWeatherResource.new)
  end
end

srv = ExampleServer.new

当我使用jruby命令运行它时一切正常,但是当我尝试使用jrubyc进行编译然后使用java -cp .:$JRUBY_JAR examples/server运行时,会出现此错误:

Exception in thread "main" org.jruby.exceptions.RaiseException: (LoadError) no such file to load -- file:/opt/devel/src/projects/californium-jruby.git/examples/../lib/modules/basic_server

所以我看到使用File.dirname(__FILE__)可能是错误的。

为了进行健全性检查,我尝试连接代码并且它有效,但它似乎对我来说似乎不是一个解决方案。我如何在JRuby中require()

在写这篇文章时,我认为任何使用相对路径都不会起作用,有效的是:

LIB /模块/ basic_server.rb:

require 'java'
require 'lib/cf.jar'
# ....

实例/ server.rb:

require 'lib/modules/basic_server'
# ....

编译JAR导致了一个有效的解决方案。但是,现在 - 如何在两种行为之间切换?

我可以运行jruby examples/server.rb但我无法运行cd examples; jruby server.rb,这不是太糟糕,但是,有没有人解决过这个问题?

顺便说一句,像这样的黑客行事:

if (File.dirname(__FILE__).split(':')[0] == 'jar') then
  require(File.join('lib', 'modules', 'basic_server'))
else
  require(File.join(File.dirname(__FILE__), '..', 'lib', 'modules', 'basic_server'))
end

但它相当丑陋。

0 个答案:

没有答案