无法为Java进程设置LD_LIBRARY_PATH

时间:2012-01-22 10:47:28

标签: java linux dll csh

我试图从shell脚本调用我的linux可执行文件。在调用此可执行文件之前,我想设置具有特定值的LD_LIBRARY_PATH。我的shell脚本如下:

Parent.sh(包含2行)

   - source set_env.sh 
   - executable.so

Set_env.sh

   - setenv LD_LIBRARY_PATH /proj/something

在从Linux控制台手动执行Parent.sh scipt时,调用executable.so并正确设置LD_LIBRARY_PATH。但在将其与java代码集成后:

String[] commandArray ={"Parent.sh"};
Runtime runtime = Runtime.getRuntime();
Process javap = runtime.exec(commandArray);
javap.waitFor();

没有为executable.so

设置LD_LIBRARY_PATH

我希望说明清楚:)

请在代码中告知错误。

2 个答案:

答案 0 :(得分:16)

沙丘的答案解决了你的问题,但我强烈建议在这种特殊情况下使用不同的方法。您应该在Java代码中执行此操作,而不是依赖shell来设置环境参数。这样您就不需要知道系统中存在哪些shell以及它们的语言是什么,它只适用于所有平台。

为此,您可以使用Runtime.exec(String[] cmd, String[] environment)重载(javadoc)。作为第二个参数,您可以传递一个包含子进程将看到的所有环境变量的数组。

ProcessBuilder API甚至更好一些:

ProcessBuilder pb = new ProcessBuilder("executable.so");
Map<String, String> env = pb.environment();
env.put("LD_LIBRARY_PATH", "/proj/something");
Process javap = pb.start();
javap.waitFor();

这样,子进程将从Java进程继承所有环境变量,并且还设置LD_LIBRARY_PATH变量。

答案 1 :(得分:1)

你确定子进程正在使用csh吗?如果它使用bash或其他东西启动,那么这将阻止脚本工作(但不会抛出IOException)。

你真的应该使用hashbang行作为脚本的第一行来说明你想要使用哪个shell解释器。

例如

#!/usr/bin/env csh