【问题标题】:Java Make sure library is in path environment variableJava 确保库在路径环境变量中
【发布时间】:2015-02-11 11:44:16
【问题描述】:

我正在开发一个 Java 应用程序,它使用访问 Windows dll 的外部 jar 文件。如果我将 DLL 的路径放在 Windows 路径环境变量中,则应用程序运行良好,但我真的不想在部署此应用程序的每台机器上设置此 Windows 环境变量。有没有一种方法可以让我在不修改 Windows PATH 环境变量的情况下设置 Java 应用程序来定位 DLL?

谢谢!

【问题讨论】:

  • 你需要 .bat 文件来定义路径并启动你的 jvm 并让用户使用 .bat 文件来启动你的应用程序。
  • 遇到了类似的问题,我也想在jboss上部署一个SAR文件,不知道把那些.dll文件放在哪里

标签: java


【解决方案1】:

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);

请注意,这是一个非常肮脏的 hack,如果您尝试将它与不同的 JVM 一起使用或更新现有的 JVM,它可能会停止工作。

【讨论】:

  • 您的链接已失效。
【解决方案2】:

您也可以在启动时使用System.load("/absolute/path/to/mydll.dll")。 您需要提供 dll 的绝对路径,但不需要额外的 JVM 参数。

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 2021-12-07
    相关资源
    最近更新 更多