我有以下结构:
lib/cf.jar
lib/modules/basic_server.rb
examples/server.rb
lib/modules/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: 要求(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__)
可能是错误的。
为了进行健全性检查,我尝试连接代码并且它有效,尽管它似乎对我来说不是一个解决方案。我如何require()
在 JRuby 中?
在写这篇文章时,我发现任何使用相对路径都不起作用,而起作用的是:
lib/modules/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
,这还不算太糟糕,但是,有人已经解决了这个问题吗?
顺便说一句,像这样的 hack 是有效的:
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
但它相当丑陋。