【问题标题】:How to set a unix dynamic library path (LD_LIBRARY_PATH) in Java?如何在 Java 中设置 unix 动态库路径(LD_LIBRARY_PATH)?
【发布时间】:2012-12-03 14:12:32
【问题描述】:

我有一个二进制可执行文件(无源代码),它需要在终端中执行此命令 - export LD_LIBRARY_PATH = "" 以链接到我在目录中拥有的库 lbtiff.so.3。只有在我执行了这个导出命令后,我才能执行二进制文件,否则会报错——“加载共享库时出错:libtiff.so.3...

现在,我想从我的 java 代码中执行这个二进制文件。但是在运行时简单地执行导出命令并没有做任何事情,并且当我从 Java 执行二进制文件时,仍然会出现“error while ..”错误。我猜想通过 Java 可能无法设置 unix 特定的环境变量 LD_LIBRARY_PATH - 有没有办法可以从 Java 运行我的二进制文件并且它能够找到库?这是我当前的代码 -

Process p = Runtime.getRuntime().exec("bash -c export LD_LIBRARY_PATH=<lib path>");

p = Runtime.getRuntime().exec("<binary path>");

【问题讨论】:

    标签: java linux unix


    【解决方案1】:

    而不是Runtime.exec,使用ProcessBuilder。这将允许您在运行需要它们的二进制文件时指定环境变量

    ProcessBuilder pb = new ProcessBuilder("<binarypath>");
    pb.environment().put("LD_LIBRARY_PATH", "<libPath>");
    Process p = pb.start();
    

    您使用两个单独的 Runtime.exec 调用的方法将不起作用,因为您在第一个调用中所做的环境设置仅影响特定的 Process,而不影响由单独调用 Runtime.exec 启动的后续进程。

    【讨论】:

      【解决方案2】:

      请参阅my answer 了解另一个问题。最好的方法是不使用外部 shell 设置环境变量(您的代码不起作用,因为它不会全局设置变量,仅用于 bash 进程),而是从 Java 中设置变量。更容易并且可以工作(并且在所有平台上,无论安装了哪个 shell)。

      【讨论】:

        【解决方案3】:

        在 unix 系统上,您可以在执行命令之前添加变量

        LD_LIBRARY_PATH=... foo args
        

        将使用修改后的LD_LIBRARY_PATHargs 执行程序foo

        或者您可以通过以下方式利用子shell:

        (export LD_LIBRARY_PATH=...; foo args)
        

        【讨论】:

        • 在终端中工作,但在 Java 中,它将 LD_LIBRARY_PATH 作为可执行文件 - “无法运行程序“LD_LIBRARY_PATH= ...”
        • 这里是代码 Process p = Runtime.getRuntime().exec("LD_LIBRARY_PATH="+""+" "+"");
        • Runtime.getRuntime().exec("bash -c '(export LD_LIBRARY_PATH=&lt;lib path&gt;; &lt;binary path&gt;)'"); 呢?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-26
        • 2016-09-08
        • 2023-01-04
        • 1970-01-01
        • 1970-01-01
        • 2011-05-28
        相关资源
        最近更新 更多