Сначала немного предыстории: у меня есть приложение на Rails 2.2.2 со всеми видами нестандартных зависимостей и настроек, которые на данный момент не позволяют мне обновиться до версии 2.2.2.В настоящее время планируется перенести это приложение на JRuby (1.6.5), развернуть его как войну в Tomcat (6.0.23 - еще не привязанную к этой конкретной версии FWIW), используя warbler (1.3.2) для его упаковки.
Я хочу, чтобы ветка JRuby приложения существенно не отличалась от приложения vanilla, поскольку я не знаю, сколько времени потребуется, чтобы выявить и устранить все проблемы, вызванные несоответствиями в средах выполнения,Поэтому я хочу продолжать чистое и легкое объединение в текущей работе из приложения vanilla.
Ряд настраиваемых поведений в приложении можно настроить с помощью глобальных КОНСТАНТОВ с пространством имен, установленных в файлах environments/*.rb
.Но эти значения могут быть переопределены с помощью файла конфигурации yaml или установки переменной среды оболочки;это прежде всего для гибкости во время разработки, где разные разработчики иногда должны настраивать различные параметры.До сих пор эта система работала хорошо, оставляя наш файл environments/development.rb
относительно стабильным и незагроможденным, в то же время давая нам большой контроль над настройкой во время взлома.
Я бы хотел сохранить эту систему настройкив движении к JRuby.Пока что я использую настроенный config/web.xml.erb
, который преобразует соответствующие переменные среды и настройки из файла yaml в <env-entry>
фрагменты, что делает их доступными во время инициализации через контекст java:comp/env
JNDI.В более ограниченных средах (таких как подготовка или производство) многие из этих настроек можно заблокировать, включив соответствующие настройки <Environment>
в файл context.xml
контейнера с атрибутом override
, установленным в false
.
Все идет нормально.Но сейчас я пытаюсь превратить значения, извлеченные из контекста JNDI, в глобальные константы пространства имен во время инициализации.Вот выдержки из соответствующих битов:
config / environment / developer.rb:
...
envset "FOO", "baz"
FOO="fail" unless defined? FOO
printf "FOO is now '%s'\n", FOO
...
lib / config_helper.rb:
1 include Java
2 import javax.naming.InitialContext
3 import javax.naming.NameNotFoundException
4
5 ctx = InitialContext.new
6
7 def envset(value_name, default_value)
8 value = nil
9 begin
10 value = ctx.lookup("java:comp/env/#{value_name}")
11 rescue NameNotFoundException => e
12 value = default_value
13 end
14 printf "setting %s to '%s'\n", value_name, value
15 eval("%Q[ #{value_name} = '#{value}' ]")
16 end
web.xml:
...
<env-entry>
<env-entry-name>FOO</env-entry-name>
<env-entry-value>bar</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
...
catalina.out:
setting FOO to 'bar'
FOO is now 'fail'
Где, конечно, я ожидаю, что эта последняя строка будет "FOO is now 'bar" ".Строка 14 из lib/config_helper.rb
, кажется, там, где все идет не так.Подобный код хорошо работал в vanilla ruby, но он не работает здесь во время инициализации в Tomcat.
Итак, как я могу создать глобальные КОНСТАНТЫ пространства имен из записей среды JNDI во время инициализации Rails в Tomcat?