2012-01-12 33 views
2

場景:強制JVM重載「java.library.path」是不是一個好主意?

我有一個必須使用.dll的小程序。 這個.dll必須在PATH上。 爲了通過PATH獲取PAT上的.dll,運行瀏覽器的用戶必須具有管理權限(通常以右鍵單擊圖標以管理員身份運行...)。

問題:

我想刪除其獲得管理privelages的需要。

的壞主意 我想有小程序保存在某個地方的文件中的用戶主目錄內。我想將這條路徑添加到PATH。

System.setProperty("java.library.path", <new path>); 

    try { 
     // this forces JVM to reload "java.library.path" property 
     Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths"); 
     fieldSysPath.setAccessible(true); 
     fieldSysPath.set(null, null); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     init_failure = true; 
    } 

問題

它是一個壞主意,迫使JVM要做到這一點:Appearently,它可以通過做什麼?這是使用無證方法嗎?它只是簡單的黑客?

其他位

因爲這是一個小程序,我無法通過-D選項指定的java.library.path,是否正確?

此代碼位於Intranet中。不適合普通網絡硬漢。

+4

難道大家都不想「不得不取得管理權限」...... – maerics 2012-01-12 16:02:17

+0

是的,這樣做是一個壞主意。這依賴於正在使用的'ClassLoader'的實現細節。這可能不適用於JRE的未來版本或其他供應商的JRE實施;不能保證正在使用的特定'ClassLoader'實現有一個名爲'sys_paths'的字段。 – Jesper 2012-01-12 16:07:09

+0

解決方案很難看,但可能是最難看的解決方案。 ;) – 2012-01-12 16:07:15

回答

3

field.setAccessible(true)總是很黑,並且沒有記錄。它改變了一個私人領域!也許你很幸運,它適用於所有支持的JVM,並且它在將來不會改變。

我還擔心如果JVM在更改路徑之前發現並在之前的java.library.path中找到並加載了您的dll版本,會出現什麼情況。我想它會保持加載版本,而不是加載新版本。

如果您在受控環境中工作,您可能會忽略這些問題,但我鼓勵您找到其他解決方案。例如。告訴用戶使用簡單的安裝程序遠程安裝dll。

相關問題