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

到目前为止,我已经了解了java.library.path属性的以下内容:
它用于加载本地库,而不是Java类。
其默认值取决于操作系统:
在Windows上,它映射到路径
在Linux上,它映射到ld_library_path
在OS X上,它映射到Dyd_库路径
(如果我误解了上述任何一点,请纠正我)
我的动机:
我想修改Java应用程序所看到的java. Labal.Poad的值。我不想直接设置java.library.path属性,而是修改它映射到的系统路径变量。我希望有一个干净的方法来做到这一点,没有丑陋的操作系统特定的代码,或者如果可能的话,去掉边缘案例。
我的问题:
有没有一种方法可以让本地Java实现什么环境变量javaLabaly.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,你的里程可能会有所不同
处理这样的环境变量真的不太好。它们被用于整个shell,因此您将向用户承诺在其环境中拥有共享库,但仅限于有时。更改java.library.path的唯一真正原因是添加本机库。如果您使用的是本机库,那么您已经有了特定于操作系统的代码(它必须为平台编译,对吗?)所以你已经放弃了“没有平台特定的边缘案例”的斗争。最好的做法是将您的本机库放在系统路径(无论是什么)已经找到它的地方,或者使用某种安装程序将您的库路径永久添加到它。如果您不想这样做,那么我建议您使用@malat's code的变体,打印realjava.library.path,然后将您的路径附加到脚本中的结果,然后使用-D选项将其设置为真正的程序运行。

本文翻译自 https://stackoverflow.com/questions/9551588/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 java java.library.path platform-independence


相关文章:

java - 设置java.library.path的替代方法?

java - OpenCV库加载在hadoop但不能正常工作

java - 以与平台无关的方式将环境变量传递给JVM

java - getAnnotations()为空,无法正常工作

java - 创建的名为``java}`的线程(即轻量级进程)是什么?

java - Java JDBC登录表单

java - 尝试获取授权令牌时出现未知的GoogleAuthException

java - 运行可执行Jar不会在java.library.path错误中抛出opencv_java310,但在IDE中可以正常运行

c++ - 独立于平台的并行化而无需更改框架?