当前位置: 首页 > 面试题库 >

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

颜君浩
2023-03-14
问题内容

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

问题答案:

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

  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上尝试过,您的里程可能会有所不同

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


 类似资料:
  • JUnit5是模块化的。 我理解一切都是基于平台模块(): Jupiter模块(API+引擎部件:+)和 Vitage模块(API+引擎部分:+和)都使用平台模块作为基础模块。 但是什么是平台发射器,什么时候需要它? 什么时候、为什么需要它,以及如何将它添加到?

  • 问题内容: 在库中有一个类,该类具有带有以下Java签名的方法: 从科特林看来,这是 是否有特定原因而不是平台类型? 我希望至少是因为在具有Kotlin源的项目中,在Java源中定义的具有相同签名的方法具有从Kotlin中看到的参数类型(甚至在不同的模块中定义,甚至从该模块的jar中导入!)。 同样,所描述的行为也导致与(具有相同类的)合法合法的参数发生冲突- 它们都被视为。如果有for ,那么就

  • 问题内容: 我知道我可以使用以下技术找出Java中的变量是否为空: 如果->太多工作 ->它告诉我哪一行引发异常 手动使用调试器->太慢 考虑以下代码行: 我想知道是否有一种通用的方法来以编程方式找出是什么变量(而不仅仅是行)在特定的代码区域中引发了NullPointerException。在示例中,知道 问题答案: 由于有可能导致空指针异常而无需涉及变量: 我不得不说,没有通用方法可以将空指针异

  • 需要找一些能下载到字体的平台,比如 Roboto, 思源黑体...或者其他一些免费(开源)字体,有没有什么网站能推荐的? 下载到的文件格式是 OTF

  • 我需要将一个项目列表映射到可观察的项目中,然后使用另一个函数处理每个可观察的项目flatmap,以将某个REST API调用的结果持久化到数据库中。 API调用将正确返回所有项。但是,FlatMapiteTable不会将所有项目传递给最后一个flatMap。 这是代码。 我不想使用doOnEach或doOnNext,我的问题是关于FlatMapiteTable的行为。 知道为什么我不能到达最后一张