我在我的 jruby jar 中看到一个奇怪的问题,我确定这是由于某些配置造成的,但我不太清楚是什么。我看到的行为是,当我的 jruby 罐子去装载宝石时,它会在我的本地红宝石环境中而不是罐子本身内寻找它。如果我将我的罐子移到没有红宝石环境的系统中,那么它会使用罐子中包装的宝石。
这是我的启动 rb 文件。
require 'rubygems'
app_jar_root = File.expand_path(File.join(File.dirname(__FILE__), ".."))
Dir["#{app_jar_root}/Project/**/*/"].each do |foldername|
$LOAD_PATH.unshift foldername[-1] == '/' ? foldername[0..-2] : foldername
end
# All support libraries required to be included
[
'java',
'yaml'
].each do |require_name|
require require_name
end
# All java imported namespaces
[
# 'java.sql.DriverManager'
].each do |namespace|
java_import namespace
end
# base app directory requires
Dir["#{app_jar_root}/Project/app/**/*.rb"].reject do |filename|
%w|file_to_exclude1.rb file_to_exclude2|.include? File.basename(filename)
end.each do |filename|
require File.basename(filename)
end
# Debugger.start
如果这有任何用处,我也可以发布我的 warble.rb,但我假设问题是 boot.rb 中的一些配置。
事实证明,问题是我的 jruby jar 引用了本地GEM_PATH
和GEM_HOME
变量(如果它们存在于系统上)。为了解决这个问题,我不得不通过在boot.rb
文件中重新分配变量来重定向变量以指向 jar 内部。
这是我如何实现此目的的示例,其中app_jar_root
是 jar 中应用程序文件夹的根目录。
ENV['GEM_HOME'] = "#{app_jar_root}/gems"
ENV['GEM_PATH'] = "#{app_jar_root}/gems"