【问题标题】:Can't execute java program with php exec function无法使用php exec函数执行java程序
【发布时间】:2012-02-27 15:36:15
【问题描述】:

我正在尝试执行一个 java 程序来使用 php exec 函数对一个 pdf 文件进行签名,但它不起作用:

exec('java -jar PROGRAM.jar -n -t ORIGIN.pdf -o DESTINY.pdf -s CERTIFICATE -p PASSWORD', $output, $return);

当我执行它时,$output 是一个空数组,$return 是一个 int(1),但如果我运行:

java -jar PROGRAM.jar -n -t ORIGIN.pdf -o DESTINY.pdf -s CERTIFICATE -p PASSWORD

在命令行中它可以工作。谁能帮帮我?

谢谢。

【问题讨论】:

  • 如果您提供 java 二进制文件的完整路径,它是否有效?例如/usr/bin/java。使用which java 查找二进制文件的路径。
  • 除了@Treffynoon 的评论,您可能还需要指定 PROGRAM.jar、ORIGIN.pdf 和 DESTINY.pdf 文件的完整路径
  • 我只是使用文件和命令的完整路径并且不起作用。

标签: java php exec


【解决方案1】:

@Treffynnon 是对的。从命令提示符执行程序和从其他程序执行程序的区别在于环境变量和权限。

因此,首先检查运行 PHP 的服务器的用户是否有权运行应用程序并访问适当的文件。

然后验证路径

  1. java
  2. PROGRAM.jar
  3. ORIGIN.pdf
  4. 命运.pdf

您可能应该修改路径,即最好使用相对或绝对符号来指定它。这是因为当前工作目录在 2 种情况下可能不同。

祝你好运。

【讨论】:

    【解决方案2】:

    几乎可以肯定,PHP 不会知道“java”的路径。如果您在 Linux 中,请运行“which java”并将返回的整个 java 路径放入 exec 调用中,例如

    exec( '/usr/bin/java -jar PROGRAM.jar -n -t ORIGIN.pdf -o DESTINY.pdf -s CERTIFICATE -p PASSWORD', $output, $return);
    

    【讨论】:

      【解决方案3】:

      我终于可以解决问题了。

      解决办法是:

      exec('java -Djava.awt.headless=true -jar PROGRAM.jar -n -t ORIGIN.pdf -o DESTINY.pdf -s CERTIFICATE -p PASSWORD', $output, $return);
      

      添加 -Djava.awt.headless=true 选项是在告诉 java 它是间接调用,因此它无法控制键盘、鼠标等。

      【讨论】:

      • 嗨,这对我不起作用,我尝试了上面的代码,我仍然得到一个空数组作为结果
      猜你喜欢
      • 2015-09-19
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-21
      • 2015-07-13
      • 2013-03-13
      • 1970-01-01
      相关资源
      最近更新 更多