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

时间:2012-03-04 01:46:50

标签: java java.library.path platform-independence

到目前为止,我已经了解了有关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}}

2 个答案:

答案 0 :(得分:16)

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

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

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

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

答案 1 :(得分:10)

在我的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