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 属性来做到这一点,而是通过修改它映射到的系统路径变量来做到这一点。我想要一种干净的方法来做到这一点,它没有丑陋的操作系统特定代码或尽可能省略边缘情况。

我的问题:

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

关于java - 我可以找出当前平台上的 java.library.path 映射到什么变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9551588/

相关文章:

java - 获胜者表 - 根据获胜者填写

eclipse - 如何让 Gradle 为 Eclipse 生成 java.library.path

java - 当我尝试运行 .jar 时,出现 java.library.path 中没有库的异常

operating-system - 程序如何执行?操作系统在哪里发挥作用?

python - 使用 Python 快速查找文件的独立于操作系统的方法

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

javascript - 如何从 JavaScript 客户端的 Spring Boot 端点流式传输媒体内容

java - 使库使用 jpa 注释而不依赖于任何实现

java - 如何在play Framework 2.3.x中访问子项目中的父项目类

abap - Eclipse : ABAP communication layer is not configured. .. java.library.path 中没有 sapjco3