gpt4 book ai didi

tomcat - 如何在 Tomcat 中的 Rails 初始化期间创建全局命名空间的 CONSTANT?

转载 作者:行者123 更新时间:2023-11-28 23:51:12 25 4
gpt4 key购买 nike

首先是一些背景知识:我有一个 Rails 2.2.2 应用程序,其中包含各种卡顿依赖项和自定义设置,这让我暂时无法升级到 2.2.2 以上。目前的计划是将此应用程序迁移到 JRuby (1.6.5),将其作为 war 部署在 Tomcat(6.0.23——尚未绑定(bind)到此特定版本 FWIW)中,使用 warbler (1.3.2) 将其打包。

我想避免应用程序的 JRuby 分支与普通应用程序有很大的不同,因为我不知道需要多长时间来梳理和修复由运行时环境中的差异引起的所有问题。因此,我希望能够继续干净、轻松地从 vanilla 应用程序中合并正在进行的工作。

应用程序中的许多自定义行为可以使用 environments/*.rb 中设置的全局命名空间常量进行配置文件。但是可以通过使用 yaml 配置文件或设置 shell 环境变量来覆盖这些值;这主要是为了开发过程中的灵 active ,不同的开发人员有时需要自定义各种设置。这个系统到目前为止运行良好,留下我们的environments/development.rb文件相对稳定和整洁,同时在我们进行黑客攻击时仍然让我们对自定义有很大的控制权。

我想在迁移到 JRuby 时保留这个定制系统。到目前为止,我使用的是自定义 config/web.xml.erb将相关环境变量和设置从 yaml 文件转换为 <env-entry>片段,这使得它们在初始化期间可用 java:comp/env JNDI 上下文。在更受限制的环境中(如暂存或生产),可以通过包含相应的 <Environment> 来锁定其中许多设置。容器的 context.xml 中的设置带有 override 的文件属性设置为 false .

到目前为止,还不错。但是现在我正在努力将从 JNDI 上下文检索到的值转换为初始化期间的全局命名空间 CONSTANT。以下是相关位的摘录:

配置/环境/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>
...

卡特琳娜.out:

setting FOO to 'bar'
FOO is now 'fail'

当然,我希望最后一行是“FOO 现在是‘bar’”。 lib/config_helper.rb 的第 14 行似乎是哪里出了问题。类似的代码在 vanilla ruby​​ 中运行良好,但在 Tomcat 的初始化期间在这里不起作用。

那么,在 Tomcat 中的 Rails 初始化期间,如何从 JNDI 环境条目创建全局命名空间的 CONSTANT?

最佳答案

一个好的经验法则是总是eval() 更好的答案。将第 15 行替换为以下行可在全局命名空间中正确创建常量:

Object.const_set(value_name, value)

我仍然不确定原始 namespace 是在哪个 namespace 中创建常量,但 Object 似乎是“全局” namespace 。

关于tomcat - 如何在 Tomcat 中的 Rails 初始化期间创建全局命名空间的 CONSTANT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8450823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com