在一些旧版 Java 应用程序(HP-UX 上的 jre1.4)中注意到了这一点。
父进程(shell 脚本 S1)正在启动 Java 进程,该进程本身正在启动子进程(shell 脚本 S2)。概括地说,它是:S1 > Java > S2。
注意! Java 应用程序使用 OCI 驱动程序连接到 Oracle DB。
这里奇怪的是,运行 S1 的进程将环境变量 NLS_LANG
设置为 american_america.BLT8MSWIN1257
,Java 使用以下方式生成 S2:
Runtime.getRuntime().exec(cmd);
并且 S2 显示 NLS_LANG
设置为 american_america.UTF8
(!)
这发生在某些访问受限的环境(生产)上,我无法使用 jre 1.5 在 Linux 上重现相同的问题。
据我所知,Java 进程应该从其父进程 (S1) 继承环境,并且应该将所有环境变量传递给其子进程 S2(因为使用了单参数 exec
调用)。然而,情况似乎并非如此。您知道为什么 NLS_LANG
似乎被更改了吗?
最佳答案
系统中是否有登录触发器?在登录触发器中设置大量环境变量(通常为 NLS_*_FORMAT)以不依赖于系统行为的环境配置是很常见的。
SELECT * FROM DBA_TRIGGERS
WHERE TRIGGERING_EVENT = 'LOGON';
关于java - Java 进程中环境变量 (NLS_LANG) 值已更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2456106/