0

私は次の構造を持っています:

 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

examples/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__)はおそらく間違っていることがわかります。

健全性チェックのために、コードを連結しようとしましたが、うまくいきましたが、私にとっては解決策のようには見えません。require()JRuby ではどうすればいいですか?

これを書いている間、私は相対パスの使用はうまくいかないだろうと考えました、そしてうまくいったのはこれです:

lib/modules/basic_server.rb:

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

例/server.rb:

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

そして、JAR をコンパイルすると、実用的なソリューションが得られました。ただし、今、2 つの動作を切り替えるにはどうすればよいでしょうか。

私は実行でき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

しかし、それはかなり醜いです。

4

0 に答える 0