【问题标题】:Symfony JAVA_HOME not setSymfony JAVA_HOME 未设置
【发布时间】:2020-07-01 20:11:50
【问题描述】:

尝试通过 Symfony 运行 signal-cli 时出现错误:

JAVA_HOME 未设置,在您的 PATH 中找不到“java”命令。请在您的环境中设置 JAVA_HOME 变量以匹配您的 Java 安装位置。

工作目录中echo $JAVA_HOME的输出:

/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-0.fc31.x86_64/jre

工作目录中java -version的输出:

openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-b09)
OpenJDK 64-bit Server VM (build 25.252-b09, mixed mode)

我正在尝试找出解决该错误的方法。这是我的代码:

public function list()
{
  $list = new Process(['.././signal-cli-0.6.8/bin/signal-cli']);
  $list->run();

   if (!$list->isSuccessful()) {
       throw new ProcessFailedException($list);
    }
    echo $list->getOutput();
 }
}

【问题讨论】:

  • 您在运行任何 Java 代码(即 Hello World)时是否遇到同样的错误?
  • 不,它说“sh:/home/user/test/Java/HelloWorld.class:无法执行二进制文件:执行格式错误sh:/home/user/test/HelloWorld.class:成功"

标签: java laravel symfony fedora


【解决方案1】:

来自文档(强调我的):

除了显式传递的环境变量外,进程还会继承您的系统中定义的所有环境变量。您可以通过将要删除的环境变量设置为 false 来防止这种情况 [...]

来源:https://symfony.com/doc/current/components/process.html#setting-environment-variables-for-processes

我相信这意味着您的用户/shell 的环境变量在那一刻并不重要,您可能必须明确设置:

 $process = new Process(['...'], null, ['ENV_VAR_NAME' => 'value']);

无论如何,您可以编写一个小脚本,将env/printenv 的结果写入文件以供进一步检查。很可能存在很大差异,因为您的 shell 运行了许多影响环境的额外脚本,这些脚本既不会转发也不会为您的进程运行。

因此您可能必须像上面暗示的那样将 JAVA_HOME 显式传递给进程(这是一个非常具体的主路径,):

$process = new Process(['...'], null, [
     'JAVA_HOME' => '/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-0.fc31.x86_64/jre', 
]);

【讨论】:

  • 感谢您的帮助。我让 Symfony 只打印环境变量,它们是:“PWD=/home/user/test/public”和“SHLVL=0”
  • 请注意,将 $JAVA_HOME 变量传递给 Symfony 进程修复了该进程。 (例如 [$JAVA_HOME => '../path/to/java/'])
【解决方案2】:

似乎执行您的 php 应用程序的进程是以不包含 JAVA_HOME 环境变量的用户身份执行的。

我的意思是当您在 linux CLI 中执行以下命令时:

echo $JAVA_HOME

结果很好,因为环境变量是为你的linux用户设置的。

但是当你通过 Symfony 调用 signal-cli 时,使用的不是你的 linux 用户,而是执行你的 web 服务器的进程的用户。

也许你使用 apache 作为 web 服务器,那么用户就是“apache”或“www-data”之类的东西。

那么在 apache 的情况下,您必须将环境变量传递给虚拟主机:

<VirtualHost yourhostname:80>
   ...
   SetEnv VARIABLE_NAME variable_value
   ...
</VirtualHost>

或者您可以按照here的规定进行操作

如果是其他 Web 服务器,解决方案会略有不同,但概念是相同的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 2020-12-21
    • 2012-02-08
    相关资源
    最近更新 更多