我正在开发一个Java应用程序,它使用访问Windows dll的外部jar文件。如果我在Windows路径环境变量中放置DLL的路径,应用程序运行正常,但我真的不想在我部署此应用程序的每台机器上设置此Windows环境变量。有没有办法设置Java应用程序来定位DLL而不修改Windows PATH环境变量?
谢谢!
答案 0 :(得分: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
答案 1 :(得分:0)
或者,您可以在启动时使用System.load("/absolute/path/to/mydll.dll")
。
您需要提供dll的绝对路径,但不需要额外的JVM参数。