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

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

答案 1

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

  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 变量,则它首先要摆弄值。我放弃了调查发生了什么。关键是,没有与 .我没有在Linux或OSX上试用,您的里程可能会有所不同PATHjava.library.path

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


答案 2

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

推荐