我可以找出当前平台上java.library.path映射到的变量吗?

到目前为止,我已经了解了有关java.library.path属性的以下内容:

  • 它在加载本机库时使用,而不是java类
  • 其默认值取决于操作系统:
    • 在Windows上,它映射到PATH
    • 在Linux上,它映射到LD_LIBRARY_PATH
    • 在OS X上,它映射到DYLD_LIBRARY_PATH

(如果我误解了上述任何一项,请纠正我)

我的动机:

我想从我设置的框架中修改Java应用程序看到的java.library.path的值,以调用Java应用程序。 我想这样做不是通过直接设置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}} 

这不是一个完全不合理的问题,但是没有好的答案,所以对后人来说,我会尝试解释你为何陷入困境,以及为什么它不起作用。

  1. 根本不保证从环境变量设置java.library.path 。 您可以使用-Djava.library.path=指定您想要的内容。 更有可能的是,这是你真正想做的事情。 这就是选项存在的原因。

  2. 事实certificate(至少在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 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,你的里程可能会有所不同

  3. 弄乱像这样的人的环境变量真是不太好。 它们用于整个shell,因此您要让用户在其环境中使用共享库,但有时仅限于此 。 更改java.library.path的唯一真正原因是添加本机库。 如果您正在使用本机库,那么您已经拥有特定于操作系统的代码(必须为平台编译,对吧?),因此您已经放弃了“没有特定于平台的边缘情况”的争夺。 最好的办法是将您的本机库放在系统路径(可能是任何可能的)已经找到它的位置,或者使用某种安装程序永久地将库的路径添加到它。 如果您不想做其中任何一项,那么我建议使用@ malat代码的变体,打印真正的java.library.path ,然后在脚本中附加您的路径到该结果,然后使用-D选项为实际程序运行设置它。

在我的linux机器上,这是我要做的:

 $ cat GetSystemProperty.java import java.util.Properties; import java.util.Enumeration; public class GetSystemProperty { public static void main(String args[]) { if( args.length == 0 ) { Properties p = System.getProperties(); Enumeration keys = p.keys(); while (keys.hasMoreElements()) { String key = (String)keys.nextElement(); String value = (String)p.get(key); System.out.println(key + " : " + value); } } else { for (String key: args) { System.out.println(System.getProperty( key )); } } } } $ javac GetSystemProperty.java $ java GetSystemProperty java.library.path /usr/lib/jvm/java-6-openjdk/jre/lib/amd64/server:/usr/lib/jvm/java-6-openjdk/jre/lib/amd64:/usr/lib/jvm/java-6-openjdk/jre/../lib/amd64:/usr/java/packages/lib/amd64:/usr/lib/jni:/lib:/usr/lib