2

我有一个二进制可执行文件(无源代码),它需要在终端中执行此命令 - 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>");
4

3 回答 3

5

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

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

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

于 2012-12-03T15:07:18.553 回答
3

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

于 2012-12-03T14:49:00.370 回答
1

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

LD_LIBRARY_PATH=... foo args

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

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

(export LD_LIBRARY_PATH=...; foo args)
于 2012-12-03T14:15:57.257 回答