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

原文 标签 java java.library.path platform-independence

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

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

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

    我的动力:

    我想修改Java应用程序从我为调用Java应用程序而设置的框架中看到的java.library.path的值。我不想通过直接设置java.library.path属性来执行此操作,而是要修改它映射到的系统路径变量。我想要一种干净的方法来执行此操作,该方法没有丑陋的特定于OS的代码,或者在可能的情况下不包含边缘情况。

    我的问题:

    有没有办法询问本地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上尝试过,您的里程可能会有所不同
  • 弄乱这样的人的环境变量真的不是很好。它们用于整个外壳,因此您要使用户承诺在他们的环境中拥有共享库,但仅在某些时候。更改java.library.path的唯一真实原因是添加本机库。如果您使用的是本机库,那么您已经有特定于操作系统的代码(必须针对平台进行编译,对吗?),因此您实际上已经放弃了“无特定于平台的极端情况”的斗争。最好的办法是将本机库放在系统路径(无论可能是什么路径)已经找到的位置,或者使用某种安装程序将库的路径永久添加到该位置。如果您不想做任何一件事情,那么我建议您使用@malat代码的变体,打印真正的java.library.path,然后将路径附加到结果中的脚本中,然后使用-D选项将其设置为实际程序运行。
  • 相关文章:

    java - Java中与系统无关的计算机关闭

    java - Netbeans在构建(编译)之前运行一个进程

    java - 如何将多个服务放在一个类中,该类在Activity中实现Java Delegate接口

    java - 有多少个Java支持的平台?

    java - 本机方法和平台独立性

    c++ - 杰尼不工作

    java - SOLR是否会占用服务器上的大量内存?

    java - 为什么Java 8的Comparator.comparing()将返回值转换为Serializable?

    java - 有没有办法像Java Webstart中那样在JAR中包含本机库,而无需使用Webstart?

    eclipse - 在哪里为tomcat添加基于Apr的本机库?