【问题标题】:java.library.path not set correctly from runtime.exec/ProcessBuilder未从 runtime.exec/ProcessBuilder 正确设置 java.library.path
【发布时间】:2013-11-11 06:43:18
【问题描述】:

我有一个基于 java 的应用程序启动器,它使用 ProcessBuilder(也尝试过 Runtime.getRuntime().exec(new String[]{})通过命令启动另一个 java 应用程序。

当我手动运行命令时,它可以正常工作。游戏启动,没有错误。

java -jar -Djava.library.path="./lib/natives" mygame.jar

当从启动器运行相同的命令(带有绝对路径)时:

ProcessBuilder pb = new ProcessBuilder(
        "java",
        "-jar",
        "-Djava.library.path=\"" +nativesDirectory.getAbsolutePath() + "\"",
        applicationJar.getAbsolutePath());
pb.redirectErrorStream(true);
pb.directory(applicationDirectory);

我看到以下错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no lwjgl in java.library.path

我尝试了多种变体,但从 java 启动器运行时,该命令似乎永远无法正确设置库路径。

  1. 还有什么我可以尝试的吗?为什么该命令对我有用,但对启动器不起作用?我已经尝试过 ProcessBuilder,因为我担心文件路径中的空格可能会出现问题(尽管它周围有引号)

  2. 有没有更好的方法让我的应用程序指示/发现库/本机文件的位置,从而避免始终传递参数?

【问题讨论】:

  • 如果删除路径周围的引号会发生什么?引号由 shell 解析,在直接从 Java 生成进程时不需要。
  • 解决了它......圣牛。如果您想将此移至答案,我会标记它。我不敢相信我与之交谈过的任何人都没有提出过这样的建议,包括我自己。

标签: java process processbuilder


【解决方案1】:

或者,您可以通过 ProcessBuilder.environment() 将本机库的路径添加到 PATH 环境变量

【讨论】:

  • 谢谢,试一试,但没有任何改变。我将 natives 目录附加到现有路径,然后通过 pb.environment().put("PATH", fullPath); 添加它。我什至迭代了 pb.environment 地图来确认。启动时同样的错误。尝试了带引号和不带引号的路径。
【解决方案2】:

如果删除路径周围的引号会发生什么?引号由 shell 解析,在直接从 Java 生成进程时不需要。

【讨论】:

    猜你喜欢
    • 2011-04-29
    • 2011-10-14
    • 2010-10-31
    • 2014-08-25
    • 2014-07-25
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多