我有一个内部使用java的C++程序(通过我的C++ dll包装了内部使用jvm.dll的WebLogic jsmc.dll)。程序使用过时的(不是当前的)env变量值
当我在运行我的程序之前设置CLASSPATH时,找到所有JAR库并且程序正常工作。 当我做不是设置CLASSPATH之前运行我的程序,JARs是而不是发现,这当然是预期的。
现在,当我设置运行我的程序前的CLASSPATH,但明确程序代码这里面CLASSPATH环境变量之前加载我的DLL使用Java,奇怪的事情发生了:所有的JAR仍然发现,程序就好像一切正常一样。我通过几种方式验证了CLASSPATH实际上是从env变量中删除的(例如通过使用ProcessExplorer或打印它的值)。
问题:
你能向我解释这种行为吗?我是不是想知道为什么java忽略我设置的CLASSPATH,但是怎么可能 java看到旧的CLASSPATH值,而不是当前的值?我强调,java不可能以某种方式存储旧的CLASSPATH值,因为在旧值可用时未加载java。
我该如何让java尊重过程env变量中的更改?
详情:
上述的问题只是我做了探索我真正的问题简单化。我试图从程序中设置CLASSPATH,并避免将它设置在外部。但是java使用了外部设置的CLASSPATH,而不是我在程序中设置的CLASSPATH。
我使用Windows API(GetEnvironmentVariableA,SetEnvironmentVariableA)读取和设置env变量值。我已经验证过,通过这种方式设置它们后,程序过程环境变量确实发生了变化我甚至在调用任何java方法之前,从使用java的dll打印CLASSPATH值。我使用ProcessMonitor检查了jvm.dll真的被加载之后 CLASSPATH被删除。我也试图排除从父进程读取CLASSPATH的可能性。现在我非常确定在加载jvm.dll时,CLASSPATH已经从进程环境中删除。
我已经尝试了Visual C++ 2010测试程序和HP LoadRunner C编译器(mmdrv.exe)vuser脚本,结果相同。 LoadRunner是我需要解决这个问题的主要原因。
您是否已经仔细检查了所使用的CLASSPATH只能来自父进程(例如命令shell)而不是来自例如存储在注册表中的默认环境变量值? – 2012-03-10 05:06:47
我设法让代码在Visual Studio中工作。将“jmsc.dll”标记为延迟加载(属性 - >链接器 - >输入 - >延迟加载的Dll =“jmsc.dll”)就足够了。 不幸的是,相同的代码与LoadRunner的工作方式不一样 - 即使dll是懒洋洋地加载的,加载的dll仍然使用原始的CLASSPATH,而不是修改过的。 : - (((可能在执行lr_load_dll()时出现一些怪癖) – xarx 2012-03-12 14:23:33
一个可能的解释是,jmsc.dll中包含或引用的C运行时可能在启动时自己创建了环境变量副本。确定它们在jvm.dll中的结果如何:或许它使用相同的运行时,或者jmsc.dll明确地将CLASSPATH传递给jvm.dll出于某种原因,你需要用调试器来查看它以知道确定 – 2012-03-12 20:33:33