到目前为止,我已经了解了有关 java.library.path 属性的以下内容:
- 在加载原生库时使用,而不是 java 类
- 其默认值取决于操作系统:
- 在 Windows 上,它映射到 PATH
- 在 Linux 上,它映射到 LD_LIBRARY_PATH
- 在 OS X 上,它映射到 DYLD_LIBRARY_PATH
(如果我对以上任何内容有误解,请纠正我)
我的动机:
我想从我为调用 Java 应用程序而设置的框架中修改 Java 应用程序看到的 java.library.path 的值。我不想通过直接设置 java.library.path 属性来做到这一点,而是通过修改它映射到的系统路径变量来做到这一点。我想要一种干净的方法来做到这一点,它没有丑陋的操作系统特定代码或尽可能省略边缘情况。
我的问题:
有没有办法询问本地Java实现java.library.path映射到什么环境变量?
然后,在一个 shell 脚本中,我可以写一些类似的东西:
path_var = get_library_path_variable # the magic function I want to call
${path_var} = /my/custom/path:${${path_var}}
最佳答案
这不是一个完全不合理的问题,但没有好的答案,所以为了后代,我会尝试解释为什么你被卡住了,为什么它不起作用。
java.library.path
根本不保证从环境变量中设置。您可以使用-Djava.library.path=
指定您想要的内容。这很可能是您真正想要做的。这就是存在该选项的原因。事实证明(至少在 Windows 上),您正在寻找的环境变量并不仅仅被随意使用。试试这个代码。
package com.stackoverflow; import java.util.Map; public class LibPathFinder { public static void main(String[] args) { String javaLibPath = System.getProperty("java.library.path"); Map<String, String> envVars = System.getenv(); System.out.println(envVars.get("Path")); System.out.println(javaLibPath); for (String var : envVars.keySet()) { System.err.println("examining " + var); if (envVars.get(var).equals(javaLibPath)) { System.out.println(var); } } } }
您会注意到,当它运行时,它打印的前两件事是不同的。如果Java 使用windows
PATH
变量,它首先会摆弄该值。我放弃了调查到底发生了什么。关键是,没有与java.library.path
完全匹配的环境变量。我没有在 Linux 或 OSX 上尝试过,您的里程可能会有所不同像这样弄乱别人的环境变量真的不是很好。它们用于整个外壳程序,因此您 promise 您的用户在他们的环境中拥有您的共享库,但仅有时。更改
java.library.path
的唯一真正原因是添加本地库。如果您使用的是 native 库,那么您已经拥有特定于操作系统的代码(它必须为平台编译,对吗?),所以您真的已经放弃了“没有特定于平台的边缘情况”的斗争。最好的办法是将您的 native 库放在系统路径(无论它可能是什么)已经找到它的地方,或者使用某种安装程序永久将您的库路径添加到它.如果您不想做任何这些事情,那么我建议使用@malat 代码的变体,打印真正的java.library.path
,然后将您的路径附加到该结果在您的脚本中,然后使用-D
选项将其设置为真正的程序运行。
关于java - 我可以找出当前平台上的 java.library.path 映射到什么变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9551588/