如何在Java中设置unix动态库路径(LD_LIBRARY_PATH)?

时间:2012-12-03 14:12:32

标签: java linux unix

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

现在,我想从我的java代码中执行这个二进制文件。但是简单地在运行时执行export命令并没有做任何事情,当我从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>");

3 个答案:

答案 0 :(得分:5)

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

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

使用两个单独的Runtime.exec调用的方法将不起作用,因为您在第一个调用中创建的环境设置仅影响该特定Process,而不是通过单独调用{{1}启动的后续进程}}

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

LD_LIBRARY_PATH=... foo args

将使用修改后的foo

执行args程序LD_LIBRARY_PATH

或者你可以通过使用:

来利用子shell
(export LD_LIBRARY_PATH=...; foo args)