我有一個內部使用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