在一些遗留Java应用程序(HP-UX上的jre1.4)中注意到了这一点。
父进程(shell脚本S1)正在启动Java进程,它自己就是启动子进程(shell脚本S2)。示意性地是: S1> Java> S2 的。
NB! 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上的相同问题。
AFAIK,Java进程应该从其parrent(S1)继承环境,并且应该将所有环境变量传递给它的子S2(因为使用了单个参数exec
调用)。但是,似乎并非如此。有什么想法NLS_LANG
似乎被改变了吗?
答案 0 :(得分:1)
系统中是否有任何登录触发器?在登录触发器中设置许多环境变量(通常是NLS _ * _ FORMAT)以使其不依赖于系统行为的环境配置是很常见的。
SELECT * FROM DBA_TRIGGERS
WHERE TRIGGERING_EVENT = 'LOGON';
答案 1 :(得分:0)
NLS_LANG是如何设置的?
答案 2 :(得分:0)
由于NLS_LANG由父级导出,我将假设它是由子级继承的。在这种情况下,你正在寻找一些启动脚本正在解雇用american_america.UTF8覆盖它的地方。我会寻找一个.cshrc(或类似的,取决于什么是shell S2)。可能位于用户区域或/ etc全局区域。