我有一个内部使用java的C ++程序(通过我的C ++ dll包装了内部使用jvm.dll的WebLogic Jsmc.dll)。
在运行我的程序之前设置CLAsspATH时,find所有JAR库并且程序正常工作。 当我在运行我的程序之前没有设置CLAsspATH时, 没有findJAR,这当然是预期的。
现在,在运行我的程序之前设置CLAsspATH,但是在加载使用java的dll 之前 清除程序代码中的CLAsspATH环境variables,会发生一件奇怪的事情:所有的JAR仍然被find,程序工作起来就好像一切正常。 我已经通过几种方式valIDation了CLAsspATH实际上是从envvariables中删除的(例如使用ProcessExplorer或者打印它的值)。
题:
我可以从PHPvariables到我的windows窗体?
批处理脚本parsingDir命令
在windows上相当于$ _SERVER
在windows批处理脚本中使用循环variables作为新variables的一部分
在不同的c文件中访问pthread中的全局variables
你能向我解释这种行为吗? 我不明白为什么java忽略我设置的CLAsspATH,但java 怎么可能看到旧的CLAsspATH值,而不是当前的? 我强调,java不可能以某种方式存储旧的CLAsspATH值,因为在旧的值可用时未加载java。
我怎样才能让java尊重进程envvariables的变化?
细节:
上面的问题只是我为了探究真正的问题而做出的简化。 我试图从程序中设置CLAsspATH,并避免在外部进行设置。 但是java使用了外部设置的CLAsspATH,而不是我在程序中设置的那个。
我使用windows API(GetEnvironmentvariableA,SetEnvironmentvariableA)读取和设置envvariables值。 我已经valIDation了程序进程环境variables在设置之后真的发生了变化。 我甚至在调用任何java方法之前,从使用java的dll打印CLAsspATH值。 我使用ProcessMonitor检查了在删除CLAsspATH 之后 ,jvm.dll真的被加载了。 我也试图排除从父进程读取CLAsspATH的可能性。 现在我很确定在加载jvm.dll的时候,CLAsspATH已经从进程环境中删除了。
我已经尝试了Visual C ++ 2010testing程序和HP LoadRunner C编译器(mmdrv.exe)vuser脚本,结果相同。 LoadRunner是我需要解决这个问题的主要原因。
Oracle环境variables“ORACLE_UNQname”
编辑registry中的环境variables
为什么env不打印PS1variables?
为特定进程的特定运行设置环境variables
用一个string代替shell中的variables
问题是由于C运行库以某种方式缓存了环境变量。 当我试图使用系统函数SetEnvironmentvariableA()修改CLAsspATH时,jmsc.dll从C运行时缓存读取CLAsspATH。 C运行时尝试在进程环境中将其缓存与实际值进行同步,但显然不是很成功。 我需要从C运行时用_putenv()调用SetEnvironmentvariableA()来替换系统调用,以便更改CLAsspATH。
但还有另一个问题。 我的代码使用了不同版本的C运行库,每个版本都有自己的环境缓存。 我的VC代码链接到msvcr100.dll,而jmsc.dll(实例化Java VM)使用msvcrt.dll。 解决方法是将我的代码链接到msvcrt.dll,以便我的代码使用jmsc.dll读取的相同C运行时使用_putenv()设置CLAsspATH。
感谢Harry Johnston的重要提示, Peter Cetinski提供了有价值的信息。
从C ++调用新的JVM进程时,不应该依赖CLAsspATH环境变量。 JNI接口提供了一种机制来在启动时指定JVM的类路径。
请参阅http://java.sun.com/docs/books/jni/HTML/invoke.HTML#28719
总结
以上是内存溢出为你收集整理的程序使用过时的(不是当前的)envvariables值全部内容,希望文章能够帮你解决程序使用过时的(不是当前的)envvariables值所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
请登录后查看评论内容