2015-02-11 50 views
2

我正在開發一個Java應用程序,它使用訪問Windows DLL的外部jar文件。如果我在Windows路徑環境變量中放入DLL的路徑,應用程序運行良好,但我並不想在每個部署此應用程序的計算機上設置此Windows環境變量。有沒有一種方法可以設置Java應用程序來查找DLL,而無需修改Windows PATH環境變量?Java確保庫在路徑環境變量

謝謝!

+0

您需要.bat文件,您可以在其中定義路徑並啓動您的jvm並讓用戶使用.bat文件啓動您的應用程序。 – SMA 2015-02-11 11:47:14

+0

有類似的問題,我也在尋找在jboss上部署一個SAR文件,不知道把這些.dll文件放在哪裏 – nobalG 2015-02-11 11:49:38

回答

0

JVM需要知道在哪裏可以找到本機庫。當你啓動應用程序,您可以設置該屬性java.library.path以包括路徑.dll文件是這樣的:

java -jar YourJar.jar -Djava.library.path=path/to/dll 

這意味着你將不得不寫某種發射器來啓動應用程序(一個簡單的.bat文件可能就夠了)。

當JVM啓動時,類加載器將緩存所有庫路徑,因此一旦應用程序運行後就不容易更改或添加路徑。
如果你真的不想要提供一個發射器,你可以使用反射來強制類加載器重新加載緩存在運行時,像這樣:

System.setProperty("java.library.path", "path/to/dll"); 

// forces the classloader to reload the cache the first time a native 
// library is being loaded 
final Field sysPathsField = ClassLoader.class.getDeclaredField("sys_paths"); 
sysPathsField.setAccessible(true); 
sysPathsField.set(null, null); 

要知道的事實,這是一個非常骯髒的黑客雖然並且如果您嘗試將其用於不同的JVM或更新現有的JVM,它可能會停止工作。

我在爲GameJam工作時需要在未知位置啓動時加載本機庫時想到了這件事。該特定片段可以找到on Github